刪除、測量、一條規則壞了
刪掉 CLAUDE.md,代表移除 Claude Code 在每一場對話開始時都會讀取的指示檔案。Claude Code 的創造者 Boris Cherny 曾在台上說,每六個月就該刪一次。七週內有 22 支影片重複這句話,沒有一支真正打開過一個專案。
這篇文章做了那些影片沒做的事:拿一個有 177 行 CLAUDE.md、三個 skill、四個指令和一個 hook 的真實應用,把五個日常任務分別在有檔案和沒檔案的情況下各跑一次,然後計算結果。44 次執行之後,剛好只有一條規則壞了。這個檔案在每個任務上都要花 token,數量從來不固定,而且其中有一行沒人能遵守。
那段影片,逐字重現,還有不是他說的兩句話
這段片段來自 Boris Cherny 在 YC Startup School 的演講,錄製於 Opus 5 發布隔天。他的原話是:每六個月,刪掉你的 CLAUDE.md,刪掉你的 skill,刪掉你的 hook,看看模型會怎麼做,可能會讓你驚訝。他說,對 Opus 5 而言,Anthropic 確實建議試試看:模型或許已經不再需要那麼多指示了。
三十秒之前,有一句沒人引用的但書。Anthropic 並不會刪掉整個程式庫,而是刪掉一大部分,並把這個過程稱為 ablation。完整的逐字稿今天依然保留這句話。Claude Code 系統提示裡有 80% 就是這樣處理的:先全部刪掉,再逐行找回來,逐行測量。
反應影片塞進他嘴裡的兩句話,演講裡根本沒有。「context、目標、以及完成的定義」這句話從未出現,最接近的說法是任務、防護規則、退出條件。「64 個 agent 一起重寫 Bun」也不是他的數字,那其實是 Jarred Sumner 在 Bun 那篇文章裡的說法。Cherny 自己說的是十一天,被問到數量時,他猜是數千次。
七週內有 22 支影片引用了這段片段,沒有一支真正做過測試。所以這篇文章做的,是他實際描述的方法:刪除、逐一找回來、測量。
測試工具:是 ablation,不是刪除
Ablation 指的是每次只拿掉設定裡的一個部分並測量效果,而不是全部刪掉再用猜的。CLAUDE.md 在每一場對話開始時會被讀取,而且每個回合都會再讀一次;skill 只有在被呼叫時才會載入。這個差異正是這次測量的重點。
Anthropic 內建了刪除開關:一個簡單的旗標,和 Cherny 在台上提到的變數一樣。這個專案是我自己的一個真實應用:177 行指示、三個 skill、四個指令,以及一個每次搜尋都會觸發的 hook。
| 項目 | 數值 |
|---|---|
| 日常任務 | 5(新增元件、編輯、重構、修改 store、架構問題) |
| 設定組合 | 5(完整版、沒有檔案、沒有 skill、沒有 hook、什麼都沒有) |
| 模型 | 固定一個 |
| 環境 | 空的設定目錄,每次執行前重新複製專案 |
| 執行次數 | 44 |
| 成本 | $39 |
每次執行都用同一套方法評分,在同一份複製專案上,由腳本而非人工判斷。判斷是否壞掉的依據:專案自己的規則(import、型別、design token、翻譯),再加上 typecheck 和 lint。
目前唯一一個為這類 ablation 打造的工具 Caliper,只會拿掉 skill 和 MCP 伺服器,不會動到這個檔案;CLAUDE.md 的替換是手動完成的。限制只說一次:一個專案、一個模型、每個格子跑兩次、沒有逐字稿。第一組結果就定了調:重構任務的結果完全一樣,有檔案時花了 64 美分,沒有時是 63 美分。
壞掉的是什麼:一條規則,發生在新檔案
壞掉的那條規則是一條國際化(i18n)規則,用檔案自己的話說就是:一定要同時新增英文和法文,絕不把使用者看得到的字串寫死。在新增元件的任務上,有檔案時,四次執行全部都寫了翻譯檔案。沒有檔案時,四次裡有三次把標題寫死了。同樣的任務、同樣的專案、同樣的模型、同樣的提示。
| 新增元件 | 有寫翻譯檔案 |
|---|---|
| 有 CLAUDE.md | 4 之 4 |
| 沒有 CLAUDE.md | 4 之 1 |
編輯任務則說明了另外一半。每一種設定組合都做對了,即使什麼都沒有也一樣,因為周圍的程式碼已經教過模型:每個被編輯的元件旁邊,都已經有一個翻譯檔案。其他一切在全部 44 次執行中都維持一致:import 別名、用 type 而非 interface、design token、store 的寫法。程式碼本身就示範了這些,而這個檔案只是重複一遍。
ETH Zurich 的一篇論文在 138 個真實議題上測了同一件事。它的發現是:context file 不會提高成功率,成本卻平均多出約 20%,而且模型確實有遵循指示。有一個例外:有一次沒有檔案的執行,還是照樣寫了翻譯檔案。這條規則在沒有檔案時並非不可能做到,只是不可靠。只有一條規則壞了,就是程式碼教不會的那條。而省略這項工作的那次執行,也剛好是最便宜的一次。
這個檔案的成本,逐個任務
CLAUDE.md 的 token 成本,就是有檔案和沒檔案兩次執行之間讀取 token 數量的差異。
| 任務 | 沒有檔案時少讀的 token |
|---|---|
| 新增元件 | 61% |
| 編輯 | 15% |
| 重構 | 5% |
| 修改 store | 4% |
| 架構問題 | 14% |
| 十次執行整體 | 32% token、22% 金額 |
32% 是每支影片都會拿來當標題的數字,但那是錯的數字。最大的節省來自那次沒有寫翻譯檔案的執行:便宜是因為做得比較少。當輸出結果完全相同時,這個檔案的成本是 4% 到 14%,而那篇論文的 20% 剛好落在這兩個數字之間。
這個機制大約是 1,800 個 token,每個回合都會重新讀取一次。Skill、hook 和知識圖譜,無論有沒有,都沒有產生可測量的差異。雜訊比其中大部分因素都更大:同一個任務、同一個檔案,一次花了 $2.11,另一次只花 $1.33。有兩次執行碰到了回合上限,一次有檔案、一次沒有。所以這個檔案到處都要花一點成本,只在一個地方值回票價,除非它也說了謊。
說謊的那些行
會說謊的行,指的是模型無法遵循、或者不管有沒有都不會改變結果的指示。前面提過的那一行就是:從 design-tokens 別名匯入 theme。這個別名根本不存在:TypeScript 設定只對應了一個前綴,而 tokens 資料夾裡也沒有 theme 檔案。每一次執行,不管有沒有這個檔案,做的都是和周圍程式碼一樣的事,同一行 import 寫了 44 次。
這個檔案裡有 82 行架構總覽。同樣的問題,問了六次,答案都一樣:六次全都找到同樣的九個檔案,從後端到畫面,順序也一樣,不管有沒有這份總覽都一樣。其中有一段指向一個這個複製專案裡根本沒有的知識圖譜;就算圖譜存在,這個問題的成本也沒有變。
| 指標 | 數值 |
|---|---|
| Anthropic 的檔案長度建議 | 200 行以下 |
| 這個檔案 | 177 行 |
| reporails 三萬個專案資料集裡的中位數檔案 | 50 個項目、12 條指示 |
| 這個檔案裡真正的指示行數 | 177 行中的 24 行 |
當兩條規則衝突時,決定哪一條勝出的是它們的位置,而模型從不會說明這一點,某家廠商的測試裡差距接近九十個百分點。這份總覽或許對這次沒測試到的任務有幫助:只問了一次,只有一個答案。所以總共有三種行:值回票價的那一種、程式碼已經教過的那一種、還有會說謊的那一種。
留下、搬走、刪除:精簡清單
分成三堆,每一堆背後都有測量依據。
| 分類 | 內容 | 測量依據 |
|---|---|---|
| 留下 | 程式碼示範不出來的規則 | 6 行,救回了 4 次執行 |
| 搬走 | 架構總覽和指令清單 | 107 行,沒有測到任何收益 |
| 刪除 | 會說謊的行,以及程式碼樹本身已經呈現的行 | 44 次一致的結果 |
留下模型錯過兩次的東西,這正是 Anthropic 自己對這個檔案的判準。把總覽和指令搬進一個需要時才會載入的檔案樹;Anthropic 七月那篇文章說,單一集中的檔案是個迷思。Hook 則保留下來:閘門不會因為模型變強而過期。要砍掉的是模型已經學會的那些文字,留下的是閘門本身。
事後的檔案大概剩七十行左右,加上那六行值回票價的規則。這就是 Cherny 方法完整的樣子:刪除、逐行找回來、測量。一個專案、一個模型、每個格子跑兩次;你分堆的結果會不一樣,方法不會。刪除只弄壞了一條規則,省下的也不多。找出那些會說謊的行,才是真正的收穫。
AIDive