~/blog/claude-code-slim-self-audit-skill

AI Workflow · part 5

[Claude Code] 讓 Claude 自己幫你瘦身 — 打造 /slim 設定檔健檢 Skill

cat --toc

TL;DR

Claude Code 的設定檔會默默長大 — CLAUDE.md、MEMORY.md、rules 加起來可以悄悄吃掉每個 turn 10K+ tokens。我做了一個 /slim skill,讓 Claude 自己做健檢。一個指令,從 ~10,500 砍到 ~4,100 tokens — 降 61%,東西一個沒丟。

白話版:讓 AI 自己做健康檢查

你每傳一則訊息給 Claude Code,它不是只看你打的字。它還會把一整疊設定檔翻出來 — 你的 coding 規則、記憶筆記、工具清單。時間久了,這疊東西越來越厚,因為你一直加規則、存筆記、裝新工具。重點是:不管這次用不用得到,它每次都全部翻出來。

就像你出門背一個包。手電筒、急救包、地圖,一個一個往裡塞。結果包 20 公斤了,你只是去隔壁買杯咖啡。東西不用丟,但不需要全部扛著走 — 放家裡,要用再拿就好。

我做了一個 /slim 的 skill,讓 Claude 自己秤秤背包多重。哪些檔案太肥,哪些根本不用每次都帶,它會自己找出來、搬到需要時才查的地方。結果:東西全都還在,但每則訊息輕了 61%。

完整的 SKILL.md 可以直接拿去用:GitHub Gist


前言

上一篇講了 token 為什麼燒那麼快,給了 8 招應對。裡面最實用的一條:CLAUDE.md 只放重點,細節搬到別的檔案。

我照做了,撐了兩週。然後 MEMORY.md 又胖到 12,000 bytes — 因為我順手把操作筆記直接寫在裡面。CLAUDE.md 裡面有一大段流程教學,跟 SKILL.md 裡的一模一樣。背包又沉了。

靠意志力沒用。我需要一個自動化的體檢機制。


Part 1:問題 — 設定檔怎麼偷偷變胖的

每個 turn 都帶著跑的東西

Claude Code 每次收到你的訊息,都會把這些一起讀進去:

檔案放什麼的什麼時候讀
CLAUDE.md專案規則、coding 慣例每次都讀
rules/*.md各主題的規則每次都讀
MEMORY.md記憶索引每次都讀

SKILL.md 不一樣 — 只有你叫它的時候才讀。這個差別很關鍵:一個是每次都收的稅,一個是用到才付的費。

麻煩的是沒有任何警告。MEMORY.md 從 2,000 偷偷長到 12,000,不會有人跟你說。CLAUDE.md 跟 SKILL.md 內容重複了,也不會有人提醒。你只會在某天覺得「怎麼 context 這麼快就滿了」的時候才回頭看。

我的實際數字

跑健檢之前,每個 turn 帶著的:

檔案Bytes~Tokens
CLAUDE.md11,306~3,200
7 個 rules7,854~2,300
MEMORY.md12,337~3,500
合計31,497~10,500

一萬出頭的固定開銷。200K 的 context window,你還沒開口就花掉 5%。就算開 1M context,每個 token 還是照收錢的(Opus input $15/MTok)


Part 2:診斷 — 五種讓設定檔變胖的原因

我把設定檔全部翻過一遍,歸納出五個常見的問題:

1. 同一份東西寫了兩遍

CLAUDE.md 裡放了完整的 Core Loop 步驟(RETRIEVE → EXECUTE → RECORD),120 行。但 skills/yoshihiko-brain/SKILL.md 裡面一模一樣的東西已經有了,而且 skill 只在觸發的時候才會讀。

代價:每個 turn 多花 ~2,000 tokens,讀一份根本不需要每次都帶的副本。

2. MEMORY.md 塞了大段筆記

MEMORY.md 本來應該只是目錄 — 一行一筆,指向獨立的檔案。結果我的裡面長出五大段操作筆記:vLLM 啟動指令、Ollama 模型速度、PAL routing 規則、gateway 重啟步驟。每段 10 到 30 行。

代價:每個 turn 多花 ~3,000 tokens,帶著一堆可能一整週都用不到的東西。

3. 規則檔裡面寫了操作手冊

CLAUDE.md 該放的是規則 — 「input 一定要驗證」、「不要 mutate 物件」這種。不該放的是操作流程 — 「第一步跑這個、第二步看那個」。流程放 SKILL.md 就好,用到的時候才讀。

我的 Codex Code Review 段落有觸發條件、跳過條件、呼叫格式、workflow 流程圖,全塞在 CLAUDE.md 裡。很重要,但不需要每次對話都帶著。

4. 過期的東西還在

MEMORY.md 裡面有一整段 llama-server on GX10 的紀錄 — 三月就因為 SM121 crash 放棄的東西。這段話每個 turn 都會被讀到,但我永遠不會再用 llama-server 了。

5. 查一下就好的東西被綁在每次都讀的檔案裡

「openclaw gateway 怎麼重啟」、「GX10 vLLM 啟動指令」這種是查詢型的資訊。你需要的時候查一下就好,不需要每則訊息都背在身上。

解法:搬到 QMD(本地 markdown 搜尋引擎)索引的子檔案裡。Claude 要用的時候跑一下 qmd search "openclaw restart",30ms 就找到了。


Part 3:做一個 /slim Skill

Claude Code 的 skill 就是一個 markdown 檔案,放在 ~/.claude/skills/<名稱>/SKILL.md。你打 /slim,Claude 就照上面寫的流程跑。重點是 skill 只有觸發時才讀,平常不佔 context。

/slim 分四步:

第一步:量

把所有每 turn 都讀的檔案列出來,算大小,跟目標比:

| 檔案 | Bytes | ~Tokens | 目標 | 狀態 |
|------|-------|---------|------|------|
| CLAUDE.md | 11,306 | ~3,200 | <3,000 | ⚠️ 超標 |
| MEMORY.md | 12,337 | ~3,500 | <2,000 | ⚠️ 超標 |

我訂的標準:

  • CLAUDE.md:3,000 tokens 以下(規則 + pointer,不放流程)
  • MEMORY.md:2,000 tokens 以下(目錄而已,每筆一行)
  • 單一 rules/*.md:500 tokens 以下
  • 全部加起來:8,000 tokens 以下

第二步:診斷

超標的檔案,Claude 會標出是哪種問題、建議怎麼處理:

[MEMORY.md:94-104] 塞了大段筆記 — openclaw gateway 完整設定
  → 搬到子檔案,這裡只留一行連結
  → 省 ~300 tokens/turn

[CLAUDE.md:78-195] 重複 — Core Loop 在 SKILL.md 裡已經有了
  → 從 CLAUDE.md 刪掉
  → 省 ~2,000 tokens/turn

第三步:提案

按能省多少排序,列出來給你看。Claude 不會自己動手,等你說好才做。

第四步:執行

你點頭之後,Claude 會:

  1. 把大段落搬到獨立的子檔案
  2. MEMORY.md 原位換成一行 pointer
  3. 新檔案丟進 QMD 建索引(qmd update && qmd embed
  4. 跑完報告前後對比

整個 SKILL.md 大概 80 行,邏輯不複雜 — 值錢的是那五個診斷模式,不是程式碼。


Part 4:實際清完變怎樣

MEMORY.md:12,337 → 3,941 bytes(砍 68%)

五段筆記搬出去變五個獨立檔案:

原本在 MEMORY.md 裡的→ 搬去哪搬了多少
openclaw gateway 設定infra_openclaw_gateway.md~800 bytes
PAL MCP routing + 模型清單infra_pal_routing.md~3,200 bytes
yui agent 細節project_yui.md~600 bytes
GX10 vLLM 啟動設定併進現有的 gx10-vllm.md~2,400 bytes
llama-server(已棄用)併進 gx10-vllm.md 當歷史~800 bytes

192 行的大雜燴 → 58 行的乾淨目錄。

CLAUDE.md:11,306 → 2,569 bytes(砍 77%)

拿掉的搬去哪為什麼拿
Core Loop(120 行)本來就在 SKILL.md重複的
Query Strategy Guide本來就在 SKILL.md重複的
Recording Format本來就在 SKILL.md重複的
PAL routing 完整版infra_pal_routing.md查的時候再讀
Codex review 完整版濃縮成 4 行摘要規則留,流程走
Integration Notes直接刪留著也不影響行為

留下來的:5 行規則、12 列 collection map、PAL routing 4 行摘要、Codex review 3 行摘要。

讓 QMD 也能搜 memory 子檔案

搬出去的東西不只是換個資料夾放 — 我把整個 memory 目錄加進 QMD 的搜尋範圍:

qmd collection add ~/.claude/projects/-Users-coolthor/memory \
  --name claude-memory --mask "**/*.md"
qmd embed

之後 Claude 要查什麼,直接搜:

qmd search "openclaw restart" -c claude-memory
# → infra_openclaw_gateway.md (93% match, 30ms)

一樣的資訊,不用每次帶著跑。要用的時候 30ms 搜到。


帶走這些

最花時間的不是清理

清理本身花 15 分鐘。真正虧的是之前根本不知道有問題 — 我帶著 10,500 tokens 的固定開銷跑了好幾週。/context 一直都在,我只是從來沒想過拿它來檢查設定檔。

五個診斷法,任何 Claude Code 設定都適用

  1. 找重複:CLAUDE.md 跟 SKILL.md 有一樣的內容?從 CLAUDE.md 刪
  2. 數行數:MEMORY.md 某一筆超過一行?那是筆記,不是目錄,搬出去
  3. 分規則和流程:「永遠驗證 input」是規則,「第一步跑 X、第二步跑 Y」是流程。流程放 skill
  4. 看日期:30 天前的東西還躺在每 turn 都讀的檔案裡?八成過時了
  5. 問自己:「這個真的需要每次都帶著嗎?」不需要的話,讓它可以被搜到就好

一句話原則

規則跟參考資料要分開放。規則短、永遠有用、改變行為。參考資料長、偶爾用到、回答問題。規則跟著每個 turn 走,參考資料放在搜得到的地方就好。


結語

之前:~10,500 tokens/turn(CLAUDE.md 3,200 + rules 2,300 + MEMORY.md 3,500)
之後:~4,100 tokens/turn (CLAUDE.md 730 + rules 2,300 + MEMORY.md 1,126)
省了:~6,400 tokens/turn (減 61%)
丟了:零 — 全部搬到搜得到的子檔案

/slim 就是我的定期健檢。下個月 MEMORY.md 因為新東西又胖了,跑一次就好。

想自己做一個的話:

  1. 先跑 /context 看你的 token 都花在哪
  2. 建一個 ~/.claude/skills/slim/SKILL.md我的在這),定好 量 → 診斷 → 提案 → 執行 的流程
  3. 訂標準(我的:CLAUDE.md < 3,000、MEMORY.md < 2,000、總計 < 8,000)
  4. 每個月跑一次,或是覺得 context 變快用完的時候跑

省 token 最好的方法不是少寫字。是別把不需要每次都讀的東西,綁在每次都讀的檔案裡。


同系列:Token 燒太快?8 招讓你的 Session 撐 10 倍久

常見問題

怎麼看 CLAUDE.md 吃了多少 token?
在 Claude Code 裡跑 /context。它會列出 system prompt、tools、memory files、對話歷史各吃多少。你的 CLAUDE.md 和 rules 檔案在 'Memory files' 底下,有精確數字。
CLAUDE.md 應該多大?
3,000 tokens 以下。它每個 turn 都會帶著跑,所以裡面放的東西是永久稅。規則和 pointer 放 CLAUDE.md,完整步驟放 SKILL.md — 那個只有觸發的時候才會讀。
怎麼減少 MEMORY.md 的 token 用量?
把它當目錄用,不要當筆記本。每一筆一行、150 字元以內、指向獨立檔案就好。大段落搬出去,原位只留一行連結。
Claude Code 可以自己檢查設定嗎?
可以。做一個 skill(像 /slim),讓它讀所有會跟著每個 turn 跑的檔案、算 token、找膨脹,然後提出清理方案。你確認了它才動手。