未出貨警察 unreleased-police.sh — 收工抓「改了 repo 卻沒出貨」(inkstone/ISEP#68) #128

Open
claude-code wants to merge 1 commits from feat/unreleased-police-isep68 into main
Member

交付 inkstone/ISEP#68(主線 milestone #43「把管理這條線做對」補收)。

新增 hooks/unreleased-police.sh(Stop hook):這個 session 改過 code 的 repo,收工那刻若沒出貨(git tag --contains HEAD 為空)就擋一次,並點名 repo+落後筆數。寬容機制:.isep-release-exempt marker/release-holds.md 一行理由 → 放行且留痕。只掛 Stop 不掛 SubagentStop。

總管已自審(親自重跑,非轉述):測試 13/13、commit 5 檔與宣稱一致、hooks.json 純加一條 Stop 註冊、plugin.json 未動(check-version-consistency 仍綠)、紅線 presence-based 非黑名單、fail-open。實據見 issue #68 comment 6167。

合併/出 release 是閘控下一步(合併 main+plugin.json 升版+打 tag)=總管/leo 的手動閘,非本雲端輪範圍。

🤖 Generated with Claude Code

https://claude.ai/code/session_01M6AcoT4ALtPLsoCKab6pXt

交付 inkstone/ISEP#68(主線 milestone #43「把管理這條線做對」補收)。 新增 `hooks/unreleased-police.sh`(Stop hook):這個 session 改過 code 的 repo,收工那刻若沒出貨(`git tag --contains HEAD` 為空)就擋一次,並點名 repo+落後筆數。寬容機制:`.isep-release-exempt` marker/`release-holds.md` 一行理由 → 放行且留痕。只掛 Stop 不掛 SubagentStop。 **總管已自審(親自重跑,非轉述)**:測試 13/13、commit 5 檔與宣稱一致、hooks.json 純加一條 Stop 註冊、plugin.json 未動(check-version-consistency 仍綠)、紅線 presence-based 非黑名單、fail-open。實據見 issue #68 comment 6167。 **合併/出 release 是閘控下一步**(合併 main+plugin.json 升版+打 tag)=總管/leo 的手動閘,非本雲端輪範圍。 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01M6AcoT4ALtPLsoCKab6pXt
claude-code added 1 commit 2026-09-03 21:13:29 +00:00
leo 2026-08-27:「每個 repo 只要有改動就要出貨⋯⋯這個 session 有改但要
結束沒出貨就抓,你可以久一點再出貨累積幾個 PR,但最後一定要出貨」。

四個判準(票要求自己判、寫得出理由,不照抄總管):
- 「改過」=這個 session 期間 HEAD 新長出來的 commit(不是工作區髒、不是 push)。
  與「出貨」用同一個單位(commit),才數得出「最後 commit 與最新 release 差多少」。
  session 起點=transcript 第一列時間戳(同 countdown.py 的基準)。
- 「該不該出貨」=有沒有動到知識(wiki/docs/_archive)以外的檔。只改 wiki/docs 不擋。
- 「哪些 repo 不適用」=repo 根目錄有 .isep-release-exempt(自帶理由,非中央手列清單,
  新 repo 預設納管)。
- 「這次先不出」=.claude/release-holds.md 寫一行理由(放行且留痕;形狀同 branch-holds.md,
  是「要求某個東西在場」而非文字層封路)。
「出貨」=git tag --contains HEAD 非空(Gitea release 就是 tag,本機答得準、不打網路)。

只掛 Stop、不掛 SubagentStop:subagent 交回分支、release 由總管出,逼 subagent 出貨純屬誤攔。
fail-open:拿不到 transcript 起點/非 git/git 問不出來一律放行(誤攔比漏擋嚴重)。

盤點:61→62 支、84→85 條(在自己的樹上實數,未加減推算);未掛上仍 3 支(不變)。
測試:scripts/test-unreleased-police.sh 13/13(該擋/不該擋/出路走得通/鑑別力四群,全離線)。
docs/hooks-inventory.md F 組加一列+版本註記;docs/TESTING.md A27。

plugin.json 待總管定版:版本號與 tag 由總管在打 release 那一刻同 commit 改(升版是傳輸
機制本身,check-version-consistency 要求 version==最新 tag,故不在分支上先動)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6AcoT4ALtPLsoCKab6pXt
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/unreleased-police-isep68:feat/unreleased-police-isep68
git checkout feat/unreleased-police-isep68
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inkstone/ISEP#128