PR 不再躺著:收工時清點沒有結論的 PR,並讓「給結論」是一個動作(inkstone/ISEP#81)
實查(2026-08-27):inkstone org 有 7 個 open PR,最久的三個躺了兩星期 (Arcrun#104 15 天、Arcrun#116 14 天、arcrun-rag#91 14 天), 而 v0.9.0 的 46 支閘一支都沒有在管 PR。票看起來「已交付」, 東西卻沒進 main ⇒ 沒進版本 ⇒ leo 手上永遠不會出現它。 新增 hooks/pr-verdict-guard.sh(Stop,F 組) open、沒有人被指派、也沒有 REQUEST_CHANGES review 的 PR ⇒ 擋一次並點名 (含開了幾天與網址);merge 了但 head 分支還留著的一起點名 ——票上寫死「merge → 併完當場刪掉那條 branch」,分支還在=結論只給了一半。 🔴 票上點名要避開的錯路(ISEP v0.6.0 divergence §B4): 「佇列非空即 block」會讓總管永遠停不下來。所以擋的是遺忘,不是等待—— ① 有人被指派/掛 Human ⇒ 不點名(棒子在他手上,是 Gitea 原生欄位不是措辭) ② 有 REQUEST_CHANGES review ⇒ 結論給過了,球在對方腳下 ③ 這一回合碰過它 ⇒ 不點名 ④ 響過就退讓:每個 PR 各自 1→4→8→16 「碰過」不讀任何一句話:① updated_at 跟上次收工比變了(外部系統的事實) ② 上次收工時還不存在(剛開出來,不在誕生的回合開罵) ③ 這回合的 tool call 出現它的識別碼(接住「結論寫在票上」這種合法結論)。 ③ 不是關鍵字黑名單——黑名單拿措辭來「擋」,這裡拿識別碼來「放行」, 比對錯了只會少擋一次。leo 2026-08-17 證偽的是前者。 刻意只掛 Stop 不掛 SubagentStop:給 PR 結論是總管的權,subagent 連 main 都不准推。 新增 scripts/pr-verdict —— merge/reject/changes 各是一個動作 merge 併 + 刪分支 + **當場複驗分支真的不見了**(下了刪除指令 ≠ 它被刪掉) reject 理由寫進票 + 關 PR + 刪分支 changes 修改要求寫進票 + 留 REQUEST_CHANGES(讓「給過結論」變成閘查得到的事實) list / --dry-run(按下去之前先看會打哪幾通 API,一通都不送出) 測試 hooks/tests/pr-verdict-guard.test.sh:52 條全過,離線走 fixture, 不打 Gitea、不開測試 PR、不留測試票。A 群 8 條全在證「不該擋」。 另用真實 Gitea 唯讀重演過票上那三個真跡(一次點名 7 個)。 順手:plugin.json 的「27 支腳本」是過期數字,實數 34 (ls -p scripts | grep -v / | wc -l)——同一個病,只是換一欄。 版本 0.9.0 → 0.10.0。tag 待併入 main 後由總管打(release-tag-guard 管那道)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZBu4Sa1cGntKFRBYNZ6xs
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# 51 支閘,白話盤點表
|
||||
# 52 支閘,白話盤點表
|
||||
|
||||
> 回應 `inkstone/InkStoneCo#40`:「如果加入了,我應該可以白話文看到 hooks 的內容?」
|
||||
> 這份表就是那個「白話文」——不用點開任何 `.sh` 檔,一行看懂一支閘在管什麼。
|
||||
@@ -7,14 +7,14 @@
|
||||
|
||||
## 一句話結論
|
||||
|
||||
`hooks/` 底下有 **51 個 `.sh` 檔**,`hooks.json` 實際掛上 **64 條註冊**(同一支閘常被多種情境同時掛上);
|
||||
`hooks/` 底下有 **52 個 `.sh` 檔**,`hooks.json` 實際掛上 **65 條註冊**(同一支閘常被多種情境同時掛上);
|
||||
其中 **3 支檔案存在但沒被掛上**(2 支是待人填的空範本、1 支是刻意留著沒開的止血帶,見下面「未生效」表)。
|
||||
下面按「你會在什麼時候撞到它」分組,一支一行。
|
||||
|
||||
> 🔴 **這兩個數字上一版是錯的(2026-08-26 實際數過才發現)**:本頁原本寫「43 個檔、53 條註冊」,
|
||||
> 而當時真實是 **45 個檔、55 條註冊**——中間有兩支閘進來時沒有回頭改這裡。
|
||||
> 現在的寫法是實際數出來的:
|
||||
> `ls hooks/*.sh | wc -l` = 51;`grep -c '"command":' hooks/hooks.json` = 64。
|
||||
> `ls hooks/*.sh | wc -l` = 52;`grep -c '"command":' hooks/hooks.json` = 65。
|
||||
> ⚠️ **冒號不能省**:`grep -c '"command"'`(沒冒號)會連 `"type": "command"` 一起數到,回 **120**。
|
||||
> 本頁 2026-08-27 之前寫的是沒冒號那版——**照著它跑會拿到一個跟本頁不符的數字**。
|
||||
> **一份會偷偷過期的盤點表,跟沒有盤點表差不多**——見本頁最後「怎麼跟實況對帳」那段。
|
||||
@@ -32,6 +32,11 @@
|
||||
>
|
||||
> 📌 **`0.7.0`(`inkstone/ISEP#30`,2026-08-27)進來一支**:`mainline-idle-guard.sh`(F 組,Stop)。
|
||||
> 48→**49** 支、59→**60** 條,兩個數字都是加完之後當場數出來的(指令同上)。
|
||||
>
|
||||
> 📌 **`0.10.0`(`inkstone/ISEP#81`,2026-08-28)進來一支**:`pr-verdict-guard.sh`(F 組,Stop)。
|
||||
> 51→**52** 支、64→**65** 條,兩個數字都是加完之後當場數出來的(指令同上)。
|
||||
> 順手改掉一個過期的數字:描述欄長期寫「27 支腳本」,實數是 **34**
|
||||
> (`ls -p scripts | grep -v / | wc -l`)——**同一個病,只是換一欄。**
|
||||
|
||||
---
|
||||
|
||||
@@ -126,6 +131,7 @@
|
||||
| `worklist-guard.sh` | AI 自己列過的待辦清單裡還有沒做完的步驟,卻想收工寫報告,就擋下,逼它做完剩下的步驟。 | 🛑 擋 |
|
||||
| `factory-idle-guard.sh` | AI 該去派工卻沒派(工頭停工),就擋下要它交出「已經派工的憑證」,不是隨口說一句「我會催」就算數。**過閘有四條路:現在就派工/把票號寫進那句話/寫一行 `⏸ 等:<在等什麼>`/這一輪收尾在動作上。** 2026-08-23(inkstone/ISEP#30)修好「引用被當成主張」——貼原始碼、引用它自己的訊息、否認自己有下一步,都不再被咬。 | 🛑 擋 |
|
||||
| `mainline-idle-guard.sh` | AI **連續 4 個回合一直在查、一直在讀,卻什麼都沒交出去**(沒派工、沒改檔、沒寫回票)就擋一次。補的是上面兩支中間那一格:「沒動作」空手警察管、「說了下一步卻沒派」稼動率警察管,**而「有動作、但就是不說下一步」以前兩支都放行**。這支**一個字都不讀**,只看有沒有派工/產出/工作區變動。響過一次門檻就加倍(4→8→16),不會變成一直在響的警報。 | 🛑 擋(響過就退讓) |
|
||||
| `pr-verdict-guard.sh` | 收工時清點「還有哪些 PR 沒有結論」——open、**沒有人被指派**、也沒有「要求修改」review 的 PR,就擋一次並**點名是哪幾個**(含開了幾天與網址);已經 merge 但**分支還留著**的也一起點名(票上寫死「併完當場刪掉那條 branch」)。背景:2026-08-27 實查,最久的三個 open PR 躺了兩星期,而當時 46 支閘沒有一支在管 PR——票看起來「已交付」,東西卻沒進 main、沒進版本,**leo 手上永遠不會出現它**。🔴 **擋的是遺忘,不是等待**:指派給誰(或掛 Human)就立刻不再點名它;響過門檻就加倍(1→4→8→16,每個 PR 各自算)。搭配 `scripts/pr-verdict`(merge/reject/changes 各一個動作)。 | 🛑 擋(響過就退讓) |
|
||||
| `browser-verify-guard.sh` | 這一輪 AI 宣稱「前端驗過了」,卻沒有真的用瀏覽器工具載入過,就擋下——`curl` 抓到 HTML 不算驗過。 | 🛑 擋 |
|
||||
| `self-drive-police.sh` | AI 想停下來問你「早就決定過的事」(用固定句型判斷,例如「要不要 X」「下一步做什麼」「這交給你」)就擋下,反問它查過 wiki/查過派工表了沒。 | 🛑 擋 |
|
||||
| `self-drive-judge.sh` | 跟上面同一件事,但改用小模型(haiku)判斷「換句話說」的請示句——防止 AI 只是把「要不要」改寫成「不確定是否符合期待」就閃過上一支閘。 | 🛑 擋 |
|
||||
|
||||
Reference in New Issue
Block a user