AI Agent 應用2026.05.09

我為什麼把這 7 個東西都寫成 Skill——一個 PM 的客製化判斷

Claude Code 的客製化機制有 5 層——CLAUDE.md、Skill、Subagent、Hook、MCP。最務實的入手點是 Skill:比 Hook 簡單、比 Subagent 直接、比 MCP 輕量。我寫過 7 個 Skill,從這個過程沉澱出三條判斷準則——什麼東西該抽成 Skill、什麼東西該留在 CLAUDE.md、什麼東西該抽到 shared-rules。

上一篇講完 CLAUDE.md,最後留了一個鉤子:「永遠該載入的寫 CLAUDE.md、按需才該載入的寫 Skill」。這篇把這條 trade-off 攤開——我為什麼有 7 個東西不寫進 CLAUDE.md、改寫成 Skill。

Claude Code 的客製化選項聽起來多——CLAUDE.md、Skill、Subagent、Hook、MCP——但實際用過會發現大多數人最先碰到、也最划算的是 Skill。原因簡單:比 Hook 容易設定、比 Subagent 跟主 session 更黏、比 MCP 不需要外部依賴。我 7 個 Skill 累積下來摸出該不該寫成 Skill 的判斷準則,這篇攤開。

Skill 跟 CLAUDE.md 的真正差別:always-on vs on-demand

課程把 Skill 描述成「有名稱、有描述常駐、Claude 判斷要用的時候才載入完整內容」的模組。這個機制的設計重點不在「能寫多複雜的步驟」,在它跟 CLAUDE.md 的根本差別——always-on vs on-demand

CLAUDE.md 是 always-on:每次 session 啟動就 append 到 prompt 前,不管你這次要做什麼,它都先吃進 context。Skill 不一樣:name 跟 description 常駐(讓 Claude 知道有這個工具),但 full content 只在 Claude 判斷要用時才完整展開。

從 context 預算的角度看,這是「稅率」的差別。寫進 CLAUDE.md 等於每次 session 繳一次 context 稅;寫成 Skill 只在被觸發的 session 繳。如果某條規範一個月只在某一類任務出現一次,把它放 CLAUDE.md 就是讓另外幾百次 session 都默默繳這條稅、卻完全沒用到。

另一個角度:CLAUDE.md 適合「無論做什麼都該知道的東西」——專案 stack、commit 規範、不可違反的安全規則。Skill 適合「只有特定情境才該知道的東西」——某類任務的 SOP、某種文件的格式規範、某種錯誤的排查流程。前者是憲法,後者是手冊。

我寫了哪 7 個 Skill:分布在 3 個專案

我目前有 7 個 Skill,分布在 3 個主力專案:

knowledge-vault:vault-agent

vault-agent 是個人知識庫專用的 Skill,使用者下指令 ingest <標籤>query <關鍵字> 時觸發、做 vault 的素材沉澱跟查詢。為什麼是 Skill 不是 CLAUDE.md:vault 操作流程很複雜(提案制、多檔分工、edge case),常駐會稀釋整份 CLAUDE.md,而我大多數 session 不在 ingest——按需載入更合理。

outsidewriter:3 個寫作相關 Skill

  • writing-style:每次轉寫文章時載入,確保風格一致。
  • fact-check:轉寫完成後強制執行的查核流程。
  • output-formats:四種輸出格式(WP / FB / Threads / LinkedIn)的格式規範,產出階段才載入。

這三個的共同點:都是「寫文章」這個任務型態才會用到的東西。如果寫進 CLAUDE.md,每次跟 outsidewriter 對話(包含 debug、規劃、討論)都會繳 context 稅、但 90% 對話用不到這些規範。

gwarket-site:3 個技術相關 Skill

  • code-conventions:修改或建立程式碼時參考的技術慣例。
  • deployment-troubleshooting:部署後前端顯示異常、API 不正確、路由分流失敗等問題的排查指南。
  • ui-design:做介面設計決策、建立新元件、討論視覺風格時用。

這三個的判斷邏輯也一樣——某種特定任務型態才需要的細節,常駐進 CLAUDE.md 是浪費。7 個 Skill 加起來覆蓋三個主力專案的客製化需求。下一段把這個過程沉澱出的判斷準則攤開。

三條判斷準則:什麼東西該抽成 Skill

準則 1:被多個專案需要的東西,不寫進單一專案的 CLAUDE.md

第一個訊號是重複。同一份規範如果同時被 insidewriter 跟 outsidewriter 需要、或被 gwarket-site 跟 publish-tools 需要,重複放兩處遲早會分裂。

我自己踩過:寫作風格規範一開始放在 outsidewriter 的 SKILL,後來 insidewriter 也要用。第一個直覺是複製一份過去——但複製等於下次改規範要改兩次、漏改一次就分裂。最後抽到 shared-rules/ 這個獨立 layer,writing-style.md、fb-writing.md、threads-writing.md、reading-protocol.md 都在那。各專案的 CLAUDE.md 跟 SKILL 只 reference 不重複。

注意:被多個專案需要的東西不一定要寫成 Skill——它可能是 shared-rules 裡的純 markdown 規範檔。Skill 是一種封裝形式,shared-rules 是另一種。準則 1 處理的是「不該綁在單一 CLAUDE.md」,不是「一定要寫成 Skill」。

準則 2:只在特定任務型態出現的規範,不放每次都讀的常駐記憶

第二個訊號是任務頻率不對等。fb-writing.md 的內容只在「寫 FB 貼文」這個任務出現。放進 outsidewriter 的 CLAUDE.md,每次 session(包含選題、轉寫、查核、發布、debug)都繳一次 context 稅,但只有發布階段那一輪用得到。

反面也成立:永遠該知道的東西不該寫成 Skill。publish-tools 的「四條發布鐵律」(不准新增分類標籤、預設發草稿、密碼從 .env 讀、安全字 confirm)是 always-on——任何 session 都不能違反。寫成 Skill 反而有風險(如果 Claude 沒主動載入呢?)。這條留在 CLAUDE.md。

準則 3:規範越精細,越要抽成獨立 Skill

第三個訊號是字數壓力

strong>。Skill 沒有字數限制——可以包含完整流程、具體案例、edge case 處理。寫進 CLAUDE.md 這些細節會稀釋整份檔案、讓重要規則被淹沒。

deployment-troubleshooting 是最好的例子。它寫了 15KB、涵蓋 Cloudflare Worker / Pages 路由分流失敗的多種樣態、WordPress headless API 異常的排查步驟、DNS 設定的常見錯誤。這些細節有用、但只在「部署出包了」那少數時刻用得到。寫進 CLAUDE.md 等於每次 session 都繳這 15KB 的稅。寫成 Skill、需要時才完整載入,是更划算的設計。

三條準則一起看,本質都是 context 預算的最佳化——把對的東西放對的層級,讓 always-on 那層只留必要的、把可選的東西交給 on-demand。

踩坑案例:Skill 不是寫了就有用

我自己最有代表性的踩坑是「連寫的人自己都會記錯規範在哪個檔」。

2026 年某次寫 FB 貼文相關任務,我給 Claude Code 的指令說「請參考 outsidewriter/CLAUDE.md 裡的 FB 規範」。Claude Code 執行時實際讀檔,發現 FB 規範不在 outsidewriter/CLAUDE.md,而是在 outsidewriter/.claude/skills/output-formats/SKILL.md 裡。它停下來提了三道判斷題等我確認,才繼續往下做。

這個案例後來在我的 vault 裡被歸類為「摘要失真」的一個 sub-pattern——「source pointer 缺漏」。問題不在內容錯,是「指向錯」:vault 寫了 FB 規範的內容描述,但沒明指 source 在哪個檔案;過了一段時間我自己記憶錯位,以為它在 CLAUDE.md。

這個踩坑帶出一條紀律:SKILL.md 重大改動之後,先用「主 agent 扮演」跑 dry-run,再正式載入。理由是:「扮演」執行時主 agent 會把規範當「描述」讀,遇到模糊處會停下質疑;載入後 SKILL 的執行更接近「指令式」,主 agent 傾向順著流程跑、不質疑。Dry-run 等同「規範審稿」,正式上線等同「規範被使用」——兩者偵測缺陷的能力不同。

寫 Skill 比寫 CLAUDE.md 有更高的靜默失真風險,因為它的內容不每次都被檢視。CLAUDE.md 每次 session 開頭都會被讀;Skill 只在觸發時才用,不觸發的時候規範變舊、跟實際情況脫節,你不會立刻發現。Dry-run 紀律是這個風險的工程層防線。

我的觀點:Skill 划算,但邊界要誠實標

Skill 是 Claude Code 客製化裡最划算的入手點。比 Hook 容易(不用碰 settings.json)、比 Subagent 直接(共享主 session context、看得到對話脈絡)、比 MCP 輕量(不需要外部 server)。它解決的問題是「條件式載入規範」,這個問題大多數使用者都會遇到。

但這篇有一條我必須誠實標出的邊界——Hook、Subagent、MCP 我目前都還沒實際用過

寫 vault-agent 的時候我評估過 Subagent,最後選 SKILL,理由是 vault 的 ingest 流程要從當前對話 context 抓內容,Subagent 看不到主對話、SKILL 才能。這算是「評估過後選 SKILL」的決策層紀錄。但我沒有真的用過 Subagent,所以無法寫「我用過然後砍掉」的踩坑層。

MCP 我沒接過任何 server,連 publish-tools 都是直接打 WordPress REST API。Hook 我所有的 settings.json 都沒設過 hooks 區段,需要「執行後檢查」的場景(如 vault 的 Auto-Lint)我都用 prompt 規則寫進 CLAUDE.md 處理。

我刻意不在這篇硬寫這三個。原因簡單:沒實證的判斷沒有重量。寫「該不該上 MCP」而我從沒用過 MCP,就是 listicle、不是判斷。等我真的有需要碰、踩到坑、有取捨再寫。

這也是我對 Claude Code 客製化的整體哲學:能用 CLAUDE.md 解決的就不必動 Skill;能用 Skill 解決的就不必動 Hook;能用 prompt 規則解決的就不必動 MCP。每加一層機制都是工程成本,要看你需不需要那個層級的穩定性與自動化。

常見問題

Skill 跟 prompt template 差在哪?

Prompt template 是你每次貼進對話的文字塊,靠你記得用、貼對地方。Skill 是 Claude 看到對話內容後自動判斷該不該載入的模組——不需要你手動觸發。差別是「被動 vs 主動」:你下指令 Claude 才用 template,Claude 自己判斷情境後拉 Skill。Skill 也可以包含腳本、有結構化的 frontmatter(name、description、觸發條件),prompt template 通常只是純文字。

多少個 Skill 算太多?

沒有絕對數字,但訊號很具體:當你自己開始記不住某個規範在哪個檔案、得開資料夾搜尋,就是 Skill 太多或拆得太碎了。我踩過這個坑——以為 vault 寫了規範就好、結果幾個月後自己記錯位置。Skill 越多越要紀律:一份索引文件記每個 Skill 的觸發條件、SKILL.md 重大改動跑 dry-run、定期檢查觸發描述是否還對得上實際情境。Skill 多了會互相干擾的風險真實存在,但管理紀律到位前不必預設上限。


這是 Claude Code 101 系列的第 3 篇(系列收尾):

三篇串起來其實是同一條敘事:Claude Code 不是學一個工具,是學一種協作模式。第 1 篇講 Agent 跟補全的本質差別,第 2 篇講協作的稀缺資源 context 怎麼管,第 3 篇講客製化怎麼分層。會用的人不一定背更多指令,是更懂怎麼配置這個 Agent 周邊的長期記憶——CLAUDE.md 是憲法、Skill 是手冊、shared-rules 是跨專案共識,每一層都該收得乾淨、放在對的位置。

本文部分觀念基於 Anthropic 公開課程 Claude Code 101(https://anthropic.skilljar.com/claude-code-101)。文章內容為作者自身學習筆記與觀察,非課程翻譯或轉述。

相關文章

AI Agent 應用
Claude Code 不是更強的補全——它跑的是會自己驗證的 Agent 迴圈
2026.05.09
AI Agent 應用
Context 才是 Claude Code 的稀缺資源
2026.05.08
AI Agent 應用
Claude 怎麼接到你的工作世界?Connector、Enterprise Search、Research 三種機制
2026.05.05
AI Agent 應用
AI 工具會來來去去,真正該設計的是底下的資料庫
2026.04.21