新增 leo21c-mcp-guard:擋下打向真庫的 Arcrun/KBDB MCP 呼叫(closes #69) #71

Open
claude-code wants to merge 1 commits from feat/leo21c-mcp-guard into main
Member

closes #69

新增 hooks/leo21c-mcp-guard.sh:擋下打向 leo 真庫(leo21c)的 Arcrun/KBDB MCP 呼叫。判準、測試結果、已知限制詳見 issue #69 的收工留言(issuecomment-4598)。

  • 19/19 新測試通過,既有 7 支套件重跑無退化
  • plugin.json 0.5.0 -> 0.5.1
  • 未動 main,等總管 review 併版打 tag
closes #69 新增 hooks/leo21c-mcp-guard.sh:擋下打向 leo 真庫(leo21c)的 Arcrun/KBDB MCP 呼叫。判準、測試結果、已知限制詳見 issue #69 的收工留言(issuecomment-4598)。 - 19/19 新測試通過,既有 7 支套件重跑無退化 - plugin.json 0.5.0 -> 0.5.1 - 未動 main,等總管 review 併版打 tag
claude-code added 1 commit 2026-08-27 07:03:51 +00:00
leo 2026-08-27:「我從頭的指令就叫你去打 youlin,stage 環境是它你不知道嗎?
為什麼打算用我的真庫測試?」

實況(總管當天實查):這台機器同時掛兩條 Arcrun MCP 連線,工具名是兩串 UUID——
mcp__00402d88-...__* → logged_in_as: leo21c(真庫),mcp__d0eaf65b-...__* →
logged_in_as: youlin(測試場)。總管整天用第一條,測試資料卻寫在第二條,
造成三次假結論(「wiki 沒送上去」「排在 1691 筆後面」「ingest 沒寫進去」——
全是查錯庫),而總管自己每張派工單都寫著「測試一律用 youlin」,卻一次都沒套用。

判準:任何打向 leo21c 座標的 kbdb_*/arcrun_* MCP 呼叫一律擋,除非明說
(touch /tmp/.leo21c-mcp-ok,單次 15 分鐘、會留痕到 .claude/hooks/
leo21c-mcp-guard.log)。讀寫都擋,但訊息不同:唯讀提示「你可能查錯地方」,
寫入提示「這會汙染真資料」。arcrun_whoami 本身永遠放行(唯一能確認身份的
工具,擋它會造成死結)。

已知限制(查過但查不到穩定識別法,不是猜測):MCP server 的 UUID 是這次連線
分配的,不是穩定識別碼,重裝/換 session 會換掉;~/.claude.json 等本機設定檔
裡找不到這兩條連線的來源設定,判斷是雲端 connector 層動態配的。因此這兩個
UUID 是寫死的(2026-08-27 由 arcrun_whoami 實測得到),且會過期。設計上不是
「表格以外的一律放行」,而是「不在表格裡的 UUID 一樣擋,且訊息明講清單可能
過期」——大聲失敗,不靜默放行到身份不明的目標(fail-closed)。

測試:hooks/tests/leo21c-mcp-guard.test.sh 19/19 通過,涵蓋擋(真庫讀/寫)、
放行(測試場讀/寫)、不擋(whoami 三種座標)、不擋(無關工具)、擋(未知UUID)、
戳記單次放行+留痕。既有測試套件(ask-user-question/dispatch-format/
factory-idle/main-and-prod-push/prod-write/stage-before-prod/sdd-guard)
全部重跑一遍,均維持原本通過狀態,未受本次改動影響。

hooks.json 新增一條 PreToolUse matcher:.*mcp__[0-9a-fA-F-]+__(kbdb_|arcrun_).*
docs/hooks-inventory.md 補上新閘一行,並記錄目前實際磁碟數(49 檔/60 條)
跟這份表既有列表(47/57)之間還有既存落差(isep-presence-beacon.sh/
milestone-due-guard.sh 疑似兩支舊閘未收錄)——不是本票動的閘,未一併查證,
留給總管或後續票核實。

plugin.json 0.5.0 → 0.5.1(改完不升版沒人吃得到;check-version-consistency.sh
在本分支照慣例是紅的,tag 於 merge 時打)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Author
Member

[decision] 總管給結論:要求修改(需要 rebase),不退回、不關閉

這一張跟今天關掉的 #62#58 不同——它的東西是真的還沒進去。

總管實查現在的 main(2026-08-28 12:45):

hooks/leo21c-write-guard.sh   ✅ 存在(不同的一支,管的是「不准寫 leo 的個人帳號」)
hooks/leo21c-mcp-guard.sh     ❌ 不存在   ← 本 PR 要新增的那一支

inkstone/ISEP#69 仍是 openp/highs/review

內容有效、票還活著、優先度是高。 它現在 mergeable=False
唯一缺的是把 main 併進來——main 今天動了六次(v0.10.0v0.13.0 四個 release)。

為什麼是「要求修改」而不是現在合併

不在今天的主線里程碑SOP 變成閘)裡,而今天還有 9 張主線票在跑、收工線是台北 16:00。
依 SOP S8-1 的專注原則,非主線的事不插隊——但**「不插隊」不等於「沒有結論」**,
所以結論在這裡給清楚,不是讓它繼續躺著。

要做什麼(誰接手都照這個)

  1. 把 main 併進 feat/leo21c-mcp-guard,解衝突
    (會撞的大概是 hooks/hooks.json.claude-plugin/plugin.jsondocs/TESTING.mddocs/hooks-inventory.md
  2. 盤點數字在合併後的樹上自己重數,不要沿用 PR 裡的舊數字
  3. 版本號不要沿用 PR 說明寫的 0.5.0 -> 0.5.1——main 現在已經是 0.13.0
  4. 19/19 那組測試重跑,並確認沒有弄壞今天新進來的那批
    pr-verdict 52、mainline-focus 24、mainline-idle 61、gate-ok 17、
    unpushed-police 10、isep-presence-beacon 14、countdown 20)

⚠️ 跑那五支要帶參數prod-writestage-before-prodmain-and-prod-push ×2/gitea-arm-check),
不帶會拿到假紅——今天有一個工人差點把「我用錯方法」講成「別人的東西壞了」,
它先在 main 上開 worktree 跑同樣五支拿到一樣的失敗數才去看根因,那個做法是對的。

📌 本則同時是 #69 的狀態更新:票維持 opens/review,不因為今天沒排到而降級。

[decision] 總管給結論:**要求修改(需要 rebase),不退回、不關閉** **這一張跟今天關掉的 `#62`/`#58` 不同——它的東西是真的還沒進去。** 總管實查現在的 main(2026-08-28 12:45): ``` hooks/leo21c-write-guard.sh ✅ 存在(不同的一支,管的是「不准寫 leo 的個人帳號」) hooks/leo21c-mcp-guard.sh ❌ 不存在 ← 本 PR 要新增的那一支 ``` 而 `inkstone/ISEP#69` 仍是 `open`/`p/high`/`s/review`。 ⇒ **內容有效、票還活著、優先度是高。** 它現在 `mergeable=False`, 唯一缺的是把 main 併進來——main 今天動了六次(`v0.10.0`~`v0.13.0` 四個 release)。 ## 為什麼是「要求修改」而不是現在合併 它**不在今天的主線里程碑**(`SOP 變成閘`)裡,而今天還有 9 張主線票在跑、收工線是台北 16:00。 依 SOP S8-1 的專注原則,非主線的事不插隊——但**「不插隊」不等於「沒有結論」**, 所以結論在這裡給清楚,不是讓它繼續躺著。 ## 要做什麼(誰接手都照這個) 1. 把 main 併進 `feat/leo21c-mcp-guard`,解衝突 (會撞的大概是 `hooks/hooks.json`/`.claude-plugin/plugin.json`/`docs/TESTING.md`/`docs/hooks-inventory.md`) 2. **盤點數字在合併後的樹上自己重數**,不要沿用 PR 裡的舊數字 3. **版本號不要沿用 PR 說明寫的 `0.5.0 -> 0.5.1`**——main 現在已經是 `0.13.0` 4. 19/19 那組測試重跑,並確認沒有弄壞今天新進來的那批 (`pr-verdict` 52、`mainline-focus` 24、`mainline-idle` 61、`gate-ok` 17、 `unpushed-police` 10、`isep-presence-beacon` 14、`countdown` 20) ⚠️ **跑那五支要帶參數**(`prod-write`/`stage-before-prod`/`main-and-prod-push` ×2/`gitea-arm-check`), 不帶會拿到假紅——今天有一個工人差點把「我用錯方法」講成「別人的東西壞了」, 它先在 main 上開 worktree 跑同樣五支拿到一樣的失敗數才去看根因,那個做法是對的。 📌 本則同時是 `#69` 的狀態更新:票維持 `open`/`s/review`,不因為今天沒排到而降級。
This pull request has changes conflicting with the target branch.
  • .claude-plugin/plugin.json
  • docs/hooks-inventory.md
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/leo21c-mcp-guard:feat/leo21c-mcp-guard
git checkout feat/leo21c-mcp-guard
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inkstone/ISEP#71