fix/skill-check-compliance-and-flow
develop
hooks/write-guard.sh
stage
review
commit
release
|| true
hooks/hooks.json
tools/wire-cli.sh
JSC_READONLY=1
status
smoke
tools/report-error.sh
hooks/version-guard.sh
hooks/restart-gate.sh
hooks/sdlc-gate.sh
tools/scan-hook-errors.sh
skills/repair/SKILL.md
skills/hooks-install/SKILL.md
hooks/lib.sh
hooks/session-timer.sh
hooks/skill-usage.sh
hooks/ste100-guard.sh
tools/scan-logs.sh
README.md
JSC_READONLY
JSC_WRITE_GUARD
JSC_WRITE_GUARD_TTL
JSC_TOOL_COMMAND
AGENTS.md
templates/error-contents.md
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
hooks/simplified.txt
實際跑過、結果如下:
bash -n
dash -n
hooks/*.sh
tools/*.sh
.
git add -A
沒有跑、據實列出:
wire-cli.sh smoke {cli}
report-error.sh
scan-hook-errors.sh
新增第九支 hook,共四種模式。stage 在計畫與分析階段鎖著時擋下寫檔。 review 在稽核類技能執行中擋下寫檔。commit 擋下「一次加入全部變更再提交」的 單一指令,也擋下含簡體字、亂碼或非 UTF-8 編碼的提交訊息。 release 不接 hook,由稽核技能收尾時自己呼叫,清掉認人用的那份紀錄, 讓呼叫端接手修改時不會被剛跑完的稽核擋住。 這三條規則原本只寫在技能內文,靠模型自律。稽核技能會順手改程式碼, 計畫階段會寫出不該寫的檔案,整包提交會把型別與功能分組壓成一次。 規則要真的生效,就得由程式擋。release 模式是必要的:紀錄記的是最近一次 載入的技能,不是還在跑的技能,沒有它,稽核跑完之後呼叫端每一次寫入都被擋, 閘門會把解除自己的路徑一起鎖掉。 接線設定把 stage 與 review 接在寫檔工具,把 commit 接在指令工具。 閘門只讀階段閘門的狀態鎖與技能用量的紀錄,不自己寫狀態檔; 簡繁與編碼判定整段轉呼叫語言守門,不留第二份字表。 接線腳本的接線、唯讀盤點與冒煙各補上這一支,冒煙自備暫時的狀態目錄, 逐條比對每種模式的結束碼。接線腳本另補唯讀模式,體檢類技能全程帶著它跑, 清除與接線一律拒絕並回非零,子命令打錯一個字也改不到環境。 冒煙改成自己數結果行並自我斷言,散文只引用那一行,不再各抄一份數字。 限制據實寫在檔頭:只有 claude 有寫檔前置鉤子,其餘四支 CLI 一條都接不上, 那四支上這三條規則仍只剩技能內文。
異常回報依 wiki 讀取的結束碼分流,只有頁面確定不存在才套範本建新頁。 版本閘門與重啟閘門的豁免清單各補上 hook 修復技能。 階段閘門把計畫階段移出擋人名單,改成只注入提醒。 錯誤掃描的自家 hook 判定補齊九支腳本,並加一條路徑判定。 修復技能與接線技能的內文改成真的走得到的路徑與真的存在的關卡數。 原本 wiki 讀取失敗會一路落到套範本那一步,金鑰失效或 API 出狀況時, 就拿一份空白範本蓋掉整份異常目錄,而寫入不做合併也不留備份,蓋掉就救不回來。 兩道閘門把唯一的 hook 修復路徑一起擋住,hook 一壞就沒有任何方法修回來, 閘門等於鎖掉解除自己的路徑。工作包閘門擋下計畫階段是誤擋: 計畫是純邏輯階段、不碰程式碼,而閘門只知道有 PR 未合併,判不出跟新計畫有沒有關聯。 自家 hook 判定只認得早期那五支,後來加的四支出錯會被當成第三方的,只回報不修正。 修復技能裡三個指向流程的路徑指到不存在的位置,照著走一定撲空; 接線流程寫四道關卡,實際上有五道,兩段中文說明也混在英文內文裡。 異常目錄改成先讀回舊頁、把新列附在文末、再整頁寫回;讀不回來就放棄寫目錄頁並回報, 寧可少一列索引,也不覆蓋別人的紀錄。兩份豁免清單各補一項,理由逐項寫在腳本檔頭。 計畫階段改印提醒後放行,放棄的在製品上限與代價一併寫在檔頭。 自家 hook 判定逐支列出腳本名,再加一條安裝路徑判定,日後新增 hook 忘了補清單也還認得出來。 三個路徑改指到擁有它的技能組,關卡數改成五道並逐關寫明結束碼,兩段中文說明改回英文。 版本閘門在同一次改動另補唯讀的建議子命令,把版本比對表收斂成一行結論, 部署技能不必自己再解一次那張表。
共用函式庫與各支腳本的檔頭各補一段結束碼宣告,逐個子命令寫明哪些情況放行、 哪些情況擋下。說明文件改寫成九支 hook 的現況,補上寫入與提交閘門、唯讀模式、 建議子命令與新的環境變數。異常目錄範本補上「一律附加、不整頁覆蓋」的寫入語意。 呼叫端要靠結束碼決定下一步,但多數腳本只寫用法、沒寫結束碼, 讀的人得自己翻程式碼推,推錯就把安靜降級當成失敗處理。 共用函式庫載不到時,殼層會就地結束並回非零,接在工具呼叫前的閘門遇到這一下 等於無聲擋人,腳本自己的放行路徑一條都跑不到,這件事非寫進每一支檔頭不可。 文件停在八支 hook 的舊敘述,看的人會誤判覆蓋範圍,以為每支 CLI 都擋得住。 目錄頁的寫入語意只寫在腳本裡,換一支工具來寫就會整頁覆蓋。 一支腳本一段檔頭,逐子命令列出結束碼,並各自註明共用函式庫載入失敗會回哪一個碼。 文件的行數一律引用腳本自己印出來的那一行,不另抄一份數字, 判定路徑增減時就不會漂移。覆蓋範圍逐支 CLI 分開寫,接不上的就寫接不上。
三份外掛設定檔的版本一起往上推,描述加上寫入與提交閘門, 相依清單補上 git 與 meta 兩個技能組。 這一輪新增一支 hook,也改了兩道閘門的行為。版本不推上去, 版本前置檢查就看不出機器上載入的是舊版,使用者會拿舊的閘門跑新的流程。 描述是使用者在市集看到的那一行,少一項就會漏掉新閘門。 寫入閘門擋下整包提交時,改法指向 git 技能組的分組流程; 語言規則的正文則在 meta 技能組。這兩個相依本來就成立,只是先前沒有寫進清單。 三份設定檔改成同一個版本,描述與相依清單三份同步, 避免不同 CLI 讀到不一樣的宣告。
重定基底到 develop 後,冒煙測試併入了 sdlc-gate.sh 取模型代號的四條來源 判定,但那支輸出函式沒有自己的計數器,四個預期值也沒跟著加。結果是實際 印出六十四條結果行、四類計數器只算到六十條,收尾的自我斷言當場判定不符, smoke 一律以 exit 4 收場。 補上第五個計數器 smoke_n_model 與對應的 SMOKE_EXPECT_MODEL,計數放在該 函式開頭,連建不出暫存目錄那條也算得到;總數、逐類比對訊息與結果摘要一併 納入模型來源這一類。五支 CLI 的 smoke 都回 status=ok,行數與各類條數三邊 一致。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
No dependencies set.
The note is not visible to the blocked user.
摘要
變更內容
hooks/write-guard.shstage在計畫與分析階段鎖著時擋下寫檔、review在稽核技能執行中擋下寫檔、commit擋下整包提交與非繁體中文的提交訊息、release供稽核技能收尾時清掉認人用的紀錄。原本這三條規則只靠模型自律。另修掉一個嚴重缺陷:原本先載入共用函式庫再靠|| true容錯,而 dash 載不到檔案時會就地結束整支殼層,|| true一次都跑不到,回的 2 在寫檔前置鉤子正是「擋下」,等於每一次寫檔與提交都被無聲擋死。改成先確認檔案讀得到再載入hooks/hooks.jsonstage與review接在寫檔工具,把commit接在指令工具。不接線,閘門等於沒有tools/wire-cli.shJSC_READONLY=1唯讀模式:只准status與smoke,清除與接線一律拒絕並回 exit 6,體檢類技能不再靠呼叫端自我約束。冒煙改成自己數結果行並自我斷言,因為散文裡硬寫的舊行數這一輪就誤導過判斷tools/report-error.shhooks/version-guard.shhooks/restart-gate.shhooks/sdlc-gate.shtools/scan-hook-errors.shskills/repair/SKILL.mdskills/hooks-install/SKILL.mdhooks/lib.shhooks/session-timer.shhooks/skill-usage.shhooks/ste100-guard.shtools/scan-logs.shREADME.mdJSC_READONLY、JSC_WRITE_GUARD、JSC_WRITE_GUARD_TTL、JSC_TOOL_COMMAND,並把兩份豁免清單、五道關卡與異常目錄的附加語意一併對齊AGENTS.mdtemplates/error-contents.mdplugin.json.claude-plugin/plugin.json.codex-plugin/plugin.json設計重點
release模式讓稽核技能自己按解除鍵;兩道舊閘門的豁免清單補上 hook 修復技能;跨兩次工具呼叫的整包提交刻意不擋,因為那要記跨呼叫狀態,而被擋下的人沒有辦法讓那個狀態自己消失。hooks/simplified.txt。兩邊各存一份就會漂移。JSC_READONLY=1之下清除與接線直接回 exit 6,不靠呼叫端記得只打status。測試結果
實際跑過、結果如下:
bash -n與dash -n各跑一次hooks/*.sh與tools/*.sh,全部通過(重定基底之後再跑一次,仍全數通過)。hooks/hooks.json都解析得過。.會直接結束整支殼層並回 2,而 bash 會走到後面的容錯,兩者行為確實不同。git add -A接單次提交 exit 2(擋下),三條都與宣告相符。沒有跑、據實列出:
wire-cli.sh smoke {cli}。它會用本機真正的狀態目錄跑一輪,本輪不動使用者環境,所以沒有執行;冒煙的自我斷言條數因此沒有實機驗證過。report-error.sh的 wiki 寫入分流:要有可用的 Gitea 金鑰與可寫的 wiki 才驗得出三條分支,本輪只做程式碼審閱。scan-hook-errors.sh的判定:沒有現成的錯誤紀錄可掃。前置 Push Request