fix: 白名單認的是「哪個 repo」不是路徑前綴(inkstone/ISEP#117)
照 `line-needs-own-worktree.sh` 印的下一步開 worktree(`<repo>-wt-<票號>/`), 接著在裡面寫檔會被 `guard-cross-project.sh` 擋——它的白名單是路徑前綴, `matrix/arcrun-wt-195/…` 對不上 `matrix/arcrun/*`。 ⇒ 照規矩做的人被擋,留在共用目錄裡的人反而過得了(inkstone/Arcrun#195 實撞, 工人只好把 worktree 開到 InkStoneCo 樹之外躲開它)。 判準改成 git 自己算得出來的事實,跟 line-needs-own-worktree 同一個形狀: `git worktree list --porcelain` 第一筆永遠是主工作目錄 ⇒ 主目錄與它所有的 worktree 回同一個答案。`-wt-` 這個命名慣例一個字都沒有進判準。 名單上沒有的 repo、它的 worktree、根本不是 repo 的目錄,全部照舊擋。 順帶修掉一個獨立的缺陷(實測證據見檔內註解與 wiki): 這支閘在 plugin 裡**從來沒生效過**。它用 `<hook 檔>/../..` 當頂層 repo 根, 搬進 plugin 之後那個路徑指到 plugin cache 的上一層 ⇒ 每一次都靜默放行。 同一份 payload:plugin 那份 exit 0、InkStoneCo 那份 exit 2,而兩個檔案 diff 一字不差。 改用 `$CLAUDE_PROJECT_DIR`(README 路徑規約本來就這樣寫)。 🔴 這也代表:本輪的修法要生效,`InkStoneCo/.claude/hooks/guard-cross-project.sh` 那份現役副本必須退場(刪檔+從 settings.json 取消註冊)——那是頂層的樹, 不在本 PR 裡,交回總管裁。 測試:scripts/test-guard-cross-project.sh(docs/TESTING.md A25)21 條, 真的 git repo + 真的 worktree 當道具,放行 12 條/該擋 9 條兩個方向都驗。 不新增第三支閘。 版本號待總管定版。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+31
-1
@@ -129,7 +129,7 @@ python3 scripts/pr-verdict merge inkstone/ISEP#71 --dry-run
|
||||
```
|
||||
bash hooks/tests/countdown-guard.test.sh
|
||||
```
|
||||
**該看到**:`通過 20 條,失敗 0 條`。**全程離線**:時鐘用 `ISEP_COUNTDOWN_NOW` 定住、
|
||||
**該看到**:`通過 21 條,失敗 0 條`。**全程離線**:時鐘用 `ISEP_COUNTDOWN_NOW` 定住、
|
||||
狀態走 `ISEP_COUNTDOWN_STATE_DIR`,不打網路、不碰 `$HOME`。
|
||||
|
||||
**它在守什麼**(`inkstone/ISEP#63`,leo 2026-08-27):
|
||||
@@ -515,6 +515,36 @@ D 群同時釘住反面:認不出來(`cd $VAR`、`cd -`、cd 到不是 repo
|
||||
- ① 紅 ⇒ 連總管在自己的目錄裡切分支都被擋。那不是嚴格,那是把共用目錄的主人趕出去
|
||||
- ㉞㉟ 紅 ⇒ `prune` 做錯了。㉞是沒清掉說謊的登記;**㉟是把還在的 worktree 也弄掉了,那是災難**
|
||||
|
||||
### A25 — 照 A24 開出來的 worktree,不會被跨專案閘擋下:21 條
|
||||
```
|
||||
bash scripts/test-guard-cross-project.sh
|
||||
```
|
||||
**該看到**:`通過 21 條,失敗 0 條`。離線,自己開一棵真的樹(頂層 repo + 4 顆子 repo
|
||||
+ 3 份真的 linked worktree),跑完自動刪掉。
|
||||
|
||||
**它在守什麼**(inkstone/ISEP#117,`inkstone/Arcrun#195` 實撞):
|
||||
A24 那支閘印出來的下一步是 `worktree add <PARENT>/<NAME>-wt-<票號>`,
|
||||
而這支閘的白名單原本是**路徑前綴**比對 ⇒ `matrix/arcrun-wt-195/…` 不符合 `matrix/arcrun/*`
|
||||
⇒ **照 A24 的指示做的人被擋,留在共用目錄裡的人反而過得了**。
|
||||
工人當時只能把 worktree 開到 InkStoneCo 樹之外躲開它——**閘把人逼去繞路,那條規矩就等於沒有**。
|
||||
|
||||
修法:白名單比對的是「這個路徑**屬於哪個 repo**」——`git worktree list --porcelain`
|
||||
第一筆永遠是主工作目錄,主目錄與它所有的 worktree 回同一個答案。
|
||||
`-wt-` 這個命名慣例**一個字都沒有出現在判準裡**(不靠名字=改名字也騙不過去)。
|
||||
|
||||
**失敗**:
|
||||
- ★ 那 6 條任一紅:
|
||||
- 放行那 4 條紅 ⇒ 今天這個誤攔會再發生一次
|
||||
- 「不在名單的 repo,它的 worktree」/「名字像 worktree、其實是空目錄」紅
|
||||
⇒ 判準從「git 回答的事實」滑回「名字看起來像」——那是黑名單的反面,一樣不可靠
|
||||
- 「該擋」那 9 條任一紅 ⇒ 為了修誤攔把該擋的放掉了
|
||||
- 「迴歸」那 5 條任一紅 ⇒ 動到了跟本輪無關的既有規則(`.md` 一律放行、頂層自己的檔)
|
||||
|
||||
**這支測試自己的誠實邊界**:它用 `CLAUDE_CODE_CHILD_SESSION=0` 代表「總管」。
|
||||
真機上那個變數**不可靠**——`InkStoneCo/system-dev/wiki/ops-facts.md` 記著實測:
|
||||
Claude Desktop 的總管主 session 也是 `1`。⇒ 這裡驗的是**閘的分支邏輯**,
|
||||
不是「總管在真機上一定會被擋」。那是另一件事,本輪沒有動它。
|
||||
|
||||
### A5 — 開票前的搜尋是跨 repo 的
|
||||
```
|
||||
python3 scripts/ticket where 標籤 模組化
|
||||
|
||||
Reference in New Issue
Block a user