feat/status-event-stream
develop
tools/report-status.sh
drain
rotate
hooks/lib.sh
emit_event
json_escape
hook_status_of
hook_trace
assistant-gate
heartbeat
hooks/skill-usage.sh
start
hooks/version-guard.sh
restart-gate.sh
assistant-gate.sh
deny.sh
JSC_EVENT_STATUS=blocked
README.md
references/behaviors.md
sdlc-gate.sh
set -e
version-guard.sh
PostToolUse(matcher=Skill)
end
printf
detail
tail -c +N
dd bs=1 skip=
ms
exit 0
exit 2
exit 9
report-status.sh
status
.1
restart-gate clear
wire-cli.sh smoke claude
lint-scripts.sh
check-link-format.sh
check-behaviors.sh
ste100-lint.sh
check-page-name.sh
現行紀錄只記「被叫用」,欄位是 ts、cli、session、skill,沒有成敗也沒有 結束碼。跑完整輪的技能與開場就中止的技能,在紀錄裡長得一模一樣。hook 成功時更是完全不留紀錄,只有錯誤路徑會寫 wiki,而那條路徑刻意不自動觸發。 事件流走本機檔案,不直接寫 wiki。hook 每次提示都跑,網路寫入會拖垮宿主 CLI;失敗的 hook 自我回報還會疊出迴圈,既有的錯誤回報因此不接在失敗的 hook 上,這裡沿用同一條線。助理巡檢時排空、彙整、寫頁。 hook 端用 EXIT trap 接,一支只加一行。這幾支的 exit 點很多,階段閘門一支 就有五十幾個;逐點改要動到每一條判定路徑,而那些路徑正是閘門的判準,為了 加一行紀錄去動閘門,風險遠大於收益。trap 涵蓋每一條離開路徑,含中途失敗。 狀態預設由結束碼推,推不出來的由 hook 自己覆寫。相依版本檢查與兩道閘門有 這種情形:antigravity 走 deny JSON、kiro 只印警告,兩者擋下時結束碼都是 0, 單看結束碼會把擋下記成放行。 技能的 start 由既有的技能用量 hook 順手發,不必改任何技能文件。end 只能由 技能自己在收尾步驟寫——hook 觸發時技能的實際工作還在後面的模型輪次,看不到 成敗。有 start 沒有配對的 end,就是那一輪中止了。
No dependencies set.
The note is not visible to the blocked user.
摘要
變更內容
tools/report-status.shdrain與rotatehooks/lib.shemit_event、json_escape、hook_status_of、hook_trace。寫入函式放這裡,hook 才不必在執行期依賴別的 plugin 路徑assistant-gate、heartbeathook_trace,用 EXIT trap 記錄自己的結束碼hooks/skill-usage.shstart事件hooks/version-guard.sh、restart-gate.sh、assistant-gate.shdeny.sh的路徑補JSC_EVENT_STATUS=blocked覆寫README.md、references/behaviors.md設計重點
drain排空。sdlc-gate.sh一支就有五十幾個。逐點改要動到每一條判定路徑,而那些路徑正是閘門的判準;為了加一行紀錄去動閘門,風險遠大於收益。trap 涵蓋每一條離開路徑,含set -e的中途失敗。version-guard.sh檔頭本來就寫明「exit 0 有兩種意思」:antigravity 走 stdout 的 deny JSON、kiro 只印警告,兩者擋下時結束碼都是 0。不覆寫就會把擋下記成放行。start是免費的。PostToolUse(matcher=Skill)在技能指示載入後觸發,那就是開始跑。end只能由技能自己在收尾寫——hook 觸發時技能的實際工作還在後面的模型輪次,看不到成敗。有start沒有配對的end就是中止,那正是現行紀錄分不出來的那一種。printf且壓在 4096 位元組內,五支 CLI 併發時單次 O_APPEND 才不會互相插隊;detail因此截到 200 字元。drain用tail -c +N不用dd bs=1 skip=。 後者是一個位元組一次系統呼叫,位移到幾 MB 就是幾百萬次。測試結果
emit_event四種情況:無ms無detail、有ms、含雙引號與換行與 tab 的detail、500 字元detail。四行都是合法 JSON,跳脫正確,500 字截成 200,最長一行 358 位元組。hook_trace五種離開路徑:exit 0→ ok、exit 2→ blocked、exit 9→ failed、set -e中途失敗 → failed 且結束碼 1、覆寫JSC_EVENT_STATUS=blocked且exit 0→ blocked。五種情況下腳本自己的結束碼都原封不動。report-status.sh參數檢查:非法status、非法結束碼、缺參數、無子命令,四種都回 2 且不寫任何事件。drain:首次吐 3 筆、再寫一筆後只吐新的 1 筆、沒有新事件回 3;輪替後從頭讀得到。位移 5 MB 之後排空耗時 8 ms。rotate:未達上限不動;超過上限改名成.1、位移歸零、新檔可續寫可排空。restart-gate clear。wire-cli.sh smoke claude結束碼 0,139 條斷言全部與預期相同,沒有一條「與預期不同」。九支 hook 的結束碼語意完好。lint-scripts.sh(20 支)、check-link-format.sh、check-behaviors.sh、ste100-lint.sh、check-page-name.sh全部結束碼 0。前置 Push Request