From fa2f76177e69c19d42eb7b972f0556d9728af983 Mon Sep 17 00:00:00 2001 From: richblack Date: Thu, 27 Aug 2026 18:35:49 +0800 Subject: [PATCH] =?UTF-8?q?docs(inventory):=20=E5=8F=8D=E5=90=91=E9=82=A3?= =?UTF-8?q?=E5=8D=8A=E8=A3=9C=E4=B8=8A=E7=9C=9F=E6=AD=A3=E9=A9=97=E5=BE=97?= =?UTF-8?q?=E5=88=B0=E5=B9=BD=E9=9D=88=E7=9A=84=E9=82=A3=E4=B8=80=E6=A0=BC?= =?UTF-8?q?=EF=BC=88=E7=B8=BD=E7=AE=A1=E8=A4=87=E9=A9=97=E9=80=80=E5=9B=9E?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 總管複驗指出反向 comm 有 3 個輸出。實跑重現了,但逐個查過之後: **三個都不是幽靈,三個都不該刪。** claim-verify-police.sh / subagent-claim-worksheet.sh → 全部 5 處都在內文,講的是「已於 ISEP#60 移除」。表格列(第一欄) 命中數 = 0。刪掉它們等於刪掉「G 組為什麼是空的」這段歷史。 github-arm.sh → 它存在,在 scripts/ 不在 hooks/;出現在 github-contact-guard 那一列的 描述裡,是告訴人「怎麼解鎖」的逃生口。刪掉那一列就不再說得出怎麼過閘。 成因是那組 grep 拿掉了 `^\| \`` 錨點。有錨點=「這一行的第一欄就是這支閘」= 表格真的列了它;沒錨點=全頁所有反引號。**0 次正確攔截、3 次誤攔。** 但「頁面上出現根本不存在的檔名」確實該被抓到,只是不能靠文字判斷。 本次補上第三格 C:頁面提到的每個 *.sh,要嘛現在存在,要嘛 git 歷史裡存在過。 **「現在沒有但曾經有」=歷史;「從來沒有過」=幽靈。** 它問的是 git 不是用字。 順帶:標頭區那個 43 是 2026-08-20 快照段落裡的歷史數字,不是現況宣稱, 但原文用現在式讀起來像現況 ⇒ 加上「這一段每個數字都是那天的」標記。 實測(含兩個反向對照,證明新那格不是橡皮圖章): 現況 A1[] A2[] C[] 48 檔 / 48 列 表格種一支假閘 A2 與 C 都叫 散文種一支假閘 A1/A2 抓不到、C 抓到 ← 只有 C 守得住這種 18 個測試檔 0 失敗;claude plugin validate 通過。 inkstone/ISEP#75(總管複驗 comment 4822) --- docs/hooks-inventory.md | 42 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/docs/hooks-inventory.md b/docs/hooks-inventory.md index 87cb217..991e3b0 100644 --- a/docs/hooks-inventory.md +++ b/docs/hooks-inventory.md @@ -203,10 +203,44 @@ $ comm -13 /tmp/inv_fs.txt /tmp/inv_table.txt (無輸出) ``` -📌 **標頭的 48/59 是對的,錯的是表格**——這正是這頁最容易壞的方式: -數字改了,人話沒補。**數字對不代表這頁沒漏**,兩組指令都要跑。 +🔴 **`^\| \`` 這個錨點不能拿掉**——它的意思是「**這一行的第一欄就是這支閘**」, +也就是「表格真的列了它」。把錨點拿掉、改成抓全頁所有反引號裡的 `*.sh`, +反向那半會吐出 **3 個假警報**(2026-08-27 實跑): -**這次順便抓到的另一個落差**:`.claude-plugin/plugin.json` 的說明文字寫「42 支機械閘(52 條註冊)」, +``` +claim-verify-police.sh ← 出現在「已於 ISEP#60 移除」那段**移除紀錄**裡 +subagent-claim-worksheet.sh ← 同上 +github-arm.sh ← 它在 `scripts/`,不在 `hooks/`;是 github-contact-guard + 那一列裡告訴你「怎麼解鎖」的逃生口 +``` + +**三個都不是幽靈,三個都不該刪**:刪掉前兩個等於刪掉「G 組為什麼是空的」這段歷史, +刪掉第三個等於讓那一列不再告訴你怎麼過閘。 +⇒ **0 次正確攔截、3 次誤攔**——照這個訊號去改,會把好東西改壞。 + +那「頁面上出現了一個根本不存在的檔名」怎麼辦?**那要另外一格量,而且判準不是文字是事實**: + +``` +# C. 頁面提到的每個 *.sh,現在存在,或者 git 歷史裡存在過 +$ for n in $(grep -oE '`[a-zA-Z0-9._-]+\.sh`' docs/hooks-inventory.md | tr -d '`' | sort -u); do + [ -f "hooks/$n" ] || [ -f "scripts/$n" ] && continue + [ -n "$(git log --all --oneline --diff-filter=AD -- "hooks/$n" "scripts/$n")" ] && continue + echo "$n" + done +(無輸出) +``` + +**「現在沒有、但曾經有」=歷史,合法;「從來沒有過」=打錯字或憑空捏造,才是幽靈。** +這一格問的是 git,不是問這頁的用字,所以它不會因為誰換個寫法就失效。 + +📌 **三格都要跑,而且它們量的是不同東西**: +A1 缺人話、A2 表格有幽靈、C 全頁有幽靈。 +**標頭的 48/59 對不代表這頁沒漏**——補進 2 支真的、同時留著 2 支假的,數字照樣湊得到 48。 +**數量相等不等於集合相等**,所以驗的一律是集合(`comm`),不是 `wc -l`。 + +**這次順便抓到的另一個落差**(🕐 **這一段是 2026-08-20 的快照,裡面每個數字都是那天的,不是現況**—— +留著是因為它是「兩份文件的數字不會自己跟上」這個病的第一個案例;現況數字看本頁標頭): +`.claude-plugin/plugin.json` 的說明文字寫「42 支機械閘(52 條註冊)」, `README.md` 也寫「42 支 + `hooks.json`」「共 52 條註冊」——但實測是 **43 支檔案、53 條註冊**。 差 1 支、差 1 條,猜測是今天(2026-08-20)新增的 `leo21c-write-guard.sh`/`release-tag-guard.sh`/ `ticket-api-bypass-guard.sh` 這批(檔頭日期都是今天)加了之後,兩份文件的數字沒有跟著更新。 @@ -271,6 +305,6 @@ $ comm -13 /tmp/inv_fs.txt /tmp/inv_table.txt ## 這份表怎麼跟實況對帳(半年後怎麼發現漂移) -1. **有沒有新閘沒被收進這張表**:跑本文「落差偵測」段落**第二組** `comm` 指令(`inv_fs` vs `inv_table`),比對 `hooks/*.sh` 的檔名清單跟這張表列出的閘名清單。**不是第一組**——第一組比的是 `hooks.json`,只驗證有沒有註冊,驗不了有沒有寫進這張人話表。2026-08-27 漏掉的那兩列,第一組是綠的、第二組才紅。 +1. **有沒有新閘沒被收進這張表**:跑本文「落差偵測」段落**第二組**(`inv_fs` vs `inv_table` 的兩行 `comm`)**加第三格 C**,比對 `hooks/*.sh` 的檔名清單跟這張表列出的閘名清單。**不是第一組**——第一組比的是 `hooks.json`,只驗證有沒有註冊,驗不了有沒有寫進這張人話表。2026-08-27 漏掉的那兩列,第一組是綠的、第二組才紅。**抓表格列的那組 `grep` 一定要帶 `^\| \`` 錨點**,理由與拿掉之後會冒出的 3 個假警報,就寫在那一段裡。 2. **有沒有閘的行為跟這裡寫的不一樣了**:抽幾支重新讀一次源碼,跟這裡的「一句話」對一遍——就是本文「抽驗 5 支」做的事,可以照同樣方法定期重做。 3. **`.claude-plugin/plugin.json` 與 `README.md` 的數字**:這兩處各自寫了一次「幾支、幾條註冊」,前面已經抓到一次對不上(42/52 vs 實際 43/53)。這兩個數字沒有機制保證跟著 `hooks/` 目錄自動更新,是本表發現的第一個具體漂移案例。