
我把 Skill、腳本和使用說明都準備好了。換到一個全新的環境,Claude 找得到 Skill,也知道該做什麼。
但它還是停下來了。
原來我平常在啟動 Claude Code 時另外給的執行權限,也是這套方法的一部分。只是準備的時候,我根本沒把它算進去。
帶團隊的人應該都遇過類似的事:資深同仁離職,人走了才發現很多「他知道怎麼查」的東西沒有留下來;高手請假,線上出事大家只能「等他回來再說」。我們常以為缺的是文件,但更常缺的是那些只在他身上、連他自己都沒意識到的東西。
這是第三幕「方法離開作者」的第四篇。前三天,我們把查法一步步從我身上拿下來:
| Day | 拿下來的東西 | 變成 | 解決什麼 |
|---|---|---|---|
| 17 | 怎麼查 | 可呼叫的 Skill | 不用每次重新教 Claude 查法 |
| 18 | 系統背景 | 有來源、有版本的 Domain Wiki | 同事不懂系統,也找得到依據 |
| 19 | 固定核對 | 不靠模型的檢查程式 | 每次都一樣的核對,不必再想一次 |
今天要問的是:拿掉我這個人之後,這套方法還剩多少能自己完成?
我先做最直覺的事:把 Day 17 的 Skill 給一個全新的 Claude Code,只給 SKILL.md。
它讀懂了每一步,卻停在第三步:「兩支腳本不存在」。它沒有自己補寫腳本,而是把缺的東西列成缺件,結果停在待查。
Anthropic 介紹 Agent Skills 時,把寫 Skill 比喻成替新人準備到職指南。這個比喻很貼切,也提醒了我:到職指南寫得再好,指南裡提到的工具不在,新人還是做不完。 方法不只是步驟,也包含步驟依賴的程式。
所以我把 Skill、查資料的腳本、檢查器與使用說明,整理成一套查核工具組,目的是讓同事拿到後知道怎麼用,也知道跑不過時怎麼處理:
| 內容 | 它是什麼 | 同事用它做什麼 |
|---|---|---|
SKILL.md |
查核步驟與結果格式 | 讓 Claude 知道怎麼查、交什麼 |
scripts/collect.py |
查資料的腳本 | 從資料取出可引用的紀錄 |
scripts/gate.py、check_result.py |
轉換資料並呼叫檢查器的 gate.py,以及 Day 19 的檢查器 |
核對結果,不靠模型自己說 |
scripts/selftest.py |
不呼叫模型的自測 | 確認自己裝好了沒 |
INSTALL.md、settings.template.json |
使用說明與設定範本 | 知道要設什麼權限、跑不過找誰 |
VERSION、CHANGELOG.md |
版本與改版紀錄 | 知道拿到的是哪一版、改過什麼 |
資料放在哪、Log server 怎麼連、用誰的帳號,屬於每位同事自己的環境,不能把我的帳號一起放進去。
把查法與腳本接起來時,Day 17 的收集腳本和 Day 19 的檢查器格式對不上。我沒有改檢查器(雜湊和 Day 19 一致),另外寫了 gate.py 轉換資料並呼叫檢查器;通知 ID 只取自工具收集到的紀錄,不取自 Claude 的回答。各自都驗過,接在一起仍要另外驗。
同一個 repo 的團隊,把工具組放進 .claude/skills/,跟著 git 走就好;跨 repo、整個部門,就做成 plugin,放進團隊 marketplace,讓成員自己加入、安裝、更新。判斷只有一句:看用的人在哪裡。
Day 4 做 plugin 時,marketplace 只寫了範本,明寫「尚未執行這條安裝路徑」。今天把那條路走完:把查核工具組做成 plugin,放進本機的團隊 marketplace,在全新的目錄安裝。
claude plugin marketplace add <marketplace 目錄> --scope project
claude plugin install trace-notification@d20-team --scope project
--scope project 讓啟用設定放在專案範圍,方便團隊保存同一份設定。但 clone 到設定,不等於 plugin 已安裝,也不等於腳本已獲准執行。
安裝、載入都成功,自測也通過。但第一個隱藏依賴馬上出現:我的 SKILL.md 寫死了 .claude/skills/trace-notification/scripts/ 這個路徑。 在我的目錄結構裡它永遠成立,裝成 plugin 後腳本就不在那裡了。改用 ${CLAUDE_SKILL_DIR} 之後,不論放在哪裡都會指向 Skill 自己的目錄,升到 v2.1.0。
每個情境都在 repo 外開全新目錄,只放這套工具組和一筆案例資料。先跑自測,再開一個不帶原對話的 Claude Code(Sonnet 5.5),加上 --setting-sources project,不讀我自己的使用者設定和 Skill。
提示只寫「用 trace-notification 這個 Skill 查核」,沒提檢查器。Claude 跑完後,由操作者另外重跑一次 gate.py,不採信模型自己說的結果。表裡括號是當時的版本。
| 情境 | 回合/秒數/費用 | 操作者重跑的檢查 | 代表什麼 |
|---|---|---|---|
| 資料完整(repo 方式,v2.0.1) | 14/36.7/US$0.158 | 交人核對 | 被退回一次,修正後通過 |
| 缺收據(v2.0.2) | 10/34.5/US$0.135 | 待查 | 列出缺 receipts.json 與下一步,沒有硬猜 |
| 沒給 Bash 權限(v2.0.2) | 12/34.6/US$0.141 | 操作者補跑:交人核對 | 「固定檢查未執行,不能說已通過」 |
只給 SKILL.md(v2.0.2) |
8/42.0/US$0.098 | 無法執行 | 開場那一次 |
| 團隊 marketplace(v2.1.0) | 13/44.5/US$0.141 | 待查 | 安裝成功,但收集腳本被擋 |
| marketplace,加上啟動授權(v2.1.2) | 11/36.1/US$0.137 | 交人核對 | Claude 執行收集與檢查,操作者重跑也通過 |
卡住的情境都照實停下、列出缺件,沒有繞過檢查交一個看起來漂亮的答案。但表裡有一個我一開始沒注意的差別:資料完整、缺收據這兩次能跑腳本,是因為我在啟動時另外允許了教學腳本。
marketplace 那次,我照同事會遇到的狀況,拿掉啟動時的授權。Skill 載入了,Claude 也知道下一步要跑收集腳本,但腳本被擋。
我前後換了五種給權限的寫法:寫在 SKILL.md、換萬用字元、寫進專案設定,五次都停在權限(每種寫法的原文放在附件)。被擋的根本原因還沒查清。
接著我做了一個對照:不改 Skill、不改案例資料,只在啟動 Claude Code 時,把我平常會給的授權明確加回去:
--allowedTools Read Grep Glob Skill "Write(out/**)" "Edit(out/**)" "Bash(python *collect.py *)" "Bash(python *gate.py *)" "Bash(python *selftest.py *)"
這是啟動指令裡的權限片段,用來允許三支教學腳本,不代表 Bash 因此只能執行這三支程式。這次 Claude 載入 marketplace 的 Skill,執行 collect.py、寫出結果,最後執行 gate.py:
{
"state": "READY_FOR_REVIEW",
"contract_passed": true,
"errors": [],
"approved": false,
"action_executed": false
}
重點看兩行:contract_passed: true 代表結果通過程式檢查,approved: false 代表仍要人核對。操作者另外重跑,結果一致。**從安裝、載入到程式檢查,這條本機路徑跑完了。**過程中仍有三次被擋(切換到 plugin 目錄、兩段混合寫檔與執行的命令),Claude 改用 Write 寫結果、用單一 Python 命令執行檢查才完成。
同一條路徑,差別只在有沒有我替它補的那一段。這說明了:安裝成功、Skill 載入、腳本能執行,是三個不同的驗收。 我平常只看到第一和第三個都通過,是因為我自己默默補上了中間那一段。

三個關卡要分開驗:拿掉啟動授權時停在待查;本次明確授權後,已完成腳本與程式檢查。
回頭整理,這次一共找到四個原本藏在我環境裡的依賴:
| 隱藏依賴 | 在我的電腦上,誰補的 | 拿掉後發生什麼 | 現在怎麼處理 |
|---|---|---|---|
| 腳本執行權限 | 我啟動時給的授權 | Skill 載入,腳本被擋,停在待查 | INSTALL.md 寫明啟動授權;明確授權後,本機路徑已跑完 |
| 欄位的合法值 | 我腦中知道 sender_status 該填什麼 |
Claude 填錯被退回,只好去翻檢查程式找答案 | 使用說明補上合法值(v2.0.2) |
| 腳本路徑 | 我的目錄結構 | 裝成 plugin 後找不到腳本 | 改用 ${CLAUDE_SKILL_DIR}(v2.1.0) |
| 主控台編碼 | 我平常用的終端機 | 中文 Windows 主控台印不出「≥」,自測當掉 | 輸出改 UTF-8(v2.0.1) |
第二列最值得多看一眼。檢查器退回時只說「發送端狀態不合法」:
{
"state": "RETURN_FOR_EVIDENCE",
"errors": ["SENDER_STATUS"],
"approved": false
}
Claude 於是用 grep 和 sed 去讀 check_result.py,自己找出允許值,改對才通過。讀程式找答案是正常除錯;但同事要翻檢查器才知道怎麼填,代表我以為寫清楚的東西,其實只寫在我腦中。
找出隱藏依賴之後,還要讓同事在卡住時不必回頭問我,否則又回到「等他回來再說」。所以檢查器的每一種結果,都對應一個下一步:
| 檢查結果 | 代表什麼 | 下一步由誰 | 要做什麼 |
|---|---|---|---|
| 交人核對(READY_FOR_REVIEW) | 條件齊全 | 服務 Owner | 核對結論與來源,決定是否補送 |
| 待查(NEEDS_FOLLOWUP) | 接收端仍是 unknown,已列缺件 | 查核的同事 | 依缺件清單補查來源 |
| 退回補證(RETURN_FOR_EVIDENCE) | 缺依據或前後不一致 | 查核的同事 | 依錯誤碼修正結論後重跑 |
| 輸入錯誤(INPUT_ERROR) | 沒有結果檔,或通知 ID 不唯一 | 操作者 | 檢查案例資料與輸入 |
不論哪一種,approved 都是 false。通過檢查只代表條件齊全;補送或結案,仍要有權限的人決定。
這次沒驗到的
- 都在同一台作者機,全新目錄加上不讀使用者設定,不是另一台機器,也不是真人同事;每個情境只跑一次,不估成功率。
- 只靠 Skill 或專案設定的權限為什麼沒生效,還沒查清;互動模式下由使用者核准後能否完成,也尚未驗證。
- Day 18 的 Wiki 沒有放進工具組;這次用 Day 17 的本機 Log 與收據,沒有重新接 Log server。
- marketplace 是本機目錄,不是團隊的 git repo;用
--scope project安裝會在本機 plugin 清單留下登記。
我原本以為,留下 Skill 就留下了方法;實跑發現缺了腳本,讀得懂也做不完。我以為安裝成功就能用;實跑發現載入了,執行仍被擋。我以為自己能跑,團隊就能跑;實跑發現我啟動時補的授權沒有跟過去,明確交代後才跑完。
所以答案是:把隱藏依賴交代清楚之後,可以。 在同一台機器上,從 marketplace 安裝到程式檢查的完整資料案例已經跑完。但能跑完,不等於交接完成:這仍是作者自己的演練,沒有真人同事試用;檢查通過也只是交人核對,不代表允許補送或結案。
方法能不能交出去,要看拿掉作者之後,還剩下多少能自己完成的工作。
這套工具組從 v2.0.0 改到 v2.1.2,每改一次,我都只驗了當下那個情境。下一步才有資格問:改了 Skill,怎麼知道原本會的沒有被改壞? 這是明天要回答的問題。
參考資料:
${CLAUDE_SKILL_DIR} 與 allowed-tools 的說明也在這頁。package/.claude/ 與 cases/complete/ 複製到新目錄,先跑 selftest.py,再請 Claude 用 Skill 查核,最後由你自己跑一次 gate.py。