feat(狀態回報): 收尾寫一筆 skill-end 事件
現行紀錄只記「被叫用」,沒有成敗也沒有結束碼。跑完整輪的技能與開場就 中止的技能,在紀錄裡長得一模一樣。 start 由技能用量 hook 順手發,不必改技能文件。end 只能由技能自己在收尾 步驟寫——hook 接在技能工具呼叫上,而實際工作發生在之後的模型輪次,它在 原理上看不到成敗。有 start 沒有配對的 end,就是那一輪中止了。 status 五選一,每支技能各自寫明什麼情況選哪一個。找不到回報腳本就安靜 跳過,回報失敗一律不改變技能自己的結論。
This commit is contained in:
@@ -114,21 +114,57 @@ PR 開立、更新、留言修正的收尾回報格式只看 [`references/pr-rep
|
||||
| 節 | 每支技能一個 `## {技能名}` 節,名稱與 `skills/` 底下的目錄名逐字相同,節數與技能支數一樣,排列照目錄名的字典序 |
|
||||
| 表格 | 每節恰好一張表,表頭兩欄依序是「項目」與「內容」,五列依序為 觸發時機、關鍵步驟、外部呼叫、完成條件、可驗證跡象,每一列的「內容」欄都不得空白 |
|
||||
| 寫什麼 | 寫技能實際的行為:什麼情況會用、什麼情況不該用、依序做了哪些事、呼叫哪些腳本與技能、做到什麼程度算跑完、跑完在環境裡留下哪些查得到的跡象。不要抄 `description` 的行銷語 |
|
||||
| 純唯讀的技能 | 「可驗證跡象」欄寫「無寫入跡象,只有回報內容」,不得留白 |
|
||||
| 純唯讀的技能 | 「可驗證跡象」欄寫「除了收尾的 `skill-end` 事件以外沒有寫入跡象,只有回報內容」,不得留白。收尾事件是每支技能都有的那一筆,唯讀技能也不例外 |
|
||||
| 更新時機 | 技能異動時在**同一個 PR 內**一起更新:新增技能就加一節、刪除就移除該節、改行為就改該節 |
|
||||
| 收尾事件 | 「可驗證跡象」那一列要寫到收尾的 `skill-end` 事件或 `events.jsonl`,規則見「執行狀態回報」一節 |
|
||||
| 檢查腳本 | `jsc-meta/tools/check-behaviors.sh {domain-path}` |
|
||||
|
||||
`check-behaviors.sh` 的結束碼分流:
|
||||
|
||||
| 結束碼 | 意義 |
|
||||
| --- | --- |
|
||||
| 0 | 行為清單與 `skills/` 相符,五個欄位齊全且內容欄非空 |
|
||||
| 1 | 不符:缺節、多節、順序不對、表格不對、缺欄位或欄位空白,逐項印在 stderr,照著修再重跑 |
|
||||
| 0 | 行為清單與 `skills/` 相符,五個欄位齊全、內容欄非空,且每一節的「可驗證跡象」都寫了收尾的 `skill-end` 事件 |
|
||||
| 1 | 不符:缺節、多節、順序不對、表格不對、缺欄位、欄位空白,或「可驗證跡象」沒寫到收尾的 `skill-end` 事件,逐項印在 stderr,照著修再重跑 |
|
||||
| 2 | 用法錯誤:本腳本只吃一個參數 |
|
||||
| 3 | 找不到 `references/behaviors.md`、找不到 `skills/`,或 `skills/` 底下一支 `SKILL.md` 都沒有。**什麼都沒查,不等於通過**,先補齊檔案再重跑 |
|
||||
|
||||
**為什麼一個 domain 一份,不集中在 `jsc-meta`。** 技能改動與行為清單放同一個存取庫,才進得了同一個 PR;審的人在一頁 diff 上就看得出行為改了、清單也改了。集中在 meta 的話,改一支技能要開兩條 PR,一條在 domain、一條在 meta,兩條互相等待,先併的那條讓清單與技能對不上,稽核抓到的是自己造出來的漂移。跨存取庫的東西沒有原子性,同一份事實就不要拆兩邊放。
|
||||
|
||||
## 執行狀態回報
|
||||
|
||||
技能與 hook 每跑一次都要在本機事件流留下結果,助理巡檢再排空、彙整、寫監控頁。
|
||||
事件流是 `$JSC_HOME/usage/events.jsonl`,一次一行,只增不改。
|
||||
|
||||
| 項目 | 規則 |
|
||||
| --- | --- |
|
||||
| 誰寫 `start` | `jsc-hooks/hooks/skill-usage.sh`。技能被叫用的當下就寫,SKILL.md 一個字都不必改 |
|
||||
| 誰寫 `end` | **技能自己在收尾步驟寫**,一次執行一筆 |
|
||||
| 怎麼寫 | `{jsc-hooks 路徑}/tools/report-status.sh skill-end jsc-{domain}:{技能名} {status} {結束碼} [detail]` |
|
||||
| 路徑怎麼解 | 沿用該技能原本呼叫別的 plugin 腳本的那一套,不另外發明一種 |
|
||||
| 找不到腳本 | 安靜跳過,照常收尾。回報機制不在場,不可以讓被回報的技能跟著失敗 |
|
||||
| 回報自己失敗 | 一樣吞掉。這支腳本的三個記錄子命令一律回 0,呼叫端不得因為它的結束碼改變自己的結局 |
|
||||
| `detail` | 選填,單行,最多 200 字。長內容另存別處,不要塞進這一行 |
|
||||
| 寫進行為清單 | 該技能在 `references/behaviors.md` 的「關鍵步驟」「完成條件」「可驗證跡象」三列都要提到這一筆事件 |
|
||||
| 檢查腳本 | `jsc-meta/tools/check-behaviors.sh {domain-path}` 斷言「可驗證跡象」那一列寫到 `skill-end` 或 `events.jsonl` |
|
||||
|
||||
`status` 五選一,SKILL.md 要逐項寫清楚這支技能什麼情況選哪一個:
|
||||
|
||||
| status | 什麼時候用 |
|
||||
| --- | --- |
|
||||
| `ok` | 完成條件全部達成 |
|
||||
| `blocked` | 被閘門或前置條件擋下,沒有做事。例如版本前置檢查擋下、相依 PR 未合併 |
|
||||
| `failed` | 做到一半失敗。例如 API 回非預期狀態、寫入失敗 |
|
||||
| `degraded` | 做完了但有部分沒達成。例如內容頁寫成功、目錄頁沒更新 |
|
||||
| `aborted` | 使用者中止,或前提不成立而主動停止 |
|
||||
|
||||
**`end` 為什麼不能由 hook 代勞。** hook 接在技能工具呼叫之後就觸發,那一刻技能的實際工作
|
||||
還在後面的模型輪次,成敗根本還沒發生。hook 在原理上看不到結果,寫得出來的只有「開始跑了」。
|
||||
所以 `start` 是免費的,`end` 躲不掉要由技能自己寫。
|
||||
|
||||
**有 `start` 沒有配對的 `end`,就是中止。** 這正是這條規則要補的洞:現行紀錄只記「被叫用」,
|
||||
跑完整輪的技能與開場就停的技能長得一模一樣。收尾少寫這一筆,那支技能每一次都會被算成中止,
|
||||
而且不會有任何錯誤訊息——助理讀到的是一串沒有結局的技能,看起來像整組技能都在半路死掉。
|
||||
|
||||
## 環境變數
|
||||
|
||||
| 變數 | 用途 | 未設定時 |
|
||||
@@ -458,6 +494,7 @@ kiro 是唯一真的擋不了的,verdict 據實寫 `degraded`,不寫 `wired`
|
||||
- [ ] SKILL.md 整份為英文(要原樣輸出的繁中字面除外);README、AGENTS、templates、references 為 STE100 繁中;UTF-8 無亂碼
|
||||
- [ ] 所有非程式碼輸出(程式碼註解、commit 訊息、PR 描述、wiki 頁、回報、文件)為繁體中文、UTF-8、無亂碼、無簡體字,且 `tools/ste100-lint.sh` 對該 domain 全綠
|
||||
- [ ] 該 domain 的 `references/behaviors.md` 與 `skills/` 相符,`tools/check-behaviors.sh {domain-path}` 對該 domain 退出 0;退出 3 是「什麼都沒查」,不算通過
|
||||
- [ ] 每支技能的收尾步驟都呼叫 `{jsc-hooks 路徑}/tools/report-status.sh skill-end jsc-{domain}:{技能名} {status} {結束碼}`,`status` 五選一且 SKILL.md 寫明哪一種情況選哪一個,找不到腳本安靜跳過、不讓技能跟著失敗;該技能的「關鍵步驟」「完成條件」「可驗證跡象」三列都寫到這一筆事件。規則見「執行狀態回報」
|
||||
- [ ] 該 domain 每支 `skills/*/SKILL.md` 的 frontmatter 解析得動,`tools/lint-frontmatter.sh {domain-path}` 對該 domain 退出 0;退出 3 是「什麼都沒掃」,不算通過。frontmatter 有語法錯誤時,Antigravity 會**靜默丟棄整支技能**,沒有任何錯誤訊息,只有這支腳本抓得到
|
||||
- [ ] 已同步更新該 domain 的 README「Skills 目錄」與三份 manifest 的 version
|
||||
- [ ] PR 的 base 符合「PR 分支階梯」,沒有越級
|
||||
|
||||
Reference in New Issue
Block a user