b8060ca263
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>