feat(meta): 新增 SKILLSET 頁型與稽核流程檢查,四支異動技能收尾寫異動報告 #25

Merged
admin merged 4 commits from feat/skillset-governance/page-type-and-process-audit into feat/skillset-governance/main 2026-08-27 08:39:08 +00:00
Member

feat(meta): 新增 SKILLSET 頁型與稽核流程檢查,四支異動技能收尾寫異動報告

摘要

  • 需求描述:使用者 15 條規則第三群「技能組治理」在 jsc-meta 的落地,共四條。R13 新增 SKILLSET 頁型(SKILLSET_CONTENTS、SKILLSET_{HASH},雜湊來源 {owner}/{repo},頁內累積歷次異動),並要求 skill-new、skill-update、skill-delete、skillset-update 四支收尾強制套用到工作階段、驗證、寫報告;R14 稽核清單新增流程檢查四項(指標指得到、每步有完成條件、退路與失敗分流、閘門不自鎖);R12 sync-marketplace.sh 列為 skill-check 的必經步驟;R15 部署後強制重啟閘門的規則正文、九支豁免清單與 JSC_RESTART_GATE。決策紀錄在 wiki knowledges/QUESTION 的 QUESTION_FB8DF0B5。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
references/guidelines.md 準則是這批規則的唯一真實來源。新增 JSC_WIKI_REPO_SKILLSET、JSC_RESTART_GATE 兩個環境變數列、wiki 頁命名總表的 SKILLSET 一列與雜湊來源說明、「部署後重啟閘門」一節(含九支豁免表與「清單認技能名不認呼叫鏈」),以及審核檢查清單的流程檢查四項
skills/skill-check/SKILL.md sync-marketplace.sh 原本不在任何流程裡,跑不跑全憑人記得,改列為必經的第 5 步並逐一分流四個結束碼;第 2 步的稽核範圍明寫要涵蓋流程檢查四項,準則加了項目稽核才查得到
skills/skill-new/SKILL.md 收尾原本止於開 PR,改動沒進到任何 CLI 就結案。新增第 6 步:套用到工作階段、逐項驗證、把結果附加到 SKILLSET_{HASH}
skills/skill-update/SKILL.md 同上,新增第 8 步的三個子步驟,驗證改的是 list-skills.sh 的 description 與被動到的工具
skills/skill-delete/SKILL.md 同上,新增第 9 步;驗證要確認被刪技能不再列出,且第 5 步修過的每一個呼叫端照樣跑得完
skills/skillset-update/SKILL.md 同上,新增第 6 步;跨 domain 的改動要等最後一個存取庫合併才到得了 CLI,所以未合併的發佈 PR 要全部點名,報告一個 domain 一份
plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 行為變更要升版,各 CLI 才知道要更新;0.1.3 升到 0.1.4,三份同版號

設計重點

  • 收尾分兩條路徑,不是一律 deploy。 marketplace 與 version-guard.sh 都讀存取庫的預設分支(master),PR 停在 develop 時 jsc-cli:deploy 一定看不到這次的改動,「plugin list 印出新版號」這個完成條件永遠達不到,流程會卡死。所以已合併到 master 走 deploy,還沒到 master 就改用工作樹驗證,報告標「工作樹驗證、尚未部署」並點名還沒合併的發佈 PR。
  • 報告一律附加,不覆蓋。 SKILLSET_{HASH} 的雜湊來源是被改動的 domain 存取庫 {owner}/{repo},一個存取庫一頁;每次異動附加一節,要看一支技能改過幾次就在同一頁上翻。寫不進去時把頁名與未寫入的內容交回使用者,這一步留著不結案,不讓「報告沒寫成」被當成完成。
  • 豁免清單寫理由,不只寫名字。 九支的理由收斂成同一件事:部署後還要寫得完技能組異動報告(R13)與工作日誌(R1),整批擋下去兩條規則互相打死。通則寫進流程檢查第 4 項「閘門不自鎖」,日後任何新閘門都適用。
  • 豁免清單認技能名,不認呼叫鏈。 豁免技能轉呼叫的下一層若不在清單上,那一層照樣被擋。後三支(jsc-ask:ask、jsc-git:pr、jsc-git:commit)自己不是收尾規則的主體,是為了讓前六支走得完才補進來的,準則裡單獨寫一段提醒日後增豁免時要一併想它會呼叫誰。
  • 流程檢查附踩過的實例。 「指標指得到」與「閘門不自鎖」各附一個實例(規則搬到 references/ 後指標指向空處、工作包閘門若擋掉 implement 就結不了 PR),抽象敘述判不出來的,看實例就判得出來。
  • marketplace 同步用冪等呼叫。 拿既有項目自己現在的值重寫一次,正本兩份與各 domain 的副本一起重寫並驗位元組相同,不必先判斷哪一筆該改。

測試結果

  • tools/ste100-lint.sh 對本存取庫全綠。
  • 三份 manifest 版本一致為 0.1.4。
  • 四個 domain(meta、cli、hooks、gitea)的 ste100-lint.sh 全綠,三份 manifest 版本各自一致。
  • 本次跨 domain 的規則正文與實作對齊實測見前置 PR:restart-gate.sh 的九支豁免與逃生門、gitea.sh wiki-repo SKILLSET 的三項判定,都與準則寫的一致。
  • 準則新增的流程檢查四項,已對本次改動的五支技能逐項自查通過(步驟編號順延後的內外引用、每步的完成條件、每個外部呼叫的結束碼分流、收尾步驟沒有擋掉自己的唯一路徑)。

前置 Push Request

# feat(meta): 新增 SKILLSET 頁型與稽核流程檢查,四支異動技能收尾寫異動報告 ## 摘要 - 需求描述:使用者 15 條規則第三群「技能組治理」在 `jsc-meta` 的落地,共四條。R13 新增 `SKILLSET` 頁型(`SKILLSET_CONTENTS`、`SKILLSET_{HASH}`,雜湊來源 `{owner}/{repo}`,頁內累積歷次異動),並要求 `skill-new`、`skill-update`、`skill-delete`、`skillset-update` 四支收尾強制套用到工作階段、驗證、寫報告;R14 稽核清單新增流程檢查四項(指標指得到、每步有完成條件、退路與失敗分流、閘門不自鎖);R12 `sync-marketplace.sh` 列為 `skill-check` 的必經步驟;R15 部署後強制重啟閘門的規則正文、九支豁免清單與 `JSC_RESTART_GATE`。決策紀錄在 wiki `knowledges/QUESTION` 的 `QUESTION_FB8DF0B5`。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `references/guidelines.md` | 準則是這批規則的唯一真實來源。新增 `JSC_WIKI_REPO_SKILLSET`、`JSC_RESTART_GATE` 兩個環境變數列、wiki 頁命名總表的 `SKILLSET` 一列與雜湊來源說明、「部署後重啟閘門」一節(含九支豁免表與「清單認技能名不認呼叫鏈」),以及審核檢查清單的流程檢查四項 | | `skills/skill-check/SKILL.md` | `sync-marketplace.sh` 原本不在任何流程裡,跑不跑全憑人記得,改列為必經的第 5 步並逐一分流四個結束碼;第 2 步的稽核範圍明寫要涵蓋流程檢查四項,準則加了項目稽核才查得到 | | `skills/skill-new/SKILL.md` | 收尾原本止於開 PR,改動沒進到任何 CLI 就結案。新增第 6 步:套用到工作階段、逐項驗證、把結果附加到 `SKILLSET_{HASH}` | | `skills/skill-update/SKILL.md` | 同上,新增第 8 步的三個子步驟,驗證改的是 `list-skills.sh` 的 `description` 與被動到的工具 | | `skills/skill-delete/SKILL.md` | 同上,新增第 9 步;驗證要確認被刪技能不再列出,且第 5 步修過的每一個呼叫端照樣跑得完 | | `skills/skillset-update/SKILL.md` | 同上,新增第 6 步;跨 domain 的改動要等最後一個存取庫合併才到得了 CLI,所以未合併的發佈 PR 要全部點名,報告一個 domain 一份 | | `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` | 行為變更要升版,各 CLI 才知道要更新;0.1.3 升到 0.1.4,三份同版號 | ## 設計重點 - **收尾分兩條路徑,不是一律 `deploy`。** marketplace 與 `version-guard.sh` 都讀存取庫的預設分支(`master`),PR 停在 `develop` 時 `jsc-cli:deploy` 一定看不到這次的改動,「`plugin list` 印出新版號」這個完成條件永遠達不到,流程會卡死。所以已合併到 `master` 走 `deploy`,還沒到 `master` 就改用工作樹驗證,報告標「工作樹驗證、尚未部署」並點名還沒合併的發佈 PR。 - **報告一律附加,不覆蓋。** `SKILLSET_{HASH}` 的雜湊來源是被改動的 domain 存取庫 `{owner}/{repo}`,一個存取庫一頁;每次異動附加一節,要看一支技能改過幾次就在同一頁上翻。寫不進去時把頁名與未寫入的內容交回使用者,這一步留著不結案,不讓「報告沒寫成」被當成完成。 - **豁免清單寫理由,不只寫名字。** 九支的理由收斂成同一件事:部署後還要寫得完技能組異動報告(R13)與工作日誌(R1),整批擋下去兩條規則互相打死。通則寫進流程檢查第 4 項「閘門不自鎖」,日後任何新閘門都適用。 - **豁免清單認技能名,不認呼叫鏈。** 豁免技能轉呼叫的下一層若不在清單上,那一層照樣被擋。後三支(`jsc-ask:ask`、`jsc-git:pr`、`jsc-git:commit`)自己不是收尾規則的主體,是為了讓前六支走得完才補進來的,準則裡單獨寫一段提醒日後增豁免時要一併想它會呼叫誰。 - **流程檢查附踩過的實例。** 「指標指得到」與「閘門不自鎖」各附一個實例(規則搬到 `references/` 後指標指向空處、工作包閘門若擋掉 `implement` 就結不了 PR),抽象敘述判不出來的,看實例就判得出來。 - **marketplace 同步用冪等呼叫。** 拿既有項目自己現在的值重寫一次,正本兩份與各 domain 的副本一起重寫並驗位元組相同,不必先判斷哪一筆該改。 ## 測試結果 - `tools/ste100-lint.sh` 對本存取庫全綠。 - 三份 manifest 版本一致為 0.1.4。 - 四個 domain(meta、cli、hooks、gitea)的 `ste100-lint.sh` 全綠,三份 manifest 版本各自一致。 - 本次跨 domain 的規則正文與實作對齊實測見前置 PR:`restart-gate.sh` 的九支豁免與逃生門、`gitea.sh wiki-repo SKILLSET` 的三項判定,都與準則寫的一致。 - 準則新增的流程檢查四項,已對本次改動的五支技能逐項自查通過(步驟編號順延後的內外引用、每步的完成條件、每個外部呼叫的結束碼分流、收尾步驟沒有擋掉自己的唯一路徑)。 ## 前置 Push Request - plugins/gitea#25 https://gitea.jsc.idv.tw/plugins/gitea/pulls/25(SKILLSET 頁型的允許清單在那支 PR) <!-- 有前置 PR 時必須同時以 gitea.sh pr-depend 掛上依賴;依賴未關閉前 Gitea 會阻擋本 PR 合併。 -->
jiantw83 added 4 commits 2026-08-27 08:34:41 +00:00
What:`references/guidelines.md` 四處增修。環境變數表新增 `JSC_WIKI_REPO_SKILLSET` 與 `JSC_RESTART_GATE` 兩列;wiki 頁命名總表新增 `SKILLSET` 一列,並補上雜湊來源為被改動的 domain 存取庫 `{owner}/{repo}`、頁內累積歷次異動兩段說明;新增「部署後重啟閘門」一節,用表寫下狀態檔、清除時機、判定位置與逃生門,另附九支豁免技能的表與「清單認的是技能名,不是呼叫鏈」一段;審核檢查清單末尾新增流程檢查四項。

Why:這批規則要落到四個 domain 的腳本與技能裡,準則是它們的唯一真實來源。規則只留在各自的實作裡,改一邊忘一邊,稽核就沒有對照標準。三件事各有各的理由:`SKILLSET` 頁型讓技能組每次異動留下查得到的驗證紀錄;重啟閘門補上「部署換掉的是磁碟上的技能檔,工作階段載入的還是舊版」這段落差;流程檢查四項把過去踩過的坑寫成逐項確認得出來的項目。

How:閘門那一節刻意把每一支的「為什麼不能擋」逐支寫出來,不只列技能名——豁免清單日後要增刪,理由沒寫下來就得重新想一次。九支的理由收斂成同一件事:部署後還要寫得完技能組異動報告與工作日誌,整批擋下去「先重啟」與「先寫完報告」會互相打死,通則另外寫進流程檢查第 4 項「閘門不自鎖」。「清單認技能名不認呼叫鏈」單獨寫一段,因為後三支(`jsc-ask:ask`、`jsc-git:pr`、`jsc-git:commit`)自己不是收尾規則的主體,是為了讓前六支走得完才補進來的,日後增豁免時要一併想它會呼叫誰。流程檢查其中兩項附上踩過的實例,抽象敘述判不出來的,看實例就判得出來。

Who:`jsc-meta` 的技能準則,以及依準則稽核的 `skill-check` 與四支技能組異動技能。
What:`skills/skill-check/SKILL.md` 兩處增修。第 2 步的稽核範圍明寫要逐項涵蓋準則的流程檢查四項,四項各列一條,完成條件改成「每個 domain 的稽核結果對所有清單項目都有結論,含這四項」;新增第 5 步「同步 marketplace 正本」,四個結束碼各自寫明怎麼處理,原本的複查與開 PR 順延為第 6、7 步。

Why:`sync-marketplace.sh` 原本沒有出現在任何技能流程裡,跑不跑全憑人記得。正本在 `plugins/meta`,每個 domain 存取庫各留一份位元組完全相同的副本,稽核改完不同步,就會有存取庫註冊到過期的 plugin 清單。流程檢查四項同理:準則加了項目,稽核不點名就沒有人會查,四項等於沒加。

How:同步列為必經步驟,不是選項。呼叫時拿既有項目自己現在的值重寫一次,重寫同一筆是冪等的,所以不必先判斷哪一筆該改。四個結束碼逐一分流:3 是寫好了但有 domain 沒 clone 到本機,先跑 `sync-domains.sh` 再重跑;2 是參數個數不對;1 是缺 python3、正本讀不到或副本位元組不一致;0 才代表每份副本完全相同,而且是腳本自己驗過的。

Who:`jsc-meta:skill-check` 的例行合規稽核流程。
What:`skill-new`、`skill-update`、`skill-delete`、`skillset-update` 四支各新增一個收尾步驟,內含三個子步驟:把改動套用到目前工作階段、逐項驗證功能真的動得起來、把驗證結果附加到 wiki 的 `SKILLSET_{HASH}`。四支的 `description` 同步補上這段收尾。

Why:原本四支都以「開了 PR」作為收尾。PR 開完技能還沒進到任何 CLI,改動到底動不動得起來沒人驗過,壞了要等下一次有人踩到才知道。技能組的異動紀錄也一樣沒有落腳處:同一支技能改過幾次、每次改了什麼,只能翻 git 紀錄。

How:套用那一步分兩條路徑,依改動走到哪裡決定。PR 已經合併到 `master` 才走 `jsc-cli:deploy` 更新模式,並依提示重新啟動;PR 還停在 `develop` 或還在等審核,就改用工作樹驗證,報告標成「工作樹驗證、尚未部署」,並點名還沒合併的發佈 PR。分兩條路徑的理由是完成條件達不到:marketplace 與 `version-guard.sh` 都讀存取庫的預設分支,停在 `develop` 的改動 `deploy` 一定看不到,硬跑就卡在永遠達不到的完成條件上。驗證那一步要求逐項比對結束碼與實際輸出,不接受「跑完沒報錯」;對不上就回到套用那一步重跑,不往下走。報告一律附加一節、不覆蓋舊節,要看一支技能改過幾次就在同一頁上翻;寫不進去就把頁名與未寫入的內容交回使用者,這一步留著不結案。

Who:`jsc-meta` 的四支技能組異動技能,以及日後查技能組異動紀錄的人。
What:`plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` 的 `version` 由 0.1.3 改為 0.1.4。

Why:本次準則新增 `SKILLSET` 頁型、部署後重啟閘門與流程檢查四項,`skill-check` 多了 marketplace 同步必經步驟,四支異動技能也多了收尾步驟,屬於行為變更,版本要跟著往上走,各 CLI 才知道要更新。

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

Who:`jsc-meta` 外掛的套件描述檔。
jiantw83 added a new dependency 2026-08-27 08:34:55 +00:00
admin merged commit 0ce64ba392 into feat/skillset-governance/main 2026-08-27 08:39:08 +00:00
admin deleted branch feat/skillset-governance/page-type-and-process-audit 2026-08-27 08:39:08 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: plugins/meta#25