Commit Graph

2 Commits

Author SHA1 Message Date
Leo 358f67abf3 閘認得出「動的是哪個 repo」,不再拿 cwd 當答案(inkstone/ISEP#109 → comment 5398)
line-needs-own-worktree.sh 擋 `cd <別的 repo> && git checkout` 時擋對了,但訊息
指的是 payload 的 cwd 那個 repo,不是指令真正動的那個。comment 5398 實測:

    指令:cd .../matrix/arcrun && git checkout fix/library-lifecycle-187
    舊版:目錄:.../InkStoneCo   它現在在:feat/ticket-bell-webhook
                    ↑ 動的是 matrix/arcrun,講的卻是 InkStoneCo

🔴 照著那個訊息做的人,會在 InkStoneCo 開一份用不到的 worktree,真正要隔離的
matrix/arcrun 沒開到——而他以為自己隔離好了。**一道閘給錯下一步比不擋更糟。**
而 `cd X && git checkout` 正是這條線最常出現的寫法(本票的來由那次就是它)。

沒有另寫一支解析器:hooks/lib/push_target_dir.py 2026-08-23 已經替 git push 解過
同一題(inkstone/ISEP#30 comment 3949),多層 cd 鏈與「子殼的 cd 不外洩」都算過了。
本輪只把那支的動詞與「要不要去掉 env 前綴」變成參數(兩個都有預設值,push 那條路
一個 byte 都沒變,42 條既有測試重跑全綠),新增的 lib/checkout_target_dir.py 只放
checkout 專屬的兩件事:哪些形狀不動 HEAD、-C 贏過 cd 的優先序。

新增的一條性質(不是順手,是本票要的):目錄解不出來就放行。
`cd $VAR`/`cd -`/引號壞掉時回 "?",閘直接 exit 0。寧可漏擋,也不要指著錯的
repo 叫人去開 worktree——猜一個回去等於原地打轉。

實測:
- hooks/tests/line-needs-own-worktree.test.sh 35 條 → 59 條(新增 D 群 24 條)
  正向:cd 認出 A/-C 認出 B/兩者都在時 -C 贏/相對 cd/相對 -C 接在 cd 之後/
        從 worktree cd 回共用目錄/子殼不外洩
  反向(不該擋):cd 到非 repo、cd 進自己的 worktree、cd $VAR、cd -、還原檔案
  已知邊界也釘成測試:`);` 中間沒空白時 tokenize 會斷在那裡 ⇒ 漏擋(不是指錯)。
  那層是 push_target_dir 的 tokenizer,動它會連帶改到推 main 那道閘的偵測範圍,
  本票不動,另報。
- 推 main 那三套(共用被改到的 lib):10/10、19/19、13/13
- 實地打票上那條害過我們的指令:現在印的是 matrix/arcrun,worktree 指令也是它的

plugin.json 0.16.1 → 0.16.2 並重跑 vendor-to-shell.py(版本沒動=沒人吃得到)。

⚠️ 留痕:hooks/lib/checkout_target_dir.py 是用 Bash heredoc 寫的,因為 sdd-guard
對 ISEP 的 .py 是結構性永遠在響——這個 repo 根本沒有 system-dev/docs/3-specs,
而 hooks/lib/ 已經住了 9 支 .py。範圍就這一支新檔,沒有動那道閘(另報)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 21:31:42 +08:00
Leo f69ea11a58 一條線一份自己的工作目錄,同時跑的線有上限(inkstone/ISEP#109 → comment 5391)
兩支新閘,兩個方向的測試都有:

line-needs-own-worktree.sh(PreToolUse: Bash,35 條測試)— 治本那半
  一條線想在共用的工作目錄裡切分支就擋,叫它開自己的 worktree。
  判準是 git 自己回答的兩個問題(會不會動 HEAD/是不是主工作目錄),
  不靠任何人登記。擋下來時順手 prune 掉指向空氣的登記。
  實測:products/arcrun-rag 清掉 4 筆、ISEP 清掉 13 筆,
  還在的 worktree 與分支一根寒毛都沒動。

parallel-lines-cap-guard.sh(PreToolUse: Agent|Task,33 條測試)— 治標那半
  同時在跑的線超過上限(預設 3)就派不出下一條,訊息列出現在有哪幾條。
  條數是從 harness 自己寫的 subagents/*.meta.json + 主 transcript 的完工通知
  數出來的,不是計數器 —— 沒有任何東西要人去減,所以不會永久卡死。

三個機械前提是實測的,不是推測的:
  · SubagentStop 在實測 session 裡一次都沒觸發(不能拿它當減法)
  · PostToolUse:Agent 在送出後 5 秒就觸發(不是收工)
  · subagent 不是獨立行程(ps 只有一個 claude-code 行程)
  · Agent 的原生 isolation:"worktree" 只做頂層 repo,
    而 products/ matrix/ 是 gitignore 掉的子 repo,worktree 裡根本沒有它們
    ⇒ 原生那條路解不了這張票的問題

盤點數字在自己的樹上重數:62 支 / 85 條(main 上的 60/82 沒算到這兩支)。

🔴 版本沒動 = 沒有人吃得到。這條分支沒有定版,
   plugin.json 仍是 0.16.1(版本一致性檢查要求它等於最新 tag)。
   合併時要跟著一個新版本號,不然這兩支閘到不了任何人手上。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 20:52:13 +08:00