AIDive

影片資料包

八個 Claude Code repo 在同一專案上的實測:工作階段成本、消融表與結論

閱讀約 13 分鐘

TL;DR

  • 八個熱門的 Claude Code repo 被安裝在同一個真實程式碼庫的專案範圍內並接受測量:工作階段啟動 token、三個程式任務的輸出 token,以及每個 repo 在專案之外寫入了什麼。
  • 八個之中只有一個改變了結果:anti-slop 當成 linter 執行時,在 3 次 T3 執行中全都抓到同一個不安全的型別轉換,代價是工作階段 +95 token,每一輪為零。
  • 簡短輸出規則集在使用工具的工作上站不住腳:Chisle 宣稱的基準 52%,實測變成基準輸出 token 的 94%,把輸入算進去後,它那組在三個任務中有兩個比基準更貴。
  • 三個 MCP 伺服器在 63 次執行中一次都沒被呼叫。裝了不等於用了。
  • 這個堆疊是可加總的:八個全裝一起,工作階段啟動多出 +6,804 token,與各自相加的總和只差 63 token。
  • 有兩個安裝動作伸到了專案之外。一個 codemod 把自己註冊到另外 8 個 agent 的全域設定;另一個工具寫死了 --dangerously-skip-permissions 並複製憑證檔,所以從未執行。

測量結果說明了什麼

工作階段啟動 token 可以重現,金額則不行:兩次執行中每個條件的輸入 token 總數完全相同,但同一條件的費用卻因 prompt cache 狀態從 $0.0183 擺盪到 $0.0035,因此全程以 token 數作為指標。基準專案的起點是 17,378 token s4。

這個版本的 Claude Code 會延遲載入 MCP 工具 schema,成本現在取決於伺服器公告的工具名稱數量,而不是 schema 大小。ouroboros 的 39 個工具花了 +1,642 token,reticle 的 19 個花了 +895,ui-skills 的 2 個花了 +37:大約每個工具名稱 42 到 47 token。預設情況下所有 MCP 工具都會延遲並在需要時載入,而 ENABLE_TOOL_SEARCH 的 auto 模式會在工具定義達到 context window 的 10% 時才啟用延遲 s4。 img2threejs 附帶一個 32,902 位元組的 SKILL.md 和 352 個檔案,但工作階段啟動只花 +107 token,因為只有 frontmatter 的 description 會被載入。skills 文件把每個列出的 description 上限設為 1,536 個字元,技能很多時還會為了符合列表預算而縮短 description;壓縮之後,被呼叫過的技能會以每個 5,000 token 重新附加,共用 25,000 token 的預算 s5。正是這個列表預算,讓 40 個技能在一個一個都沒被呼叫的設定中仍然每輪花 3,060 token s10,也是 description 被截短而不是技能被丟掉的原因 s11。

Chisle 的 UserPromptSubmit hook 每一輪都加入 287 位元組的 additionalContext;在 22 輪的任務中,這就是它那組在 T3 上比基準多出 +41,539 輸入 token 總量的原因。作為參考測量的 caveman,除非 prompt 以 /caveman 開頭,否則不會注入任何東西。當同一事件上有多個 hook 各自回傳 additionalContext,Claude 會收到全部串接後的內容,每個 hook 上限 10,000 字元 s15。把 Chisle、caveman 和 ouroboros 接在一起時,SessionStart 上有 3 個註冊,UserPromptSubmit 上有 3 個,PostToolUse 上有 2 個,啟動時多出 +4,269 token s15。

Chisle 的 README 宣稱 20 個任務的帳單只有基準的 52%,而 README 本身也把這個數字限定在不使用工具的單輪 prompt s3。在真實 repo 的三個任務上、每個跑 3 次,Chisle 的輸出平均總和是 9,007 token,基準是 9,615,也就是 94%;caveman 是 10,820,即 113%,而 T3 的樣本離散度為 2,014 token,所以兩個方向都沒有超出雜訊 s3。Chisle 的輸出壓縮器在 63 次執行中從未寫下任何節省紀錄。

anti-slop 被 vendor 進 tools/oxlint/,帶著全部 18 條通用規則加上 oxc/no-accumulating-spread,在未動過的 4,775 行專案中找到 109 個問題,其中 83% 來自兩條 house-style 規則(require-readable-spacing 50 個、require-safety-comment-for-type-assertion 41 個)s8。在 Claude 寫的程式碼上,它在 3 次 T3 執行中全都抓到 maxLength={field.maxLength as number},也就是 Claude 照抄了程式碼庫自己的不安全轉換 s8。這個外掛是 ESM,所以宿主專案需要 "type": "module",否則 oxlint 會失敗並顯示 Cannot use import statement outside a module。

Reticle 的 init codemod 在設定了 RETICLE_STATE_DIR 且關閉遙測的情況下執行,回報它把 MCP 伺服器註冊到另外 8 個 agent(VS Code 使用者範圍、GitHub Copilot CLI、Warp、Factory Droid、Kiro、Amazon Q Developer CLI、Cline CLI、Amp),並在 Gemini CLI 中預先核准了它的工具;之後配對失敗,出現 ERR_OSSL_EVP_UNSUPPORTED s6。Caliper 被拒絕執行:claude_code.py:106 寫死了 --dangerously-skip-permissions,而 seed_files() 會複製 ~/.claude/.credentials.json,並以 Keychain 作為備援 s2。ouroboros 的 UserPromptSubmit hook 對 write prd for reading time 這種普通 prompt,回應 REQUIRED SKILL: /ouroboros:setup,而專案範圍的安裝無法滿足這個步驟 s7。

一篇涵蓋 2,545 條軌跡、技能庫規模為 52、102 和 202 個技能的論文,報告彙總後的通過率下降為 .08、.14,最高到 21%,其中相似的 description 互相遮蔽,佔損失的比例越來越大 s20。

測量數據

實驗協定:一個真實的 TypeScript 專案,每個 repo 都只安裝在專案範圍。工作階段啟動:在 -p JSON 模式下以相同旗標送出 prompt Reply with OK,每個條件跑 2 次,數字 = 第一輪的 input_tokens + cache_creation_input_tokens + cache_read_input_tokens。消融實驗:三個程式任務(T1 短、T2 中、T3 長的 UI 任務),附通過檢查與型別檢查關卡,每格 3 次,條件 = 基準、每個常駐 repo 單獨一組、八個全部堆疊。anti-slop:用 oxlint 1.78.0 搭配 vendored 規則集,掃描未動過的專案以及 9 次基準執行中寫出的程式碼。

repo 專案範圍內安裝的內容 工作階段啟動新增 token 每輪成本
基準 無 17,378 無
Chisle 4 個技能、4 個指令、3 個 hook +3,496 每輪 +287 位元組的 additionalContext
ouroboros MCP 伺服器、39 個工具名稱 +1,642 條件式注入
reticle MCP 伺服器、19 個工具名稱 +895 / +903 未觀察到
fwc-swiftui-skills 2 個技能 +304 無
caliper 2 個技能 +172 無
img2threejs 1 個技能、352 個檔案、SKILL.md = 32,902 B +107 無
anti-slop 1 個技能 + vendored 規則集 +95 無
ui-skills 遠端 MCP、2 個工具 +37 無
八個全部堆疊 以上全部 +6,804 只有 Chisle 的每輪成本
caveman(參考) 4 個技能、2 個 hook +744 0
任務 條件 通過 新增型別錯誤 輸出 token 平均 輸出 token 最小至最大 輸入總量平均 平均費用 輪數 MCP 呼叫
T1 基準 3/3 0 1,668 1,619 至 1,739 95,462 $0.0519 7.0 0
T1 Chisle 3/3 0 1,434 1,341 至 1,502 106,001 $0.0576 7.7 0
T1 ui-skills 3/3 0 1,756 1,644 至 1,885 96,279 $0.0535 7.3 0
T1 reticle 3/3 0 1,899 1,653 至 2,177 107,263 $0.0594 8.0 0
T1 ouroboros 3/3 0 1,729 1,655 至 1,787 97,166 $0.0549 7.0 0
T1 堆疊 3/3 0 1,462 1,460 至 1,465 128,221 $0.0646 7.7 0
T2 基準 3/3 0 2,128 2,105 至 2,164 74,286 $0.0540 9.0 0
T2 Chisle 3/3 0 2,184 2,150 至 2,230 87,462 $0.0624 10.0 0
T2 ui-skills 3/3 0 2,348 2,224 至 2,504 74,869 $0.0604 10.0 0
T2 reticle 3/3 0 2,614 2,312 至 2,824 78,664 $0.0635 10.7 0
T2 ouroboros 3/3 0 2,441 2,152 至 2,815 80,819 $0.0622 10.0 0
T2 堆疊 3/3 0 2,136 2,015 至 2,216 89,378 $0.0661 9.7 0
T3 基準 3/3 0 5,819 5,423 至 6,063 198,217 $0.1551 22.0 0
T3 Chisle 3/3 0 5,389 5,206 至 5,500 239,756 $0.1565 20.3 0
T3 ui-skills 3/3 0 5,279 4,860 至 5,567 214,691 $0.1477 21.0 0
T3 reticle 3/3 0 4,664 4,008 至 5,776 198,740 $0.1293 19.0 0
T3 ouroboros 3/3 0 5,456 4,324 至 7,093 232,763 $0.1544 21.0 0
T3 堆疊 3/3 0 5,331 4,787 至 5,843 241,576 $0.1591 19.7 0

63/63 次執行通過,0/63 次引入新的型別錯誤。只有兩格超出了自己的執行間離散度:T1 上的 Chisle(−234,−14.0%)和 T1 上的堆疊(−206,−12.3%)。在 T2 和 T3 上,每個差異都落在離散度之內;ouroboros 的 T3 執行在相同 prompt 下輸出 token 介於 4,324 至 7,093,擺盪達 64%。

repo 結論 證據
anti-slop 改變了輸出,作為檢查 在 3/3 次 T3 執行中抓到同一個不安全轉換,+95 token,每輪 0
Chisle 沒有可測量的效果,反而更貴 輸出為基準的 94%,宣稱是 52%;啟動 +3,496,每輪 +287 位元組
ui-skills 沒有改變任何東西 9 次執行中 0 次工具呼叫,+37 token
reticle 有衝突 init 寫入了 ~/.claude/settings.json 和另外 8 個 agent 的設定;配對從未完成
ouroboros 有衝突 對普通 prompt 要求 /ouroboros:setup;39 個工具名稱,0 次呼叫
caliper 未執行 寫死 --dangerously-skip-permissions,複製憑證檔
img2threejs 不在堆疊內 +107 token,沒有東西會與它衝突
fwc-swiftui-skills 不在堆疊內 +304 token,靜態 Markdown

週一就做

  • 在你主要專案的全新工作階段中執行 /context all,把起始數字記下來。
  • 對每個已安裝的外掛執行 claude plugin details <name>;只有 always-on 那一行才是每輪都計費的數字。
  • 按事件列出你的 hook。任何在 UserPromptSubmit 上對每個 prompt 都回傳 additionalContext 的 hook 都是每輪的稅;只保留以關鍵字或 matcher 把關的那些。
  • 數一數每個 MCP 伺服器公告的工具名稱,預算大約每個名稱 42 到 47 token,再去翻你的 transcript,看看到底有多少被呼叫過。
  • 安裝任何帶有 init 或 setup 腳本的東西之前,先讀它有沒有寫到 repo 之外:~/.claude/settings.json、其他 agent 的設定目錄、憑證檔、--dangerously-skip-permissions。
  • 對生成程式碼的品質檢查,接成 verify 步驟裡的 linter,而不是放進 context 的技能:lint 規則每輪不花任何成本。
  • 相信任何省 token 的宣稱之前,先用有工具和沒有工具各跑同一個任務 3 次,再拿差異與你自己的最小至最大離散度比較。
  • 移除的東西用封存代替刪除,讓需要它的工作流程可以拿回來。

延伸閱讀

  • 技能列表預算和 1,536 字元的 description 上限,解釋了為什麼一個擁擠的設定會在沒有任何技能載入失敗的情況下變差。請讀 "Skill descriptions are cut short" 與 "Skill content lifecycle" 這兩節 s5。
  • /skill-doctor 的文章展示了 40 個技能每輪花 3,060 token,以及該先砍哪些;它的盲點,也就是正在使用的外掛內部那些昂貴的技能,留待後續處理 s10。
  • "超過 30 個技能" 這條經驗法則背後的論文:涵蓋 52、102 和 202 個技能庫的 2,545 條軌跡,並單獨分離出遮蔽效應 s20,以及讓它廣為流傳的易讀摘要 s12。
  • hook 串接與 10,000 字元的 additionalContext 上限,以及讓 hook 只在 Write|Edit 上觸發的 matcher 語法 s15。
  • 那個移除 63% 的討論串,其中包含在一份被移除的 MCP 設定中發現寫死的 bearer token,這是影片沒有談的安全旁支 s13。
  • Chisle 自己的 README 第 229 行和第 262 行,把它的 52% 數字限定在不使用工具的單輪 prompt,並承認短程式任務那一格輸給 caveman。引用標題數字之前,先讀小字 s3。
  • 兩個不在堆疊內的 repo 沒有評分,因為它們是手動呼叫、啟動時不花任何成本:img2threejs 用於 Three.js 場景 s21,fwc-swiftui-skills 用於 Liquid Glass 介面 s22。

來源

FAQ

MCP 伺服器在啟動時還會花上數千 token 的 schema 嗎?

在測量的版本上不會。Schema 會被延遲載入,成本取決於公告的工具名稱數量,每個大約 42 到 47 token。一個有 39 個工具的伺服器花了 +1,642 token;有 2 個工具的只花 +37。

為什麼 Chisle 輸出的 token 比較少,卻比基準更貴?

它的規則集在工作階段啟動時載入(+3,496 token),而它的 hook 每一輪都注入 287 位元組。在 T2 和 T3 上,這些輸入開銷超過了輸出節省,而輸出節省從未超出執行間的雜訊。