From 13e62ef7037b94b3fdf5a6c458a52f1663f7ddae Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:56:27 +0800 Subject: [PATCH 1/6] docs(issues): record four findings from the #2270 Part A session, and close the Dev Drive inventory Four immutable inbox requests plus one update, all queued for a later reconcile; no canonical ledger edit here. - verify:phone-chrome can exit 0 having run no browser tests at all when its changed-file selector resolves to nothing phone-chrome-affecting. Caught while running the A2 gates: the bare invocation reported success having executed only two docs checks. - tests/gate-receipts.test.ts carries two chmod-based assertions that cannot pass on the Windows ReFS Dev Drive, so every local npm run test is permanently two-red and verify:pr-local stops before build. - The Claude push-format-guard hook blocks all pushes from linked worktrees, because it compares core.hooksPath against the worktree root rather than the common git dir, then fails on a git-ignored file. - Seven registered worktree directories are empty while remaining the cwd of seven live sessions. #6GW95D is updated with the completed fleet inventory: 208 checkouts, 92 registered worktrees and 116 separate clones across eight roots, 9.30 GB of landed candidates. Cleanup is deferred indefinitely by owner decision after a removal pass was halted and fully reverted. Co-Authored-By: Claude Opus 5 --- .../2a4e6a53-2fc9-4142-8d8f-e259cb985593.json | 14 ++++++++++++++ .../7f369171-54d4-4076-92b8-bf44aab3511d.json | 14 ++++++++++++++ .../a5310065-4f20-4036-8992-bc94f7e7e7d2.json | 14 ++++++++++++++ .../b7b5fb83-303c-43d4-89dd-228c03bb820e.json | 13 +++++++++++++ .../b7d514e3-a9e4-4178-a210-53ee730de680.json | 14 ++++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 docs/outstanding-issues-inbox/2a4e6a53-2fc9-4142-8d8f-e259cb985593.json create mode 100644 docs/outstanding-issues-inbox/7f369171-54d4-4076-92b8-bf44aab3511d.json create mode 100644 docs/outstanding-issues-inbox/a5310065-4f20-4036-8992-bc94f7e7e7d2.json create mode 100644 docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json create mode 100644 docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json diff --git a/docs/outstanding-issues-inbox/2a4e6a53-2fc9-4142-8d8f-e259cb985593.json b/docs/outstanding-issues-inbox/2a4e6a53-2fc9-4142-8d8f-e259cb985593.json new file mode 100644 index 0000000000..1bd51984a9 --- /dev/null +++ b/docs/outstanding-issues-inbox/2a4e6a53-2fc9-4142-8d8f-e259cb985593.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "2a4e6a53-2fc9-4142-8d8f-e259cb985593", + "createdOn": "2026-08-22", + "action": "add", + "payload": { + "pri": "P3", + "type": "issue", + "summary": "tests/gate-receipts.test.ts has two file-mode assertions that can never pass on the Windows workstation, so npm run test is permanently 2-red locally", + "detail": "Measured 2026-08-22. 'gate receipts - file modes (Codex review, PR #2216)' has two cases that call chmodSync(path, 0o755) and then assert the computed input signature changed: 'changes the signature when only the WORKING-TREE mode changes' (line 160) and 'keeps both modes, so one cannot cancel the other' (line 170). The primary workstation is a Windows ReFS Dev Drive with core.fileMode=false, where chmod is a silent no-op, so the working-tree mode never changes and the signatures collide. Reproduced on an unmodified main at 73b1e71a0 with a clean working tree for those files: Tests 2 failed | 32 passed (34). Also seen inside a full local suite run as Tests 2 failed | 7728 passed | 72 skipped (7802). CI is Linux so it stays green there, which is why this has not surfaced before. Cost: every local npm run test and every verify:pr-local exits non-zero on this machine, which both hides real regressions in the noise and stops verify:pr-local before it reaches build, bundle-budget and the RAG fixture checks. Suggested fix: skip the two cases when the filesystem cannot represent an exec bit (probe once by chmod-ing a temp file and re-statting, rather than testing process.platform), keeping the index-mode half of the coverage which does work. See also the related exec-bit trap already documented in AGENTS.md under 'Claude Code hook scripts'.", + "source": "session 2026-08-22, GitHub issue #2270 Part A", + "issueUlid": "01M0MN541C8RWZSM07NEPHT2E1" + } +} diff --git a/docs/outstanding-issues-inbox/7f369171-54d4-4076-92b8-bf44aab3511d.json b/docs/outstanding-issues-inbox/7f369171-54d4-4076-92b8-bf44aab3511d.json new file mode 100644 index 0000000000..af691ed0bf --- /dev/null +++ b/docs/outstanding-issues-inbox/7f369171-54d4-4076-92b8-bf44aab3511d.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "7f369171-54d4-4076-92b8-bf44aab3511d", + "createdOn": "2026-08-22", + "action": "add", + "payload": { + "pri": "P3", + "type": "issue", + "summary": "The Claude push-format-guard hook blocks every push from a linked worktree, because it compares core.hooksPath against the worktree root instead of the common git dir", + "detail": "Measured 2026-08-22 pushing from D:/Repos/Database/.claude/worktrees/. .claude/hooks/push-format-guard.sh only intends to act when the repository pre-push hook is NOT wired. It computes repo_root from CLAUDE_PROJECT_DIR (the linked worktree) and compares the resolved core.hooksPath against repo_root/.githooks. In a linked worktree core.hooksPath is the absolute path of the MAIN checkout's .githooks (D:/Repos/Database/.githooks), which never equals /.githooks, so the guard concludes the push is unguarded even though .githooks/pre-push is present and executable and does in fact run. It then performs a whole-tree prettier --check, which additionally flags git-IGNORED files: the only offender was .claude/settings.local.json, untracked and matched by a global gitignore, so it could not possibly be part of any push. Net effect: pushes from worktrees are blocked on a file that cannot be committed, and the documented CLAUDE_ALLOW_UNFORMATTED_PUSH=1 escape only works as the LEADING token of the whole shell command, so the natural 'cd && CLAUDE_ALLOW_... git push' form silently fails to unlock it. Two fixes, both small: resolve the repo root with git rev-parse --path-format=absolute --git-common-dir (or compare against the common dir's parent) so a linked worktree is recognised as guarded; and restrict the fallback prettier check to tracked files (git ls-files) so ignored local state can never block a push. Related but distinct from the already-merged claude/push-guard-hookspath-relative work, which fixed relative and case-folded hooksPath values but not the worktree case.", + "source": "session 2026-08-22, GitHub issue #2270 Part A", + "issueUlid": "01M0MN5THMCXS06TK1K80367VM" + } +} diff --git a/docs/outstanding-issues-inbox/a5310065-4f20-4036-8992-bc94f7e7e7d2.json b/docs/outstanding-issues-inbox/a5310065-4f20-4036-8992-bc94f7e7e7d2.json new file mode 100644 index 0000000000..78c6d0bf0d --- /dev/null +++ b/docs/outstanding-issues-inbox/a5310065-4f20-4036-8992-bc94f7e7e7d2.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "a5310065-4f20-4036-8992-bc94f7e7e7d2", + "createdOn": "2026-08-22", + "action": "add", + "payload": { + "pri": "P2", + "type": "issue", + "summary": "verify:phone-chrome can report a green pass having run zero browser tests when its changed-file selector finds no phone-chrome-affecting path", + "detail": "Measured 2026-08-22 while running the A2 browser gates for issue #2270. Invoked bare on a clean main checkout, verify:phone-chrome derived its inputs from the working-tree diff, found only one untracked docs/outstanding-issues-inbox JSON, printed 'Note: No phone-chrome-affecting file was detected; only prerequisite checks were selected', ran docs:check-index and docs:check-links, and exited 0. Nothing browser-related executed, yet the exit code is indistinguishable from a full pass. This is the exact false-green class that AGENTS.md's evidence rule exists to catch: exit 0 alone is not proof. Reporting that run as 'verify:phone-chrome green' would have been wrong. The real gate only engaged after passing an explicit --files list of the merged Dictionary scope (git diff --name-only 66594ddc1^1..main filtered to src/ and tests/ui-), which then selected lock-parity, runtime, contracts, focused-browser and full-ui and produced 133 contract tests, 12 focused phone journeys and 473 Chromium tests, all green. Suggested fix: when the selector resolves to zero phone-chrome-affecting inputs, print the conclusion as a distinct non-proof outcome (a named skip, or a non-zero advisory code) rather than an unqualified exit 0, so a caller cannot mistake 'nothing selected' for 'everything passed'.", + "source": "session 2026-08-22, GitHub issue #2270 Part A", + "issueUlid": "01M0MN4HFYX76T8AQWNK5EJ75G" + } +} diff --git a/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json b/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json new file mode 100644 index 0000000000..cac83c72d6 --- /dev/null +++ b/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json @@ -0,0 +1,13 @@ +{ + "version": 2, + "id": "b7b5fb83-303c-43d4-89dd-228c03bb820e", + "createdOn": "2026-08-22", + "action": "update", + "payload": { + "id": "#6GW95D", + "pri": "P3", + "detail": "UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed, and 7 more could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.", + "source": "session 2026-08-22, GitHub issue #2270 Part A", + "baseRowFingerprint": "8f90caf18d6739560ea60b190fe0154ce1c0e955737ff3eb5fbf3b54d697d799" + } +} diff --git a/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json b/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json new file mode 100644 index 0000000000..0d43c1e09a --- /dev/null +++ b/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "b7d514e3-a9e4-4178-a210-53ee730de680", + "createdOn": "2026-08-22", + "action": "add", + "payload": { + "pri": "P3", + "type": "issue", + "summary": "Seven live Claude Code sessions point at worktree directories that are completely empty, so those chats have no working copy to act on", + "detail": "Measured 2026-08-22 while taking the fleet worktree inventory for #6GW95D. Seven registered worktree directories under .claude/worktrees contain zero regular files: caring-contacts-phase-2a-a4f69a, database-test-queue-contention-6baedb, developer-button-settings-fb9b51, ed-care-plans-impl-7f44cd, phase-4-index-restoration-b0f4ea, vibrant-diffie-c93450 and wave-1-canary-s2-unlock-17d673. Each is the recorded cwd of an existing session in the session registry, titled respectively Suicide, Dev Drive, Developer, Care Plan, Database, Ward Flow and RAG; the Database one was still marked running. They were already empty before this session touched anything (the inventory counted files first and only then attempted removal, and all seven then refused with EPERM because a live process holds the directory handle open, so nothing was deleted from them here). No git history is at risk: every branch still exists at its recorded head. Impact is that resuming any of those chats operates on an empty directory. Cheap fix per directory once the holding process is closed: git -C D:/Repos/Database worktree add , then node scripts/setup-codex-worktree.mjs inside it to restore dependencies by byte-identical copy (about 90 seconds, not an hour-long npm ci). Worth understanding the cause before repairing them - something is emptying worktree contents while leaving the directory registered and locked, which is the same failure family as the 2026-08-21 data-loss incident recorded against #XCAX01.", + "source": "session 2026-08-22, GitHub issue #2270 Part A", + "issueUlid": "01M0MN6FQHRDBT2SDVK5GDRBBP" + } +} From b32a8be1f66318a9c84b327f61ea564c0a4d6110 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 22 Aug 2026 13:10:22 +0000 Subject: [PATCH 2/6] Regenerate outstanding-issues snapshot for the 5 new inbox requests This PR adds five immutable inbox request records but did not regenerate data/outstanding-issues-snapshot.json, so npm run check:outstanding-issues (the "Outstanding-issues ledger integrity" required static-pr job) failed with counts.pending: committed 32 vs regenerated 37. Fixed by running node scripts/generate-outstanding-issues-snapshot.mjs, which is the exact command check-outstanding-issues-snapshot.mjs's own failure message names. No canonical ledger edit (docs/outstanding-issues.md is untouched, as intended -- these five requests still reconcile later via npm run issues:reconcile from a dedicated ledger branch). Verified: npm run check:outstanding-issues passes end to end, snapshot now "in step with data/outstanding-issues-snapshot.json (78 open, 37 pending)". npx prettier --check data/outstanding-issues-snapshot.json passes. No executable code changed, so no lint/typecheck/test/build gate applies to this change specifically. RAG impact: none. Co-Authored-By: Claude Sonnet 5 --- data/outstanding-issues-snapshot.json | 34 +++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index b35932a907..39756cbe83 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -2,7 +2,7 @@ "version": "outstanding-issues-snapshot-v1", "ledger_revision": { "sha": "2327bd9624d788a7b9ecb61eee494f1acd9a1997", - "committed_at": "2026-08-22T06:11:46Z" + "committed_at": "2026-08-22T06:11:46+00:00" }, "counts": { "open": 78, @@ -10,7 +10,7 @@ "p2": 43, "p3": 33, "queued": 11, - "pending": 32, + "pending": 37, "resolved": 359 }, "queue": [ @@ -877,6 +877,12 @@ "summary": "#1YPV51: detail → PARTIAL PROGRESS 2026-08-22, NOT a clinical sign-off. The sign-off block in docs/medication-interaction-lexicon-review.md is deliberately still empty and the document still reads Status: UNREVIEWED, because a Clinical Lead read of the 37-term sheet has still not happened. What DID happen: the owner reviewed seven specific questions raised from the report and one real defect was found and fixed. FIXED: loperamide was resolving as a member of the opioids term because the selector matches the substring Opioid and the catalogue classifies it Peripheral Opioid Agonist. It is P-gp-restricted at therapeutic doses and does not contribute to the sedation and respiratory-depression rows that term drives (35 of 36 rows CRITICAL or HIGH). It is now deny-listed alongside naltrexone and naloxone, which were already excluded for the same class of reason. Proven, not asserted: regenerating the index with and without the change alters 35 medications, removes loperamide as a counterparty from every one of them, adds nothing anywhere, and leaves resolvedRows/unresolvedRows/rowsWithCatalogueTarget unchanged at 392/133/440. FOUR OTHER CHANGES WERE PROPOSED AND WITHDRAWN after reading the implementation: adding moclobemide to maois, removing atomoxetine from snris, folding the Z-drugs into benzodiazepines, and splitting antihistamines by sedation. All four would have overridden deliberate catalogue classifications (moclobemide is subclass RIMA not MAOI; atomoxetine is subclass SNRI (Non-stimulant); zolpidem and zopiclone are class Sedative subclass Z-Drug) or broken a term's meaning. The sedation concern they were aimed at is carried by the cns-depressants term, which is kind: mechanism and deliberately unenumerable, so it warns on no specific drug by design. TWO QUESTIONS REMAIN FOR THE OWNER, both catalogue-level rather than lexicon-level: (1) should moclobemide's RIMA classification make it fire serotonergic interaction warnings alongside the irreversible MAOIs; (2) is atomoxetine correctly classed SNRI for interaction purposes. STILL OPEN: the full clinical read. Do not close this row without explicit owner confirmation that the review was actually carried out.", "created_at": "2026-08-22" }, + { + "request_id": "2a4e6a53-2fc9-4142-8d8f-e259cb985593", + "action": "add", + "summary": "tests/gate-receipts.test.ts has two file-mode assertions that can never pass on the Windows workstation, so npm run test is permanently 2-red locally", + "created_at": "2026-08-22" + }, { "request_id": "2b98cd3b-a7be-454b-a819-9d6a42d52423", "action": "done", @@ -961,6 +967,12 @@ "summary": "No gate can detect a React Server Component boundary violation: a component with an event handler and no \"use client\" throws only at request time", "created_at": "2026-08-21" }, + { + "request_id": "7f369171-54d4-4076-92b8-bf44aab3511d", + "action": "add", + "summary": "The Claude push-format-guard hook blocks every push from a linked worktree, because it compares core.hooksPath against the worktree root instead of the common git dir", + "created_at": "2026-08-22" + }, { "request_id": "993f7ca7-5277-4399-82fc-19ff981823e4", "action": "update", @@ -979,6 +991,12 @@ "summary": "Cancel request 3552c196-bf4f-49c8-a39b-28f8876d8caf: Duplicate done request created by overlapping command completion; retain 4bc642e9-5fba-4b43-90e8-407fe2c11408.", "created_at": "2026-08-21" }, + { + "request_id": "a5310065-4f20-4036-8992-bc94f7e7e7d2", + "action": "add", + "summary": "verify:phone-chrome can report a green pass having run zero browser tests when its changed-file selector finds no phone-chrome-affecting path", + "created_at": "2026-08-22" + }, { "request_id": "afaa753b-41ae-4bee-8c63-89c649cdcfd5", "action": "done", @@ -991,6 +1009,18 @@ "summary": "Cancel request 4f754fec-20c4-4ca8-8e07-0d948089eaf1: Duplicate done request created by overlapping command completion; retain eeac3580-2340-415d-824f-e31c23d8e2f7.", "created_at": "2026-08-21" }, + { + "request_id": "b7b5fb83-303c-43d4-89dd-228c03bb820e", + "action": "update", + "summary": "#6GW95D: detail → UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed, and 7 more could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.; priority → P3; source → session 2026-08-22, GitHub issue #2270 Part A", + "created_at": "2026-08-22" + }, + { + "request_id": "b7d514e3-a9e4-4178-a210-53ee730de680", + "action": "add", + "summary": "Seven live Claude Code sessions point at worktree directories that are completely empty, so those chats have no working copy to act on", + "created_at": "2026-08-22" + }, { "request_id": "c4984226-e979-4e43-842e-0ff4f6cd006a", "action": "done", From 18da457a5dedf3b915ba8f6cba36799714a8f948 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:55:10 +0800 Subject: [PATCH 3/6] chore: preserve content From 44b1e711c2da7187521e2c41f731e976e4152dbb Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:55:36 +0800 Subject: [PATCH 4/6] fix(issues): correct worktree recovery command --- .../b7d514e3-a9e4-4178-a210-53ee730de680.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json b/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json index 0d43c1e09a..bd81a7b803 100644 --- a/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json +++ b/docs/outstanding-issues-inbox/b7d514e3-a9e4-4178-a210-53ee730de680.json @@ -7,7 +7,7 @@ "pri": "P3", "type": "issue", "summary": "Seven live Claude Code sessions point at worktree directories that are completely empty, so those chats have no working copy to act on", - "detail": "Measured 2026-08-22 while taking the fleet worktree inventory for #6GW95D. Seven registered worktree directories under .claude/worktrees contain zero regular files: caring-contacts-phase-2a-a4f69a, database-test-queue-contention-6baedb, developer-button-settings-fb9b51, ed-care-plans-impl-7f44cd, phase-4-index-restoration-b0f4ea, vibrant-diffie-c93450 and wave-1-canary-s2-unlock-17d673. Each is the recorded cwd of an existing session in the session registry, titled respectively Suicide, Dev Drive, Developer, Care Plan, Database, Ward Flow and RAG; the Database one was still marked running. They were already empty before this session touched anything (the inventory counted files first and only then attempted removal, and all seven then refused with EPERM because a live process holds the directory handle open, so nothing was deleted from them here). No git history is at risk: every branch still exists at its recorded head. Impact is that resuming any of those chats operates on an empty directory. Cheap fix per directory once the holding process is closed: git -C D:/Repos/Database worktree add , then node scripts/setup-codex-worktree.mjs inside it to restore dependencies by byte-identical copy (about 90 seconds, not an hour-long npm ci). Worth understanding the cause before repairing them - something is emptying worktree contents while leaving the directory registered and locked, which is the same failure family as the 2026-08-21 data-loss incident recorded against #XCAX01.", + "detail": "Measured 2026-08-22 while taking the fleet worktree inventory for #6GW95D. Seven registered worktree directories under .claude/worktrees contain zero regular files: caring-contacts-phase-2a-a4f69a, database-test-queue-contention-6baedb, developer-button-settings-fb9b51, ed-care-plans-impl-7f44cd, phase-4-index-restoration-b0f4ea, vibrant-diffie-c93450 and wave-1-canary-s2-unlock-17d673. Each is the recorded cwd of an existing session in the session registry, titled respectively Suicide, Dev Drive, Developer, Care Plan, Database, Ward Flow and RAG; the Database one was still marked running. They were already empty before this session touched anything (the inventory counted files first and only then attempted removal, and all seven then refused with EPERM because a live process holds the directory handle open, so nothing was deleted from them here). No git history is at risk: every branch still exists at its recorded head. Impact is that resuming any of those chats operates on an empty directory. Cheap fix per directory once the holding process is closed: git -C D:/Repos/Database worktree add -f (the forced add restores a path that remains registered to that branch), then node scripts/setup-codex-worktree.mjs inside it to restore dependencies by byte-identical copy (about 90 seconds, not an hour-long npm ci). Worth understanding the cause before repairing them - something is emptying worktree contents while leaving the directory registered and locked, which is the same failure family as the 2026-08-21 data-loss incident recorded against #XCAX01.", "source": "session 2026-08-22, GitHub issue #2270 Part A", "issueUlid": "01M0MN6FQHRDBT2SDVK5GDRBBP" } From 67f153808f450ae242fe62179efcf94266571014 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:55:37 +0800 Subject: [PATCH 5/6] fix(issues): reconcile worktree recovery counts --- .../b7b5fb83-303c-43d4-89dd-228c03bb820e.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json b/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json index cac83c72d6..1f4290c7b9 100644 --- a/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json +++ b/docs/outstanding-issues-inbox/b7b5fb83-303c-43d4-89dd-228c03bb820e.json @@ -6,7 +6,7 @@ "payload": { "id": "#6GW95D", "pri": "P3", - "detail": "UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed, and 7 more could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.", + "detail": "UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed. Separately, seven registered empty worktree directories could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.", "source": "session 2026-08-22, GitHub issue #2270 Part A", "baseRowFingerprint": "8f90caf18d6739560ea60b190fe0154ce1c0e955737ff3eb5fbf3b54d697d799" } From 5b1c1168e5d296c9b72928c7bb70923ee53615d6 Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 22 Aug 2026 21:55:39 +0800 Subject: [PATCH 6/6] chore(issues): refresh outstanding issues snapshot --- data/outstanding-issues-snapshot.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index 39756cbe83..6b598abfb6 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -2,7 +2,7 @@ "version": "outstanding-issues-snapshot-v1", "ledger_revision": { "sha": "2327bd9624d788a7b9ecb61eee494f1acd9a1997", - "committed_at": "2026-08-22T06:11:46+00:00" + "committed_at": "2026-08-22T06:11:46Z" }, "counts": { "open": 78, @@ -1012,7 +1012,7 @@ { "request_id": "b7b5fb83-303c-43d4-89dd-228c03bb820e", "action": "update", - "summary": "#6GW95D: detail → UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed, and 7 more could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.; priority → P3; source → session 2026-08-22, GitHub issue #2270 Part A", + "summary": "#6GW95D: detail → UPDATE 2026-08-22 (fleet inventory COMPLETE; cleanup deliberately DEFERRED by the owner). The inventory this row asked for is done and the 253 figure is superseded by a measured one. Scanning eight roots (.claude/worktrees, D:/Worktrees, .codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex, AppData/Local/Temp) found 208 checkouts of this repository. Of those, 92 are registered git worktrees of D:/Repos/Database and 116 are SEPARATE FULL CLONES with their own object databases (76 under .codex, 26 under .copilot, 13 under Documents/Codex, 1 under Temp). Zero unregistered worktrees and zero stale gitdir pointers - every checkout pointing at the main repo is properly registered, so scripts/clean-worktree.mjs sees all of them. 54 carry node_modules. 18 non-checkout leftover directories sit under .claude/worktrees; 12 of them held zero files and were removed. Separately, seven registered empty worktree directories could not be removed because a live process holds them (filed separately). npm run clean:worktree --merged --squashed --dry-run identified 23 landed candidates totalling 9.30 GB (C: 4.74 GB across 11, D: 4.56 GB across 12), of which 12 are proven-or-corroborated and 11 are 'NOT fully corroborated' and are skipped by the tool's own safety re-verification. CAPACITY IS NOT THE ISSUE: D: is 80 GB with 53 GB free (35% used). DECISION 2026-08-22: the owner halted the removal mid-run and all 13 removed worktrees were restored (branch, head and clean tree verified individually; dependencies restored by byte-identical copy). Five live chats had had their working directory deleted underneath them. Cleanup is therefore DEFERRED indefinitely - do not resume it without an explicit fresh instruction naming the exact paths. Two process lessons for whoever does: a 'git refused' or EPERM removal means a live process holds that directory and is a STOP, never something to retry on a later pass; and the candidate list must be shown and approved before any deletion, not after. The 116 separate clones, not the worktrees, are the real disk mass and none of them is covered by clean-worktree.mjs at all.; priority → P3; source → session 2026-08-22, GitHub issue #2270 Part A", "created_at": "2026-08-22" }, {