From e0f9eca69a920f63f205b20644902062f4b425dc Mon Sep 17 00:00:00 2001 From: Mao Nakamoto <41178744+maonakamoto@users.noreply.github.com> Date: Wed, 26 Aug 2026 02:24:33 +0200 Subject: [PATCH 1/2] =?UTF-8?q?chore(git):=20ignore=20agent=20worktrees=20?= =?UTF-8?q?globally=20=E2=80=94=202=20repos=20were=20missed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `.claude/worktrees/` was added to 21 repos' .gitignore one at a time, plus 2 .git/info/exclude entries that no other checkout and no reviewer can see. Two repos never got it: solon and ai-ration. Solon then sat in the stranded-work report for five days over an empty directory. That is precisely the case this file's own header describes — scratch that my tooling creates in every repo I touch — and precisely the failure it predicts: "18 diffs, 18 reviews, and a 19th repo that gets missed." One line here covers both stragglers and every repo that does not exist yet. The 21 existing .gitignore lines are left alone; they are redundant now but harmless, and 21 PRs to delete a line each is the churn this avoids. Co-Authored-By: Claude Opus 5 --- .config/git/ignore | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.config/git/ignore b/.config/git/ignore index 3f86ce2..06948f5 100644 --- a/.config/git/ignore +++ b/.config/git/ignore @@ -11,3 +11,13 @@ # 9 repos this way and left 2 of them permanently dirty — and a permanently # dirty tree is what lets genuinely stranded work hide in the noise. .playwright-mcp/ + +# Per-session agent worktrees. `_claude_autoworktree_enter` creates these in +# whatever repo a session opens in, so the set of affected repos is "all of +# them, eventually" — which is the test at the top of this file. +# +# It was done the other way first: 21 repos got a .gitignore line, 2 got a +# .git/info/exclude (machine-local, so invisible to review and to every other +# checkout), and 2 were missed — leaving solon reported as stranded work for +# five days over an empty directory. That is the 19th-repo problem, measured. +**/.claude/worktrees/ From faf4901b3becee9e988bda5049a4b954ddd5e49e Mon Sep 17 00:00:00 2001 From: Mao Nakamoto <41178744+maonakamoto@users.noreply.github.com> Date: Wed, 26 Aug 2026 02:26:44 +0200 Subject: [PATCH 2/2] chore(git): ignore the FleetCrown hook family, not one member of it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FleetCrown rewrites its hooks into .claude/hooks/ on every startup — the files say so themselves. `fleetcrown-capture.sh` was ignored; `fleetcrown-session-end.sh` appeared later and was not, leaving this tree dirty for ten days. A permanently dirty tree is exactly where genuinely stranded work hides, which is the whole premise of the guard two commits up. Match `fleetcrown-*.sh` so the next generated hook is covered before it exists. Co-Authored-By: Claude Opus 5 --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6313533..bbb3575 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,13 @@ __pycache__/ *.pyc .claude/hooks/dangerous-commands.log -.claude/hooks/fleetcrown-capture.sh + +# FleetCrown rewrites its own hooks here on every startup ("Do not edit; Fleet +# Runner rewrites this file", says the file). Only fleetcrown-capture.sh was +# listed, so when a second generated hook appeared this tree went permanently +# dirty — and a permanently dirty tree is where genuinely stranded work hides. +# Match the family, not the member. +.claude/hooks/fleetcrown-*.sh # Per-session agent worktrees — scratch, never part of the repo. .claude/worktrees/