身為交出 PR 的人,我要它兩週內有人給結論,我才不會做完的東西永遠進不了版本 #95

Closed
claude-code wants to merge 1 commits from feat/pr-verdict-guard into main

1 Commits

Author SHA1 Message Date
claude-code 7e58623cb3 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
2026-08-28 00:05:40 +00:00