權限一律用無副作用試寫判定,不採信 API permissions 欄位(inkstone/ISEP#120)

派工共通規定(dispatch-and-reply-format.md §2,dispatch-format-guard 每次派工自動注入)
新增第 10 條:判斷「能不能寫進某個 repo」用 `git push --dry-run` 這種無副作用試寫,
不採信 API 的 permissions 欄位——它會回 push:false 卻推得進去
(2026-09-01 實錯 inkstone/Arcrun#190 comment 5805:拿 permissions.push=false
去叫 leo 加協作者,實際推得進去)。並把失敗分成掛住(傳輸)/被拒(權限)/
找不到(不存在)三種,混成「不行」會往錯方向查(同票 comment 5821)。

- §2.1 附完整實測與理由(不進注入,只是背景)
- 掃過現存閘與腳本:零命中——沒有一支用 API permissions 欄位判寫入權限;
  唯一的 permissions 字樣是 Claude Code 自己的 permissions.allow 白名單,另一件事
- dispatch-format-guard.test.sh ⑦b 驗那條規定真的被注入(52→53)
- 用 env -u CLAUDE_CODE_CHILD_SESSION 跑;subagent 環境殘留會假紅(TESTING 已註記)

改到會被注入的內容 ⇒ 待總管定版

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TGxitYq49FzYC7EFkbhzF5
This commit is contained in:
2026-09-18 17:57:21 +00:00
parent ebe71e3283
commit 0999effcfc
4 changed files with 88 additions and 2 deletions
+8 -2
View File
@@ -1177,14 +1177,20 @@ bash hooks/tests/ask-user-question-guard.live.test.sh
```
bash hooks/tests/dispatch-format-guard.test.sh
```
**該看到**`52/52 通過``inkstone/ISEP#88` 之前是 33 條;本頁一度寫 19,那是更早的數字,
**沒有人回頭改** —— 同一個病,只是換一欄)。**離線、不打網路、不花錢**——這支閘是純結構判斷,沒有語意判官,
**該看到**`53/53 通過``inkstone/ISEP#88` 之前是 33 條`#113` 是 52 條;
本頁一度寫 19,那是更早的數字,**沒有人回頭改** —— 同一個病,只是換一欄)。
**離線、不打網路、不花錢**——這支閘是純結構判斷,沒有語意判官,
所以它不需要像 A10 那樣另開一支 live 測試量準度,**每次結果都一樣**。
🔴 **在 subagent 裡跑會假紅**`CLAUDE_CODE_CHILD_SESSION=1` 殘留時,回覆那條路(DE 群)
會被當成子 session 全放行 ⇒ 12 條該擋的變 exit=02026-09-18 實撞)。前面加 `env -u CLAUDE_CODE_CHILD_SESSION` 再跑。
**失敗**
- A 群任何一條紅 ⇒ **誤攔**。合規的派工只有一行票號,擋掉它等於整台機器派不了工
- ⑦ 紅 ⇒ **共通規定沒有被注入**。這是「派工單只剩票號」能成立的前提:
交件方式、不准 push main、org 是 `inkstone` 這些不必有人記得寫,機器每次都補。
它壞了不會有人立刻發現——派工照樣送出去,只是收工方**不知道要貼回原票**
- ⑦b 紅 ⇒ **§2 第 10 條沒被注入**`inkstone/ISEP#120`):收工方拿不到「用試寫判寫入權限、
別信 API 的 permissions 欄位」+「掛住/被拒/找不到」三種失敗形狀,就會再犯 09-01 那次
(拿 `permissions.push=false` 去叫 leo 加協作者,而其實推得進去)
- ⑨ 紅 ⇒ 真跡放行了。那份測資是**真的發生過的那一次派工**(見 `hooks/tests/fixtures/README.md`
- ⑰ 紅 ⇒ 訊息被 shell 展開了(同 A9 ⑩b 那個病:閘照擋,但它教人怎麼解的那兩行變成空白),
**或出路又印回相對路徑的 `scripts/ticket`**`inkstone/ISEP#113`):收工方 cwd 常是