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:
@@ -91,6 +91,41 @@ bash scripts/test-baton-handback-guard.sh
|
||||
- 「不該報」4 條任一紅 ⇒ 每條線收工都被念一次,警報會被學會忽略
|
||||
- 「票已關」那條紅 ⇒ 棒子已經到終點還在催,那是最典型的假警報
|
||||
|
||||
### A14 — PR 一定要有結論:52 條
|
||||
```
|
||||
bash hooks/tests/pr-verdict-guard.test.sh
|
||||
```
|
||||
**該看到**:`52 通過 / 0 失敗`。全程離線(走 `PR_VERDICT_FIXTURE`),
|
||||
**不打 Gitea、不開測試 PR、不留任何測試票**;狀態檔走 `PR_VERDICT_STATE_DIR`。
|
||||
|
||||
**它在守什麼**(`inkstone/ISEP#81`,2026-08-27 實查):最久的三個 open PR 躺了兩星期
|
||||
(`inkstone/arcrun-rag#91` 14 天、`inkstone/Arcrun#116` 14 天、`inkstone/Arcrun#104` 15 天),
|
||||
而 v0.9.0 的 46 支閘**一支都沒有在管 PR**。票看起來是「已交付」,
|
||||
東西卻沒進 main ⇒ 沒進版本 ⇒ **leo 手上永遠不會出現它**。
|
||||
|
||||
**失敗**:
|
||||
- B 群(⑨⑩⑪,票上那三個真跡)任一紅 ⇒ 今天這個形狀會再發生一次
|
||||
- C 群 ⑭⑰ 紅 ⇒ 驗收條件 1/3 沒過:「放著不管」抓不到,或「merge 了分支還在」放行
|
||||
- **A 群任何一條紅 ⇒ 誤攔,這比漏擋嚴重**。②③特別重要:
|
||||
指派給人/掛 Human 之後還在點名,就是 ISEP v0.6.0 divergence §B4 記過的那個坑
|
||||
(「`s/review` 佇列非空即 block」⇒ 佇列本來就不會空 ⇒ **總管永遠停不下來**)
|
||||
- E 群 ㉙ 紅 ⇒ 閘訊息裡承諾的出路(「把它指派給那個人,本閘立刻不再點名它」)是假的
|
||||
- D 群 ㉓ 紅 ⇒ 判準從「識別碼比對」滑成「只要提到票號就放行」,閘會被任何一句話關掉
|
||||
|
||||
> 📌 **真跡不只在 fixture 裡跑過**:同一支閘打真實 Gitea 也驗過,
|
||||
> 一次點名 7 個沒有結論的 PR,含票上那三個(15/14/14 天)。
|
||||
> 指令:`printf '{"session_id":"x","transcript_path":"/nonexistent"}' | bash hooks/pr-verdict-guard.sh`
|
||||
> ——**唯讀,不改動任何 PR**。
|
||||
|
||||
### A15 — 給結論的那支工具自己說得出要打哪幾通 API
|
||||
```
|
||||
python3 scripts/pr-verdict list
|
||||
python3 scripts/pr-verdict merge inkstone/ISEP#71 --dry-run
|
||||
```
|
||||
**該看到**:`list` 印出 open PR 與「有沒有人被指派」;`merge --dry-run` 印出
|
||||
`[dry-run] POST …/pulls/71/merge` 與 `[dry-run] DELETE …/branches/<分支>`,**一通都不真的送出**。
|
||||
**失敗**:`--dry-run` 底下出現真實的寫入結果 ⇒ 這支工具沒辦法在按下去之前被檢查。
|
||||
|
||||
### A5 — 開票前的搜尋是跨 repo 的
|
||||
```
|
||||
python3 scripts/ticket where 標籤 模組化
|
||||
@@ -284,6 +319,8 @@ B2(信標那行)/B3(setup 輸出)/B4(閘的訊息)三個畫面
|
||||
| A3 打 tag 閘 | 總管 | ✅ 3/3 |
|
||||
| **A4 新增 Gitea 東西側門閘** | 總管 | ✅ 24/24(2026-08-27,inkstone/ISEP#72) |
|
||||
| **A13 戳記證明看過不是跑過** | 總管 | ✅ 17/17(2026-08-27,inkstone/ISEP#72→4873) |
|
||||
| **A14 PR 一定要有結論** | 總管 | ✅ 52/52(2026-08-28,inkstone/ISEP#81)+真實 Gitea 唯讀重演 |
|
||||
| **A15 pr-verdict --dry-run** | 總管 | ✅(2026-08-28) |
|
||||
| A5 搜尋跨 repo | 總管 | ✅ |
|
||||
| A6 標籤對齊+冪等 | 總管 | ✅ 14 repo,第二次 0/0 |
|
||||
| **A9 人閘警察管路** | 總管 | ✅ 14/14(2026-08-26) |
|
||||
|
||||
Reference in New Issue
Block a user