feat/work-package-pr-gate-hook-enforcement #20

Merged
admin merged 3 commits from feat/work-package-pr-gate-hook-enforcement into develop 2026-08-25 11:03:25 +00:00
Member

工作包 PR 閘門:hook 端

摘要

  • 需求描述:SDLC 實作階段的「PR 沒合併就禁止進入下個工作包」要從技能內文變成強制規則。依準則「可以由 hook 強制的規則一律下放 hook」,hook 端負責兩件擋得到的事;真正的工作包閘門在 jsc-sdlc/tools/wp-gate.sh(另一支 PR)。使用者裁決 hook 只擋別的階段技能並注入提醒,不擋提示——擋提示會讓使用者連「去修那支 PR」的對話都送不出去,把自己鎖在門外。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
hooks/sdlc-gate.sh 新增 wp-lock、wp-unlock、wp-report、wp-check {prompt|skill} 四個子命令。狀態檔 $JSC_HOME/wp/{owner}-{repo}.pr 刻意不綁工作階段:PR 沒合併時換一個 session 照樣要擋,綁 session 等於留一道自動繞過的門。另外把檔頭的 read_stdin 改成只在需要的子命令才讀。
hooks/hooks.json UserPromptSubmit 接上 wp-check prompt,PreToolUse(matcher Skill)接上 wp-check skill。
tools/wire-cli.sh smoke 補上兩個 wp-check 模式,並在跑冒煙時清空技能名——留著繼承來的 JSC_SKILL,有未結清 PR 時 wp-check skill 會把它當真實呼叫,冒煙就誤報成執行期錯誤。
README.md Hooks 表格補上工作包閘門的完整行為,環境變數表新增 JSC_WP_GATE。
三份 plugin.json 同步升版 0.1.6 → 0.1.7。

設計重點

  • wp-check prompt 一律 exit 0,只注入提醒。這是刻意的:擋提示等於把使用者鎖在門外,連修 PR 都做不了。
  • wp-check skill 對 plan、analyze、maintain exit 2,放行 implement。結清 PR 正是 implement 步驟 4 要做的事,擋它會形成死鎖。取不到技能名也放行(安靜降級)。
  • hook 只讀檔案,絕不打網路。查 PR 真實狀態是 wp-gate.sh 的事,hook 要快且離線可用。
  • read_stdin 改為按子命令決定:lock 需要 stdin(模型判定要 transcript_path),wp-lock、wp-unlock、wp-report 都不需要。原本無條件讀,工具腳本轉呼叫這三個子命令時會整支卡死等輸入——實測踩到過。
  • 逃生門 JSC_WP_GATE=off 一律放行,與既有的 unlock 並存。

測試結果

  • sh -n hooks/sdlc-gate.sh、sh -n tools/wire-cli.sh 通過;hooks.json 可被 json.load 解析。
  • 沙箱 JSC_HOME 下的完整情境:無鎖時 wp-check prompt 與 wp-check skill 都靜默 exit 0;wp-lock plugins/sdlc 42 之後 wp-report 印出該筆、wp-check prompt 有提醒且 exit 0、wp-check skill 對 plan、analyze、maintain 都 exit 2、對 implement 與 jsc-git:pr exit 0、不帶技能名 exit 0。
  • JSC_WP_GATE=off 時上述 exit 2 情境全部變 exit 0。
  • wp-unlock 冪等:重複執行仍 exit 0;解鎖只清掉對應那一筆,其他鎖不受影響(實測 plugins-hooks.pr 被清、plugins-sdlc.pr 留著)。
  • 既有行為未壞:無 stage 鎖時 check exit 0;造鎖後 report 印出階段與標籤、合格模型 exit 0、不在標籤表上的模型 exit 2(訊息不變);lock bogus 仍 exit 1。
  • wire-cli.sh smoke claude 七個接線模式全 exit 0;刻意帶 JSC_SKILL=jsc-sdlc:plan 且有未結清 PR 時仍 exit 0,確認清空技能名有效。
  • wp-lock、wp-unlock、wp-report 不再需要外部導向 stdin 也不卡。
  • 真實 ~/.jsc 未被寫入任何 wp/ 檔案。
  • meta/tools/ste100-lint.sh hooks 通過,無簡體字、中文標點全形。

前置 Push Request

  • 無
# 工作包 PR 閘門:hook 端 ## 摘要 - 需求描述:SDLC 實作階段的「PR 沒合併就禁止進入下個工作包」要從技能內文變成強制規則。依準則「可以由 hook 強制的規則一律下放 hook」,hook 端負責兩件擋得到的事;真正的工作包閘門在 `jsc-sdlc/tools/wp-gate.sh`(另一支 PR)。使用者裁決 hook 只擋別的階段技能並注入提醒,**不擋提示**——擋提示會讓使用者連「去修那支 PR」的對話都送不出去,把自己鎖在門外。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `hooks/sdlc-gate.sh` | 新增 `wp-lock`、`wp-unlock`、`wp-report`、`wp-check {prompt|skill}` 四個子命令。狀態檔 `$JSC_HOME/wp/{owner}-{repo}.pr` **刻意不綁工作階段**:PR 沒合併時換一個 session 照樣要擋,綁 session 等於留一道自動繞過的門。另外把檔頭的 `read_stdin` 改成只在需要的子命令才讀。 | | `hooks/hooks.json` | `UserPromptSubmit` 接上 `wp-check prompt`,`PreToolUse`(matcher `Skill`)接上 `wp-check skill`。 | | `tools/wire-cli.sh` | `smoke` 補上兩個 `wp-check` 模式,並在跑冒煙時清空技能名——留著繼承來的 `JSC_SKILL`,有未結清 PR 時 `wp-check skill` 會把它當真實呼叫,冒煙就誤報成執行期錯誤。 | | `README.md` | Hooks 表格補上工作包閘門的完整行為,環境變數表新增 `JSC_WP_GATE`。 | | 三份 plugin.json | 同步升版 0.1.6 → 0.1.7。 | ## 設計重點 - `wp-check prompt` 一律 exit 0,只注入提醒。這是刻意的:擋提示等於把使用者鎖在門外,連修 PR 都做不了。 - `wp-check skill` 對 `plan`、`analyze`、`maintain` exit 2,**放行 `implement`**。結清 PR 正是 implement 步驟 4 要做的事,擋它會形成死鎖。取不到技能名也放行(安靜降級)。 - hook 只讀檔案,**絕不打網路**。查 PR 真實狀態是 `wp-gate.sh` 的事,hook 要快且離線可用。 - `read_stdin` 改為按子命令決定:`lock` 需要 stdin(模型判定要 `transcript_path`),`wp-lock`、`wp-unlock`、`wp-report` 都不需要。原本無條件讀,工具腳本轉呼叫這三個子命令時會整支卡死等輸入——實測踩到過。 - 逃生門 `JSC_WP_GATE=off` 一律放行,與既有的 `unlock` 並存。 ## 測試結果 - `sh -n hooks/sdlc-gate.sh`、`sh -n tools/wire-cli.sh` 通過;`hooks.json` 可被 `json.load` 解析。 - 沙箱 `JSC_HOME` 下的完整情境:無鎖時 `wp-check prompt` 與 `wp-check skill` 都靜默 exit 0;`wp-lock plugins/sdlc 42` 之後 `wp-report` 印出該筆、`wp-check prompt` 有提醒且 **exit 0**、`wp-check skill` 對 `plan`、`analyze`、`maintain` 都 exit 2、對 `implement` 與 `jsc-git:pr` exit 0、不帶技能名 exit 0。 - `JSC_WP_GATE=off` 時上述 exit 2 情境全部變 exit 0。 - `wp-unlock` 冪等:重複執行仍 exit 0;解鎖只清掉對應那一筆,其他鎖不受影響(實測 `plugins-hooks.pr` 被清、`plugins-sdlc.pr` 留著)。 - 既有行為未壞:無 stage 鎖時 `check` exit 0;造鎖後 `report` 印出階段與標籤、合格模型 exit 0、不在標籤表上的模型 exit 2(訊息不變);`lock bogus` 仍 exit 1。 - `wire-cli.sh smoke claude` 七個接線模式全 exit 0;刻意帶 `JSC_SKILL=jsc-sdlc:plan` 且有未結清 PR 時仍 exit 0,確認清空技能名有效。 - `wp-lock`、`wp-unlock`、`wp-report` 不再需要外部導向 stdin 也不卡。 - 真實 `~/.jsc` 未被寫入任何 `wp/` 檔案。 - `meta/tools/ste100-lint.sh hooks` 通過,無簡體字、中文標點全形。 ## 前置 Push Request - 無
jiantw83 added 3 commits 2026-08-25 11:00:47 +00:00
jiantw83 added a new dependency 2026-08-25 11:01:08 +00:00
admin merged commit 88c7d37c2d into develop 2026-08-25 11:03:25 +00:00
admin deleted branch feat/work-package-pr-gate-hook-enforcement 2026-08-25 11:03:25 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: plugins/hooks#20