From 9ce770c9c8eafa8092903e26a898d9d5b1263344 Mon Sep 17 00:00:00 2001 From: Lior Date: Thu, 28 May 2026 06:53:45 -0400 Subject: [PATCH 1/4] claim: codex-loop-bash-retirement-inventory-guard-20260528 - bash-retirement guard maintenance Co-Authored-By: Codex Codex-Origin: codex-launchd-loop Codex-Surface: codex-background-service Codex-Loop-Run-Id: 20260528T105110Z --- ...-bash-retirement-inventory-guard-20260528.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md diff --git a/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md b/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md new file mode 100644 index 0000000000..30412fa8eb --- /dev/null +++ b/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md @@ -0,0 +1,17 @@ +# Claim - codex-loop-bash-retirement-inventory-guard-20260528 + +- **Session ID:** codex/launchd-loop +- **Harness:** codex +- **Claimed at:** 2026-05-28T10:53:14Z +- **ETA:** 2026-05-28T11:20:00Z +- **Scope:** Maintain the TypeScript/Bun bash-retirement inventory guard with one bounded drift-detection slice. +- **Durable target:** tools/hygiene/check-bash-retirement-inventory.ts, tools/hygiene/check-bash-retirement-inventory.test.ts, docs/trajectories/typescript-bun-migration/RESUME.md +- **Platform mirror:** none + +## Notes + +- surface: codex-background-service +- origin: codex-launchd-loop +- run-id: 20260528T105110Z +- trajectory: docs/trajectories/typescript-bun-migration/RESUME.md +- assumption: no open Codex/Vera PR needed action; the backlog runner selected the bash-retirement inventory guard maintenance lane. From 77be9e8afe77297c9071dadcedd2dc5dd821464c Mon Sep 17 00:00:00 2001 From: Lior Date: Thu, 28 May 2026 08:25:28 -0400 Subject: [PATCH 2/4] fix(hygiene): detect uppercase shell inventory extensions Treat shell-family file extension detection as case-insensitive so tracked .SH/.BASH/.ZSH/.KSH/.COMMAND files cannot bypass the bash-retirement guard. Update the TS/Bun trajectory wording and coverage. Co-Authored-By: Codex Codex-Origin: codex-launchd-loop Codex-Surface: codex-background-service Codex-Loop-Run-Id: 20260528T122248Z --- docs/trajectories/typescript-bun-migration/RESUME.md | 11 ++++++----- tools/hygiene/check-bash-retirement-inventory.test.ts | 10 ++++++++++ tools/hygiene/check-bash-retirement-inventory.ts | 3 ++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/trajectories/typescript-bun-migration/RESUME.md b/docs/trajectories/typescript-bun-migration/RESUME.md index e07b9bd921..f259d53462 100644 --- a/docs/trajectories/typescript-bun-migration/RESUME.md +++ b/docs/trajectories/typescript-bun-migration/RESUME.md @@ -52,11 +52,12 @@ bun run hygiene:check-bash-retirement-inventory The expected retained surface is the explicit repo-wide allowlist: setup and bootstrap scripts, host-service wrappers, NixOS installer scripts, dev-cluster wrappers, launchd-bootstrap, and the Kiro loop wrapper. Any new -non-Lean shell-family file (`.sh`, `.bash`, `.zsh`, `.ksh`, or `.command`) -outside the allowlist is bash-retirement drift. Executable dotted-name files -with shell-family shebangs are also entrypoints and are classified as drift; -non-executable dotted documentation fixtures with shell-looking first lines stay -outside the retained-shell inventory. +non-Lean shell-family file (`.sh`, `.bash`, `.zsh`, `.ksh`, or `.command`, +including uppercase extension variants) outside the allowlist is +bash-retirement drift. Executable dotted-name files with shell-family shebangs +are also entrypoints and are classified as drift; non-executable dotted +documentation fixtures with shell-looking first lines stay outside the +retained-shell inventory. ### Bucket A — Should stay Shell (21 files) diff --git a/tools/hygiene/check-bash-retirement-inventory.test.ts b/tools/hygiene/check-bash-retirement-inventory.test.ts index bd07ba342b..837dc34d7c 100644 --- a/tools/hygiene/check-bash-retirement-inventory.test.ts +++ b/tools/hygiene/check-bash-retirement-inventory.test.ts @@ -196,10 +196,15 @@ describe("buildInventoryReport", () => { mkdirSync(join(repo, "scripts"), { recursive: true }); mkdirSync(join(repo, "tools", "lean4"), { recursive: true }); writeFileSync(join(repo, "scripts", "a.sh"), "#!/usr/bin/env bash\n"); + writeFileSync(join(repo, "scripts", "a-uppercase.SH"), "echo uppercase extension drift\n"); writeFileSync(join(repo, "scripts", "b.bash"), "#!/usr/bin/env bash\n"); + writeFileSync(join(repo, "scripts", "b-uppercase.BASH"), "echo uppercase extension drift\n"); writeFileSync(join(repo, "scripts", "c.zsh"), "#!/usr/bin/env zsh\n"); + writeFileSync(join(repo, "scripts", "c-uppercase.ZSH"), "echo uppercase extension drift\n"); writeFileSync(join(repo, "scripts", "d.ksh"), "#!/usr/bin/env ksh\n"); + writeFileSync(join(repo, "scripts", "d-uppercase.KSH"), "echo uppercase extension drift\n"); writeFileSync(join(repo, "scripts", "e.command"), "#!/usr/bin/env bash\n"); + writeFileSync(join(repo, "scripts", "e-uppercase.COMMAND"), "echo uppercase extension drift\n"); writeFileSync(join(repo, "scripts", "extensionless-bash"), "#!/usr/bin/env bash\n"); writeFileSync(join(repo, "scripts", "extensionless-bash-env-s"), "#!/usr/bin/env -S bash -eu\n"); writeFileSync(join(repo, "scripts", "extensionless-dash"), "#!/bin/dash\n"); @@ -214,11 +219,16 @@ describe("buildInventoryReport", () => { expect(trackedNonLeanShellFilesFromGit(repo)).toEqual([ "scripts/a.sh", + "scripts/a-uppercase.SH", "scripts/b.bash", + "scripts/b-uppercase.BASH", "scripts/c.zsh", + "scripts/c-uppercase.ZSH", "scripts/d.ksh", + "scripts/d-uppercase.KSH", "scripts/dotted-shell-entry.env", "scripts/e.command", + "scripts/e-uppercase.COMMAND", "scripts/extensionless-bash", "scripts/extensionless-bash-env-s", "scripts/extensionless-dash", diff --git a/tools/hygiene/check-bash-retirement-inventory.ts b/tools/hygiene/check-bash-retirement-inventory.ts index c39f50213e..af8d919812 100644 --- a/tools/hygiene/check-bash-retirement-inventory.ts +++ b/tools/hygiene/check-bash-retirement-inventory.ts @@ -210,7 +210,8 @@ function parseTrackedGitFile(entry: string): TrackedGitFile | undefined { } function isTrackedShellFamilyFile(repoRoot: string, file: string, executable: boolean): boolean { - if (SHELL_FILE_EXTENSIONS.some((extension) => file.endsWith(extension))) return true; + const lowerFile = file.toLowerCase(); + if (SHELL_FILE_EXTENSIONS.some((extension) => lowerFile.endsWith(extension))) return true; if (basename(file).includes(".") && !executable) return false; const firstLine = readFirstLine(join(repoRoot, file)); From 086917591ba42ad326d85b53c674c1cb571f5f51 Mon Sep 17 00:00:00 2001 From: Lior Date: Thu, 28 May 2026 08:25:48 -0400 Subject: [PATCH 3/4] release: codex-loop-bash-retirement-inventory-guard-20260528 - open PR Release the headless Codex claim after landing the uppercase shell-extension inventory guard slice in this branch. Surface: codex-background-service. Origin: codex-launchd-loop. Run-Id: 20260528T122248Z. Co-Authored-By: Codex Codex-Origin: codex-launchd-loop Codex-Surface: codex-background-service Codex-Loop-Run-Id: 20260528T122248Z --- ...-bash-retirement-inventory-guard-20260528.md | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md diff --git a/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md b/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md deleted file mode 100644 index 30412fa8eb..0000000000 --- a/docs/claims/codex-loop-bash-retirement-inventory-guard-20260528.md +++ /dev/null @@ -1,17 +0,0 @@ -# Claim - codex-loop-bash-retirement-inventory-guard-20260528 - -- **Session ID:** codex/launchd-loop -- **Harness:** codex -- **Claimed at:** 2026-05-28T10:53:14Z -- **ETA:** 2026-05-28T11:20:00Z -- **Scope:** Maintain the TypeScript/Bun bash-retirement inventory guard with one bounded drift-detection slice. -- **Durable target:** tools/hygiene/check-bash-retirement-inventory.ts, tools/hygiene/check-bash-retirement-inventory.test.ts, docs/trajectories/typescript-bun-migration/RESUME.md -- **Platform mirror:** none - -## Notes - -- surface: codex-background-service -- origin: codex-launchd-loop -- run-id: 20260528T105110Z -- trajectory: docs/trajectories/typescript-bun-migration/RESUME.md -- assumption: no open Codex/Vera PR needed action; the backlog runner selected the bash-retirement inventory guard maintenance lane. From b30f01004ffaa3304b13bcb00527ca3e19def839 Mon Sep 17 00:00:00 2001 From: Lior Date: Thu, 28 May 2026 08:36:06 -0400 Subject: [PATCH 4/4] docs: refresh TS/Bun resume timestamp Address Copilot review on PR #5787 by updating the edited trajectory resume metadata. Co-Authored-By: Codex Codex-Origin: vera-desktop-loop Codex-Surface: desktop-heartbeat Codex-Loop-Run-Id: 20260528T123316Z --- docs/trajectories/typescript-bun-migration/RESUME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/trajectories/typescript-bun-migration/RESUME.md b/docs/trajectories/typescript-bun-migration/RESUME.md index f259d53462..6947ff7daa 100644 --- a/docs/trajectories/typescript-bun-migration/RESUME.md +++ b/docs/trajectories/typescript-bun-migration/RESUME.md @@ -6,7 +6,7 @@ **Next concrete action**: Maintain the bash-retirement inventory guard and treat any newly tracked non-Lean shell-family file outside the allowlist as drift. Do not revive the old Cluster G/H/I or budget-cluster port queues. -**Last updated**: 2026-05-27T17:48Z +**Last updated**: 2026-05-28T12:35Z ## Why this trajectory exists