feat(hooks): 工作包歸屬比對與狀態檔格式 #30

Merged
admin merged 4 commits from feat/sdlc-flow-rules/wp-scope-gate into feat/sdlc-flow-rules/main 2026-08-27 03:26:10 +00:00
Member

摘要

  • 需求描述:落實「SDLC 執行流程」規則群裡的工作包隔離。一個工作階段只碰自己領的那一包,歸屬以分析頁的工作包編號認定,查無歸屬就放行。jsc-hooks 這一側要提供的是狀態檔與 hook 端的比對:領取紀錄、鎖檔的工作包欄位、以及 wp-check 兩種模式的點名。決策紀錄在 wiki 存取庫 knowledges/QUESTION 的 QUESTION_FB8DF0B5,2026-08-27 那一節。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
hooks/sdlc-gate.sh 原本的鎖檔只記存取庫與 PR 編號,看不出那支 PR 是哪一包的,任何工作階段都可能去改別包的程式碼、回別包的留言。新增 wp-claim、wp-unclaim,wp-lock 收工作包代號,鎖檔改 key=value,wp-check 逐筆判歸屬並點名
tools/wire-cli.sh 原本兩支 wp-check 冒煙都把技能名清空,只走得到兩條捷徑,歸屬比對整段沒跑到。補一段用暫時 $JSC_HOME 把四條判定路徑各跑一次並比對結束碼
README.md 狀態檔格式是 jsc-hooks 與 jsc-sdlc 的介面,只寫在腳本註解裡另一邊看不到。新增「工作包歸屬狀態檔」一節,兩支腳本的說明同步更新
plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 行為變更要 bump 版本;三份同步升到 0.2.3

設計重點

  • 歸屬只比一件事:鎖檔的 wp 與同一個存取庫領取檔的 wp 取數字比一次,兩邊都有值且不相等,那支 PR 就不是這裡該處理的。WP-03、WP-3、3 先正規化再比。
  • 查無歸屬就放行,只注入提醒。沒有分析頁、wp 沒寫、領取檔不存在三種都算這一類。理由與 version-guard.sh 一致:只擋確定違規,不然會把技能組維護自己鎖死。
  • 舊版單行 TSV 鎖檔照樣讀得動,讀出來是查無歸屬。換格式不該讓既有的鎖失效,也不該把它判成違規。
  • implement 一律放行,連別包的 PR 未結清也放行,只多印一則歸屬提醒。結清 PR 正是 implement 要做的事,擋它就沒有任何路徑能解除這道鎖;領取檔又不綁工作階段,擋下去連領那一包的工作階段都會被自己的舊紀錄擋住。
  • hook 只讀不寫。寫檔的一律是 jsc-sdlc,經由 wp-claim 與 wp-lock 進來。兩邊各拼各的檔案,格式一改就對不上,而且誰寫壞了看不出來。
  • 分類迴圈用 here-document 餵資料而不用管線:管線右邊是子 shell,分類結果傳不回來,判到的違規會在迴圈結束的瞬間全部消失。
  • 新子命令歸進「不需要 stdin」那一列。read_stdin 在標準輸入是管線又沒人關閉時會一直等,工具腳本轉呼叫時會整支卡死。

測試結果

  • sh -n hooks/sdlc-gate.sh、sh -n tools/wire-cli.sh:兩支語法檢查都通過。
  • tools/wire-cli.sh smoke claude(用暫時的 $JSC_HOME):status=ok,退出碼 0。七支 hook 的每個接線模式都跑得完,新增的四條歸屬判定路徑逐條印出「與預期相同」——狀態檔不存在 0、PR 屬於領取中的工作包且技能是 implement 為 0、PR 屬於別的工作包且技能是 plan 為 2、同情境技能是 implement 為 0、逃生門 JSC_WP_GATE=off 為 0。
  • 以暫時 $JSC_HOME 手動走過一輪完整情境:wp-claim jsc/demo WP-03 之後 wp-lock jsc/demo 12 WP-03 與 wp-lock jsc/demo 9 WP-01,wp-report 印出兩列並帶第四欄工作包代號;wp-check prompt 退出碼 0 並多印一行點名第 9 號不屬於領取中的工作包;wp-check skill 對 plan 回 2 且訊息一併點名,對 implement 回 0 只印提醒。
  • 舊格式相容:手動放一支單行 TSV 鎖檔進去,wp-report 照樣讀得出來,第四欄留白。
  • ste100-lint.sh .:全庫零命中。
  • 三份 manifest 以 JSON 解析器讀過,格式正確且版本一致為 0.2.3。
  • 未測:claude 以外四個 CLI 的 smoke,本機沒有安裝那些 CLI。

前置 Push Request

  • 無
## 摘要 - 需求描述:落實「SDLC 執行流程」規則群裡的工作包隔離。一個工作階段只碰自己領的那一包,歸屬以分析頁的工作包編號認定,查無歸屬就放行。`jsc-hooks` 這一側要提供的是狀態檔與 hook 端的比對:領取紀錄、鎖檔的工作包欄位、以及 `wp-check` 兩種模式的點名。決策紀錄在 wiki 存取庫 `knowledges/QUESTION` 的 `QUESTION_FB8DF0B5`,2026-08-27 那一節。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `hooks/sdlc-gate.sh` | 原本的鎖檔只記存取庫與 PR 編號,看不出那支 PR 是哪一包的,任何工作階段都可能去改別包的程式碼、回別包的留言。新增 `wp-claim`、`wp-unclaim`,`wp-lock` 收工作包代號,鎖檔改 `key=value`,`wp-check` 逐筆判歸屬並點名 | | `tools/wire-cli.sh` | 原本兩支 `wp-check` 冒煙都把技能名清空,只走得到兩條捷徑,歸屬比對整段沒跑到。補一段用暫時 `$JSC_HOME` 把四條判定路徑各跑一次並比對結束碼 | | `README.md` | 狀態檔格式是 `jsc-hooks` 與 `jsc-sdlc` 的介面,只寫在腳本註解裡另一邊看不到。新增「工作包歸屬狀態檔」一節,兩支腳本的說明同步更新 | | `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` | 行為變更要 bump 版本;三份同步升到 0.2.3 | ## 設計重點 - 歸屬只比一件事:鎖檔的 `wp` 與同一個存取庫領取檔的 `wp` 取數字比一次,兩邊都有值且不相等,那支 PR 就不是這裡該處理的。`WP-03`、`WP-3`、`3` 先正規化再比。 - 查無歸屬就放行,只注入提醒。沒有分析頁、`wp` 沒寫、領取檔不存在三種都算這一類。理由與 `version-guard.sh` 一致:只擋確定違規,不然會把技能組維護自己鎖死。 - 舊版單行 TSV 鎖檔照樣讀得動,讀出來是查無歸屬。換格式不該讓既有的鎖失效,也不該把它判成違規。 - `implement` 一律放行,連別包的 PR 未結清也放行,只多印一則歸屬提醒。結清 PR 正是 `implement` 要做的事,擋它就沒有任何路徑能解除這道鎖;領取檔又不綁工作階段,擋下去連領那一包的工作階段都會被自己的舊紀錄擋住。 - hook 只讀不寫。寫檔的一律是 `jsc-sdlc`,經由 `wp-claim` 與 `wp-lock` 進來。兩邊各拼各的檔案,格式一改就對不上,而且誰寫壞了看不出來。 - 分類迴圈用 here-document 餵資料而不用管線:管線右邊是子 shell,分類結果傳不回來,判到的違規會在迴圈結束的瞬間全部消失。 - 新子命令歸進「不需要 stdin」那一列。`read_stdin` 在標準輸入是管線又沒人關閉時會一直等,工具腳本轉呼叫時會整支卡死。 ## 測試結果 - `sh -n hooks/sdlc-gate.sh`、`sh -n tools/wire-cli.sh`:兩支語法檢查都通過。 - `tools/wire-cli.sh smoke claude`(用暫時的 `$JSC_HOME`):`status=ok`,退出碼 `0`。七支 hook 的每個接線模式都跑得完,新增的四條歸屬判定路徑逐條印出「與預期相同」——狀態檔不存在 `0`、PR 屬於領取中的工作包且技能是 `implement` 為 `0`、PR 屬於別的工作包且技能是 `plan` 為 `2`、同情境技能是 `implement` 為 `0`、逃生門 `JSC_WP_GATE=off` 為 `0`。 - 以暫時 `$JSC_HOME` 手動走過一輪完整情境:`wp-claim jsc/demo WP-03` 之後 `wp-lock jsc/demo 12 WP-03` 與 `wp-lock jsc/demo 9 WP-01`,`wp-report` 印出兩列並帶第四欄工作包代號;`wp-check prompt` 退出碼 `0` 並多印一行點名第 9 號不屬於領取中的工作包;`wp-check skill` 對 `plan` 回 `2` 且訊息一併點名,對 `implement` 回 `0` 只印提醒。 - 舊格式相容:手動放一支單行 TSV 鎖檔進去,`wp-report` 照樣讀得出來,第四欄留白。 - `ste100-lint.sh .`:全庫零命中。 - 三份 manifest 以 JSON 解析器讀過,格式正確且版本一致為 0.2.3。 - 未測:claude 以外四個 CLI 的 `smoke`,本機沒有安裝那些 CLI。 ## 前置 Push Request - 無
jiantw83 added 4 commits 2026-08-27 03:20:55 +00:00
What:`hooks/sdlc-gate.sh` 新增 `wp-claim {owner}/{repo} {工作包代號} [{PR 編號}] [{分析頁}]` 與 `wp-unclaim {owner}/{repo}` 兩個子命令,`wp-lock` 新增第四個參數收工作包代號,鎖檔改為純文字 `key=value`,`wp-report` 多印第四欄工作包代號。`wp-check` 逐筆判歸屬:`prompt` 多注入一行點名不屬於這裡的 PR,`skill` 擋下 `plan`、`analyze`、`maintain` 時一併點名,`implement` 仍放行但收到同一則提醒。

Why:同一份分析常有好幾包平行進行,每包各自的 worktree 與 PR。原本的鎖檔只記存取庫與 PR 編號,看不出那支 PR 是誰的,於是任何一個工作階段都可能去改別包的程式碼、回別包的留言。

How:歸屬只比一件事——鎖檔的 `wp` 與同一個存取庫領取檔的 `wp` 取數字比一次,兩邊都有值且不相等就是別包的。`WP-03`、`WP-3`、`3` 先正規化再比,不然同一包的幾種寫法會被當成不同包。任何一邊查不到(沒有分析頁、沒寫代號、領取檔不存在)一律當查無歸屬並放行,理由與 `version-guard.sh` 一致:只擋確定違規,否則會把技能組維護自己鎖死。舊版單行 TSV 鎖檔照樣讀得動,讀出來是查無歸屬,換格式不會讓既有的鎖失效。`implement` 一律放行,連別包的 PR 未結清也放行——結清 PR 正是 `implement` 的步驟,擋它會把流程鎖死。分類迴圈用 here-document 餵資料而不用管線,管線右邊是子 shell,判到的違規會在迴圈結束時全部消失。

Who:跑 SDLC 實作階段的每個工作階段,以及 `jsc-sdlc/tools/wp-gate.sh` 的 `claim`、`lock` 與 `owns`。
What:`tools/wire-cli.sh` 的 `smoke` 新增一段,用一份暫時的 `$JSC_HOME` 狀態檔把「狀態檔不存在」「PR 屬於領取中的工作包」「PR 屬於別的工作包」「逃生門 `JSC_WP_GATE=off`」四種情境各跑一次,逐一比對結束碼;收尾那句 `status=ok` 的說明也跟著補上這一段。

Why:原本兩支 `wp-check` 冒煙都把技能名清空,只走得到「沒有未結清 PR」與「取不到技能名」兩條捷徑,歸屬比對整段一次都沒跑到。判定寫了卻沒驗,等於沒寫。

How:驗的是判定結果本身,不只是腳本跑得完——每一種情境都給定預期結束碼,對不上就計入失敗並印出前 200 字的輸出。狀態檔放在暫時目錄,冒煙測試不該在使用者真正的 `$JSC_HOME/wp/` 留下痕跡。每次呼叫都接 `</dev/null`:`wp-check` 會讀標準輸入,管線沒人關閉時整支會卡死。建不出暫存目錄也算失敗,不能靜悄悄跳過。

Who:`jsc-hooks:hooks-install` 接線後跑的冒煙測試,以及改動 `sdlc-gate.sh` 歸屬判定的人。
What:README 新增「工作包歸屬狀態檔」一節,用表列出鎖檔與領取檔的檔名、欄位與範例,寫明誰寫誰讀、查無歸屬一律放行、舊版 TSV 鎖檔照樣讀得動;`sdlc-gate.sh` 與 `wire-cli.sh` 兩列的說明同步補上新子命令與冒煙測試的新內容。

Why:狀態檔的格式是 `jsc-hooks` 與 `jsc-sdlc` 兩邊的介面。介面只寫在腳本註解裡,另一邊改的時候看不到,格式一走鐘歸屬就全部誤判。

How:格式壓到最簡的純文字 `key=value`,一行一欄位,順序不拘,不認得的鍵一律忽略,兩邊各自實作也對得上。表只寫欄位與範例,判定規則寫在表底下的三段短說明。

Who:讀 `jsc-hooks` 說明的人,以及 `jsc-sdlc` 那一側寫 `wp-gate.sh` 的人。
What:`plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` 的 `version` 由 0.2.2 改為 0.2.3。

Why:本次新增 `wp-claim`、`wp-unclaim` 兩個子命令並改了鎖檔格式,屬於行為變更,版本要跟著往上走,各 CLI 才知道要更新。

How:三份只改 `version` 一個欄位,其餘內容不動,三份保持同一版號。

Who:`jsc-hooks` 外掛的套件描述檔。
admin merged commit e53dd802b8 into feat/sdlc-flow-rules/main 2026-08-27 03:26:10 +00:00
admin deleted branch feat/sdlc-flow-rules/wp-scope-gate 2026-08-27 03:26:10 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: plugins/hooks#30