feat(sdlc-gate): 階段閘門改為能力標籤程式判定,模型不符即擋下該輪提示 #7

Merged
admin merged 3 commits from fix/sync-marketplace-and-hooks-install-script into develop 2026-08-24 08:17:02 +00:00
Member

變更摘要

sdlc-gate 原本有三個漏洞,使 SDLC 模型閘門完全沒有強制力:判定退回模型自評、鎖存的是「上鎖那一刻的模型」(用不合格模型起跑就把自己鎖成合格)、check 只注入提醒後 exit 0(模型可以無視)。本 PR 把判定與強制力都下移到程式層。

  • lib.sh 新增 transcript_model:從 hook 收到的 transcript_path jsonl 尾端讀出實際模型 id。這是 shell 唯一能驗證的模型來源,模型自我回報無法驗證。
  • sdlc-gate.sh lock {stage} 不再收模型參數:自己讀實際模型、比對該階段必要標籤(讀 $JSC_HOME/model-tags.tsv),不符就拒絕上鎖並以 exit 1 要求呼叫端停止。
  • 鎖存的是「階段的必要標籤」而非模型名稱,上鎖時的模型只留作記錄,杜絕「自己把自己鎖成合格」。
  • check 在鎖存在且模型不符時以 exit 2 擋下該輪提示,訊息附上可切換的合格模型清單與 unlock 逃生門。其他 jsc hook 仍一律 exit 0,此處是刻意的例外並已在 lib.sh 註記。
  • 無鎖、any 階段、判定不出模型、舊格式鎖檔 → 照舊安靜降級 exit 0,不會把使用者鎖在無法送出提示的狀態。

影響範圍

  • jsc-sdlc 四個階段技能的呼叫方式改為 sdlc-gate.sh lock {stage}(少一個參數,該 repo 另有 PR)。
  • codex、kiro 這類無法接線 prompt hook 的 CLI,閘門仍在 lock 這一步生效,強制力不因降級而消失。
  • 新增對 $JSC_HOME/model-tags.tsv 的相依:檔案不存在時 lock 拒絕上鎖(fail-closed)。

重點檔案

檔案 變更
hooks/sdlc-gate.sh 重寫;標籤比對、fail-closed 上鎖、check 以 exit 2 阻擋
hooks/lib.sh 新增 transcript_model,並註記 exit code 例外
skills/hooks-install/SKILL.md 補述閘門在 lock 生效、以及 tsv 缺失時要先跑 jsc-cli:models
README.md hook 表與 JSC_MODEL 優先序說明同步

風險與注意事項

  • 相依:需要 jsc-cli 的 tools/model-tags.sh sync 先產生 $JSC_HOME/model-tags.tsv,否則所有 SDLC 階段都上不了鎖。
  • check 會擋下提示,屬於刻意的行為改變。被擋住時的兩條出路都寫在訊息裡:切換到合格模型,或執行 sdlc-gate.sh unlock。
  • 未知模型(不在標籤表上)採 fail-closed:lock 拒絕、check 阻擋,要求補表而不是放行。

驗證

實測九項情境全部符合預期:opus 上鎖通過、階段中途換 sonnet 被 exit 2 擋下、sonnet 跑 analyze 被 exit 1 拒絕、sonnet 跑 implement 通過、未知模型被擋、maintain(any)放行、tsv 缺失時拒絕上鎖、無 transcript 時拒絕上鎖、舊格式鎖檔安靜降級。sh -n 與 STE100 lint 皆通過。

## 變更摘要 sdlc-gate 原本有三個漏洞,使 SDLC 模型閘門完全沒有強制力:判定退回模型自評、鎖存的是「上鎖那一刻的模型」(用不合格模型起跑就把自己鎖成合格)、`check` 只注入提醒後 `exit 0`(模型可以無視)。本 PR 把判定與強制力都下移到程式層。 - `lib.sh` 新增 `transcript_model`:從 hook 收到的 `transcript_path` jsonl 尾端讀出**實際**模型 id。這是 shell 唯一能驗證的模型來源,模型自我回報無法驗證。 - `sdlc-gate.sh lock {stage}` 不再收模型參數:自己讀實際模型、比對該階段必要標籤(讀 `$JSC_HOME/model-tags.tsv`),不符就**拒絕上鎖**並以 exit 1 要求呼叫端停止。 - 鎖存的是「階段的必要標籤」而非模型名稱,上鎖時的模型只留作記錄,杜絕「自己把自己鎖成合格」。 - `check` 在鎖存在且模型不符時以 **exit 2 擋下該輪提示**,訊息附上可切換的合格模型清單與 `unlock` 逃生門。其他 jsc hook 仍一律 exit 0,此處是刻意的例外並已在 `lib.sh` 註記。 - 無鎖、`any` 階段、判定不出模型、舊格式鎖檔 → 照舊安靜降級 exit 0,不會把使用者鎖在無法送出提示的狀態。 ## 影響範圍 - `jsc-sdlc` 四個階段技能的呼叫方式改為 `sdlc-gate.sh lock {stage}`(少一個參數,該 repo 另有 PR)。 - codex、kiro 這類無法接線 prompt hook 的 CLI,閘門仍在 `lock` 這一步生效,強制力不因降級而消失。 - 新增對 `$JSC_HOME/model-tags.tsv` 的相依:檔案不存在時 `lock` 拒絕上鎖(fail-closed)。 ## 重點檔案 | 檔案 | 變更 | | --- | --- | | `hooks/sdlc-gate.sh` | 重寫;標籤比對、fail-closed 上鎖、`check` 以 exit 2 阻擋 | | `hooks/lib.sh` | 新增 `transcript_model`,並註記 exit code 例外 | | `skills/hooks-install/SKILL.md` | 補述閘門在 `lock` 生效、以及 tsv 缺失時要先跑 `jsc-cli:models` | | `README.md` | hook 表與 `JSC_MODEL` 優先序說明同步 | ## 風險與注意事項 - **相依**:需要 `jsc-cli` 的 `tools/model-tags.sh sync` 先產生 `$JSC_HOME/model-tags.tsv`,否則所有 SDLC 階段都上不了鎖。 - `check` 會擋下提示,屬於刻意的行為改變。被擋住時的兩條出路都寫在訊息裡:切換到合格模型,或執行 `sdlc-gate.sh unlock`。 - 未知模型(不在標籤表上)採 fail-closed:`lock` 拒絕、`check` 阻擋,要求補表而不是放行。 ## 驗證 實測九項情境全部符合預期:opus 上鎖通過、階段中途換 sonnet 被 exit 2 擋下、sonnet 跑 analyze 被 exit 1 拒絕、sonnet 跑 implement 通過、未知模型被擋、maintain(any)放行、tsv 缺失時拒絕上鎖、無 transcript 時拒絕上鎖、舊格式鎖檔安靜降級。`sh -n` 與 STE100 lint 皆通過。
jiantw83 added 3 commits 2026-08-24 08:08:10 +00:00
admin approved these changes 2026-08-24 08:15:56 +00:00
admin merged commit 5f5d51de8f into develop 2026-08-24 08:17:02 +00:00
admin deleted branch fix/sync-marketplace-and-hooks-install-script 2026-08-24 08:17:02 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Reference: plugins/hooks#7