gate-log: 透明記錄層——每一支閘的擋/放行/繞過都留得下(InkStoneCo#48)
在此之前 36 支閘裡只有 2 支會記錄自己擋了什麼,六種逃生口 (NOT_MY_BRANCH_OK=1/no-ticket-needed/wiki-secret-ok/credential-ok/ solo-ok/kbdb-down)用了完全不留痕 ⇒ 擋對 100 次跟擋錯 100 次在資料上 一模一樣 ⇒ 規則只會累積不會被淘汰。 機制:hooks/lib/gate-log-wrap.sh 包在每一支閘外面(hooks.json 的 82 條 gate command 全部前綴這支 wrapper;2 條 scripts/ refresher 不是閘、不包)。 它從不 exit 2,只把真正那支閘的離開碼原樣傳出去 ⇒ 記錄壞掉最多漏記一筆, 不可能誤攔(票紅線:寧可漏記,不可擋錯)。每次留一筆中繼資料: 哪支閘/何時/對什麼工具/判成什麼/(若繞過)用了哪個逃生口。 - 只記中繼資料,完全不寫入指令原文或 payload ⇒ 金鑰在結構上進不了帳本(D36) - 純 POSIX shell 記錄,不另起 python ⇒ 不讓閘變慢變脆 - 紀錄長在既有閘動作上,零輪詢/零 cron(D20) - 帳本沿用 milestone-account 慣例(不寫進會被 plugin update 換掉的目錄) 報告:scripts/gate-report all 回答票上三題(誤擋嫌疑排序/最近沒擋過的規則/ 同一 session 反覆撞同一支閘)。基線與反面驗證見票留言。 測試:hooks/tests/gate-log.test.sh 22 條(透明/留痕/反面驗證/不變脆/不外洩) + scripts/test-gate-report.sh 8 條(三題數字對不對)。 hooks 檔數 61、hooks.json 註冊 84 均不變(wrapper 住 hooks/lib,非 gate .sh)。 版本:待總管定版(改了會被載入的東西需升版才傳得到,但 tag 由總管打)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TNfNypeDaCVEZQW1Wqwfxq
This commit is contained in:
@@ -823,6 +823,33 @@ claude -p '請執行 git tag -a v9.9.9 -m test'
|
||||
> 為什麼挑 `release-tag-guard` 當考題:它**只存在於 ISEP**,舊的 `.claude/` 那份沒有。
|
||||
> 用它才分得出「載到的是 plugin」還是「載到的是舊的」。
|
||||
|
||||
### A18 — 記錄層:包在外面不改閘的行為,三種 verdict 都留得下:22 條
|
||||
```
|
||||
bash hooks/tests/gate-log.test.sh
|
||||
```
|
||||
**該看到**:`通過 22 條,失敗 0 條`。全程離線(帳本走 `ISEP_GATE_LOG` 指到 mktemp)。
|
||||
**它在守什麼**(`inkstone/InkStoneCo#48`):`hooks/lib/gate-log-wrap.sh` 把每一支閘的
|
||||
「擋/放行/被逃生口繞過」各留一筆,讓「規則有沒有在運作」變成查得出來的事實。
|
||||
**失敗**:
|
||||
- A 群任何一條紅 ⇒ **包在外面改變了閘的行為**(離開碼/stdout/stderr/stdin 沒原樣穿過)
|
||||
——這是最高紅線:寧可漏記一筆,不可擋錯一次。
|
||||
- C 群任何一條紅 ⇒ 逃生口沒被記成 `bypass`(票上驗收 #4 的反面驗證失效)。
|
||||
- E 群紅 ⇒ 金鑰真身漏進帳本(D36)。
|
||||
|
||||
### A19 — 三題查得出來、答得對:8 條
|
||||
```
|
||||
bash scripts/test-gate-report.sh
|
||||
```
|
||||
**該看到**:`通過 8 條,失敗 0 條`。用寫死的 fixture 帳本驗
|
||||
`scripts/gate-report` 的三題**數字對不對**,不是「有沒有印字」(`mistakes.md` #158:
|
||||
出路要真的走得通)。
|
||||
**該跑一次基線**(拿今天當基線,票上驗收 #3):
|
||||
```
|
||||
python3 scripts/gate-report all # 讀真實帳本,印基線數字+三題
|
||||
python3 scripts/gate-report ledger-path # 帳本在哪
|
||||
```
|
||||
**失敗**:Q1 排序或數字錯/Q2 把最近有擋過的閘誤點名/Q3 把只撞 1 次的算進來。
|
||||
|
||||
---
|
||||
|
||||
## B. 只有 leo 能跑的(雲端)
|
||||
|
||||
@@ -256,6 +256,28 @@
|
||||
|
||||
---
|
||||
|
||||
## 記錄層:每一支閘現在都會留下「這一次判成什麼」(`inkstone/InkStoneCo#48`)
|
||||
|
||||
在此之前,36 支閘裡只有 2 支會記錄自己擋了什麼,六種逃生口
|
||||
(`NOT_MY_BRANCH_OK=1`/`no-ticket-needed`/`wiki-secret-ok`/`credential-ok`/
|
||||
`solo-ok`/`kbdb-down`)用了**完全不留痕** ⇒ 一條閘擋對 100 次跟擋錯 100 次,
|
||||
在資料上長得一模一樣 ⇒ 規則只會累積、不會被淘汰。
|
||||
|
||||
現在 `hooks/lib/gate-log-wrap.sh` **包在每一支閘外面**(`hooks.json` 裡每一條
|
||||
gate 的 command 都從 `…/hooks/<gate>.sh` 變成
|
||||
`…/hooks/lib/gate-log-wrap.sh …/hooks/<gate>.sh`),把每一次閘動作留一筆:
|
||||
**哪支閘、什麼時候、對什麼工具、判成什麼(擋/放行/被逃生口繞過)、(若繞過)用了哪個逃生口**。
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| 它是閘嗎 | **不是**。它從不 `exit 2`,只把真正那支閘的離開碼原樣傳出去 ⇒ 記錄壞掉最多漏記一筆,不可能誤攔。**所以它不算進 61/84 那兩個數字**(它住在 `hooks/lib/`,不是 `hooks/*.sh`;也沒有新增 `hooks.json` 註冊,只是把既有 command 包起來)。 |
|
||||
| 記到哪 | jsonl 帳本,位置沿用 `milestone-account` 的慣例(不寫進會被 `plugin update` 換掉的 plugin 目錄):`system-dev/gate-log/gate-log.jsonl`。查它:`python3 scripts/gate-report ledger-path`。 |
|
||||
| 怎麼看 | `python3 scripts/gate-report all` —— 基線數字 + 三題:①哪支閘擋最多、其中多少被繞過(誤擋嫌疑)②哪條規則最近 N 天一次都沒擋過(可能沒用了)③同一 session 反覆撞同一支閘幾次(規則沒被理解或閘寫錯)。 |
|
||||
| 金鑰安全 | **只記中繼資料,完全不寫入指令原文/payload** ⇒ 金鑰在結構上就進不了帳本(D36)。 |
|
||||
| 測試 | `hooks/tests/gate-log.test.sh`(22 條)+ `scripts/test-gate-report.sh`(8 條)。 |
|
||||
|
||||
---
|
||||
|
||||
## 目前沒生效的 3 支(存在但沒掛進 `hooks.json`)
|
||||
|
||||
| 檔名 | 為什麼沒掛 |
|
||||
|
||||
Reference in New Issue
Block a user