feat(狀態回報): 收尾寫一筆 skill-end 事件

現行紀錄只記「被叫用」,沒有成敗也沒有結束碼。跑完整輪的技能與開場就
中止的技能,在紀錄裡長得一模一樣。

start 由技能用量 hook 順手發,不必改技能文件。end 只能由技能自己在收尾
步驟寫——hook 接在技能工具呼叫上,而實際工作發生在之後的模型輪次,它在
原理上看不到成敗。有 start 沒有配對的 end,就是那一輪中止了。

status 五選一,每支技能各自寫明什麼情況選哪一個。找不到回報腳本就安靜
跳過,回報失敗一律不改變技能自己的結論。
This commit is contained in:
2026-09-02 16:01:18 +08:00
parent 0191e7ba8e
commit f38d1f3087
6 changed files with 102 additions and 22 deletions
+22 -2
View File
@@ -1,7 +1,8 @@
# 階段回報 — 四個階段收尾都要交的東西
規劃、分析、實作、維護跑完,最後一件事一定是階段回報。彙整由 `tools/stage-report.sh` 產出,
技能只負責把事實餵進去:寫過哪些 wiki 頁、有沒有寫工作日誌、實作階段的工作目錄與三條分支。
規劃、分析、實作、維護跑完,最後兩件事固定是這兩筆:先給使用者看的階段回報,再給機器看的
結束事件。階段回報由 `tools/stage-report.sh` 彙整產出,技能只負責把事實餵進去:寫過哪些
wiki 頁、有沒有寫工作日誌、實作階段的工作目錄與三條分支。結束事件見本頁最後一節。
## 什麼時候回報
@@ -61,3 +62,22 @@
| 1 | 有警告(缺工作日誌、實作階段沒有 PR、或清單裡有連不到的連結) | 一樣把輸出貼給使用者,連不到的連結照著修。**這是警告不是阻擋**,階段的工作已經做完了 |
| 2 | 用法錯誤 | 修正參數重跑 |
| 3 | 找不到 `gitea.sh` 或 `sdlc-gate.sh` | 修好相依關係再重跑 |
## 結束事件 — 階段回報之後那一筆
階段回報是給人看的,結束事件是給機器看的。跑完階段回報,緊接著跑
`jsc-hooks/tools/report-status.sh skill-end jsc-sdlc:{技能名} {status} {結束碼} [detail]`,
一筆寫進 `$JSC_HOME/usage/events.jsonl`。腳本名怎麼寫,比照各技能既有寫
`jsc-hooks/hooks/sdlc-gate.sh` 的方式,不另立一套。
為什麼非得由技能自己寫:配對的 `skill-start` 由 jsc-hooks 自己記,但那個 hook 接在技能工具
呼叫之後就觸發,實際工作還在後面的模型輪次,所以**沒有任何 hook 看得到階段怎麼結束**。
有 `start` 沒有配對的 `end`,在紀錄裡就是中止;收尾少寫這一筆,跑完的階段每一次都會被算成中止。
| 項目 | 規則 |
| --- | --- |
| `status` | `ok`、`blocked`、`failed`、`degraded`、`aborted` 五選一。哪一種情況選哪一個,各技能 SKILL.md 的收尾步驟有自己的對應表,那張表是唯一判準 |
| 模型閘門擋下 | 一律 `blocked`,不是 `failed`。閘門擋下不合格的模型是閘門在做事,記成失敗會讓下一手去找一個不存在的缺陷 |
| `{結束碼}` | 判定該狀態的那支腳本的結束碼;沒有任何腳本回非 0 就填 `0`,`ok` 與 `aborted` 都是這種 |
| `[detail]` | 選填,繁體中文單行,講清楚是什麼決定了這個狀態。腳本截到 200 字元,長內容不要塞 |
| 失敗怎麼辦 | **這一步失敗不改變本次階段的結論。** 找不到腳本就安靜跳過,不回報也不重跑任何步驟。三個記錄子命令本來就設計成寫檔失敗也回 0,所以回非 0 只代表呼叫本身寫錯了(`2` 是用法錯誤),修一次參數就好 |