worktree 閘:heredoc 的 body 是資料不是指令,並把 inkstone/ISEP#125 的驗收表 A–F 寫成測試

#125 缺陷 D/E(09-02 兩次實地命中):用 heredoc 寫一份內含 `cd <目錄> && git checkout X` 示範的
說明文件,整條指令沒有 git 操作卻被擋。沿用 lib/strip_heredoc.py(D20 閘同一支)先剝 body 再解析。
A–F 六條照票上期望值進 hooks/tests/(A–E 0、F 2)。
(76) 把 tokenize 層「換行被當空白吞掉」寫成已知邊界測試(舊閘同樣 exit=0,漏擋不是誤攔,與 (53) 同層,另報)。
A24:69→77。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
This commit is contained in:
isep-hand
2026-09-07 06:35:28 +00:00
parent 49a7145e70
commit 95c6fee199
4 changed files with 59 additions and 4 deletions
+11 -3
View File
@@ -624,11 +624,11 @@ bash hooks/tests/parallel-lines-cap-guard.test.sh
`PostToolUse:Agent` 在**送出後 5 秒**就觸發(不是收工);
subagent **不是獨立行程**`ps` 只有一個 claude-code 行程,所以數行程數不到線)。
### A24 — 一條線要有自己的工作目錄:69
### A24 — 一條線要有自己的工作目錄:77
```
bash hooks/tests/line-needs-own-worktree.test.sh
```
**該看到**`69/69 通過`。離線,每個案例自己開**兩顆**真的 git repo +一份真的 linked worktree。
**該看到**`77/77 通過`。離線,每個案例自己開**兩顆**真的 git repo +一份真的 linked worktree。
**E 群在守什麼**comment 65872026-09-07 補):**閘印出來的那條出路要真的走得通。**
閘訊息教的是 `WORKTREE_OK=1 git -C … checkout …`,舊版讀的卻是 hook 自己的環境變數——PreToolUse hook
@@ -637,6 +637,12 @@ bash hooks/tests/line-needs-own-worktree.test.sh
`echo WORKTREE_OK=1; git checkout`、前綴掛在別的指令上、值不是 1、寫在 commit 訊息裡,四種都照擋。
修之前拿新測試跑舊閘:(60)(63)(68) 三條紅,其餘全綠——紅的那三條就是真的改到的。
**F 群**是 `inkstone/ISEP#125` 票上原文的驗收表 AF((70)–(75),期望值照票:AE 要 0、**F 要 2**)。
D/E 是「用 heredoc 寫一份內含 `cd <目錄> && git checkout X` 示範的文件」被當成在切分支(09-02 兩次實地命中),
現在先用 `lib/strip_heredoc.py` 剝掉 body 再解析(跟 D20 閘同一支 helper)。(76) 是寫成測試的已知邊界:
tokenize 層把換行當空白吞掉,`…EOF⏎git checkout main` 從第一版起就看不到(漏擋不是誤攔,與 (53) 同層,另報);
(77) 是它的對照組(換成分號就擋)。
**D 群在守什麼**comment 53982026-08-29 補):不只要擋對,還要**說得出是哪一個 repo**。
舊版一律拿 payload 的 `cwd` 當答案,於是 `cd <別的 repo> && git checkout` 擋是擋對了,
訊息卻指著 `cwd` 那個 repo ⇒ 照著做的人會在**錯的 repo** 開一份用不到的 worktree
@@ -655,6 +661,8 @@ D 群同時釘住反面:認不出來(`cd $VAR`、`cd -`、cd 到不是 repo
- ㉞㉟ 紅 ⇒ `prune` 做錯了。㉞是沒清掉說謊的登記;**㉟是把還在的 worktree 也弄掉了,那是災難**
- (63) 紅 ⇒ 閘印的出路又走不通了——被擋的人不會停下來修閘,他會去找繞過去的方法(6587 當天就是)
- (64)–(67) 任一紅 ⇒ 出路退化成關鍵字:印個字就能過,閘等於沒有
- (75) 紅 ⇒ **閘廢了**#125 原話):剝 heredoc 剝過頭,真的切也放行
- (76) 紅 ⇒ tokenize 那層被改了,回頭跑 (53) 與推 main 的 1019 條
### A25 — `sdd-guard` 退役了,而且退乾淨了:8 條
```
@@ -1243,7 +1251,7 @@ B2(信標那行)/B3(setup 輸出)/B4(閘的訊息)三個畫面
| **A12 留言身份欄(兩道門)** | 總管 | ✅ 11/112026-08-27 |
| **A23 同時跑的線有上限** | isep-guard | ✅ 33/332026-08-29inkstone/ISEP#109 |
| **A24 一條線要有自己的工作目錄** | isep-guard | ✅ 35/352026-08-29inkstone/ISEP#109→5391 |
| **A24 出路那一行原樣餵回去走得通** | isep-hand | ✅ 69/692026-09-07inkstone/ISEP#109→6587)+真路徑實跑(薄殼 cwd、`-C ISEP`:擋→印的那行→放行)+舊閘實跑 3 條紅 |
| **A24 出路那一行原樣餵回去走得通#125 AF** | isep-hand | ✅ 77/772026-09-07inkstone/ISEP#109→6587#125)+真路徑實跑(薄殼 cwd、`-C ISEP`:擋→印的那行→放行)+舊閘實跑 3 條紅 |
| **A39 D20 閘看 push 實際會推的 repo** | isep-hand | ✅ 26/262026-09-07inkstone/ISEP#109→6629)+真路徑實跑(薄殼 cwd:`-C InkStoneCo` 放行、裸 `git push origin` 擋)+舊閘實跑 7 條紅(4 誤攔+3 漏擋) |
| **A26 雲端憑證清單這台拿得到** | isep-hand | ✅ 11/112026-09-01inkstone/ISEP#115→5526554155425577)+兩條「該紅」方向實跑 |
| **A16 放行的門真的打得開** | 總管 | ✅ 17/172026-08-28inkstone/ISEP#90 |