寫於 2026 年 8 月 16 日(補 8 月 13 日的排程),9 月才上線(部落格的發佈額度 8 月 10 日就用完了,這批稿子要等到九月才發得出去)。文中對 Windsurf 與 Claude Code 的描述以 8 月 16 日查到的官方文件為準,你讀到時文件可能已經改版。

規則檔第一次失控,是在我發現 AI 開始漏看規則的時候。

那份全域 CLAUDE.md 當時什麼都想管。派工怎麼派、model 怎麼挑、commit message 什麼格式、分支怎麼開、什麼情況要停下來問人、踩過的坑一條一條往後面補。每加一條都很有道理,因為每一條背後都是一次真的踩過的坑。檔案就這樣一路長。

然後開始出事。我明明寫了「驗收不能自己驗」,它照樣自己驗完自己說完成。

第一個反應是寫得更清楚。我把那條規則展開成三行,補了正例反例,說明為什麼自驗沒有用。檔案又長了一截,下一個 session 還是自驗。第二個反應是加強語氣。粗體、驚嘆號、前面掛「鐵律」兩個字,往檔案最上面搬。也沒用。

繞了一大圈才想通:問題不在那條規則寫得夠不夠兇,在它旁邊還有四十條同樣寫著「必須」的東西。一份檔案裡如果每件事都是最高優先,那就等於沒有優先。

別人家直接不給你寫那麼長

卡在這裡之後,我開始好奇別的工具怎麼處理同一件事。查到 Windsurf 的時候有點意外,因為它根本不打算跟你討論這個。

官方文件對 rules 檔就一句話:Rules files are limited to 12000 characters each.

沒有「建議」,沒有「盡量」。就是一個數字。

它的規則檔分兩層。跨所有專案的那份叫 global_rules.md,專案層的則是 .windsurf/rules 這個目錄,裡面的規則綁在 glob 或自然語言描述上。搜尋範圍寫得很細:當前 workspace 目錄、workspace 底下任何子目錄、以及一路往上找到 git root 為止。企業版另外還有系統層的 rules 目錄,macOS 放在 /Library/Application Support/Windsurf/rules/*.md

同一頁的 Best Practices 只有一種語氣:Keep rules simple, concise, and specific. Rules that are too long or vague may confuse Cascade.

查的過程有個小插曲。docs.windsurf.com 這個網址現在會回 308,把我轉到 docs.devin.ai/windsurf/... 底下,文件內容還在,路徑換了家。這是我自己抓頁面時看到的轉址,至於背後的公司整併怎麼回事,我沒去追。

這裡要先把話講死:Windsurf 我沒裝過,一次都沒跑過。上面每一句關於它的描述,來源就是官方那一頁文件,沒有任何實測成分。而正因為只有文件,有件事我必須照實說:官方文件沒有寫超過 12,000 會發生什麼事。那一頁從頭到尾沒出現「截斷」「忽略」「報錯」任何一個詞,我也翻不到第二頁在交代這件事。

網路上倒是很多二手指南講得斬釘截鐵,說超過會被靜默截掉、說舊版的上限是 6,000 字元。那個 6,000 我在現行官方頁面上找不到,所以它不會出現在這篇文章的論證裡。憑印象寫數字這種事,寫的人爽一次,讀的人被誤導一整年。

Anthropic 把硬上限設在另一個檔案上

回頭看 Claude Code 這邊,官方 memory 文件的立場清楚到有點固執。

它給了建議:target under 200 lines per CLAUDE.md file. Longer files consume more context and reduce adherence. 兩百行,超過就會吃掉更多 context、遵守率會下降。

但建議就只是建議。同一份文件在講自動記憶的段落裡,順手把底牌掀了:This limit applies only to MEMORY.md. CLAUDE.md files are loaded in full regardless of length, though shorter files produce better adherence.

不管多長,整份載入。你寫十萬字它就吃十萬字,一個字都不砍。

有意思的是那句話的前半段。Claude Code 是有硬上限的,只是那條線不畫在你寫的檔案上。

它畫在 Claude 自己寫的自動記憶索引 MEMORY.md 上:每次對話開始只載入前 200 行或前 25KB,先到者為準,超出的部分不會進 session。而且超限之後的行為寫得一點都不含糊:寫入照樣成功,但 Claude Code 會回一個錯誤,叫 Claude 把索引重寫短一點,因為超出的內容下一次載入就會被丟掉。

把兩邊擺在一起,那條線的位置就很清楚了。人寫的檔案,給建議;機器自己寫的檔案,給硬上限,還附上明確的超限行為。這是一個關於「誰該為長度負責」的產品判斷,而不是技術做不做得到的問題。

Windsurf 的判斷剛好反過來:人寫的檔案,也一樣先秤重。

12,000 這條線真正在管什麼

上限這種東西,看起來是在管檔案大小,實際上管的是另一件事。

出國前打包行李會挑東西,是因為航空公司會秤。同樣一個行李箱,沒人秤的時候你會一路塞到提不動才發現不對;有人秤的時候,你在家裡就已經在做取捨了。硬上限真正做到的,是強迫「決定不寫什麼」這個動作提早發生

規則檔真正的敵人叫做「每一條單獨看都有道理」。沒有上限的時候,刪東西永遠可以明天再說,反正多一條也不會怎樣。有上限的時候,今天就得排序:這四十條裡面,哪一條重要到值得佔掉另一條的位置。

排序這件事,AI 沒辦法幫你做。它只能忠實地讀完你寫的東西,然後在四十條互相矛盾的「必須」之間隨便挑一條執行。Claude Code 的文件對這點誠實得刺眼,它直接寫:如果兩條規則互相打架,Claude 可能會任意挑一條。

不過 12,000 也不是什麼神聖的數字。那是一條跟你的專案完全無關的線。它不知道你這份檔案裡哪一段最重要,越線的時候(假設真的會截)砍掉的是尾巴,而尾巴不一定是最不重要的部分。它也分不出你在寫哪種語言。中文一個字元裝的資訊比英文多得多,同樣 12,000 格,中文寫得下的規則量根本不是同一個等級。文件寫的是 characters,實際怎麼算我沒跑過,這句當推測看就好。

兩邊真正的答案,其實都不是上限

有件事我覺得比字數上限更值得注意:這兩個產品各自的解法,最後都繞開了「壓縮」這條路。

Windsurf 的 .windsurf/rules 目錄,裡面的規則綁 glob 或自然語言描述。Claude Code 的 .claude/rules/paths frontmatter 綁檔案 pattern,寫了 src/api/**/*.ts 的規則,只有在 Claude 讀到相符的檔案時才進 context,其餘時間根本不佔位置。

同一個結論從兩個團隊各自長出來:與其想辦法把規則寫短,不如讓它只在相關的時候才出現。

這也是我後來走的路。全域 CLAUDE.md 被我拆成一份路由檔加上 ~/.claude/rules/ 底下的分檔。CLAUDE.md 只留每個 session 都需要的硬規則(語言、優先序、不可跨越的操作、完成的定義),其他全部標上觸發條件:要派 subagent 之前才讀調度那份、要開分支之前才讀 git 那份、想寫「已完成」之前才讀判斷準則那份。

規則檔的 token 成本不是抽象概念,它每個 session 都在跟你收錢。這件事我在 Copilot CLI 改成按 token 計費那篇裡算過一次,結論很直白:常駐在 context 裡的每一行,你都是天天付一次。至於 CLAUDE.md 本身怎麼寫、放哪裡、怎麼分層,之前那篇完整教學有整理過。

沒人幫你設上限,你就得自己設一個

拆完檔案還有一個問題沒解:分檔之後,每一份還是會繼續長。

所以我在維護規則裡自己訂了一條門檻:單一 rules 檔超過 250 行、或全域 CLAUDE.md 超過 120 行,就要停下來提案精簡。這條規則沒有任何產品在幫我執行,純粹是寫給未來的自己看的。

寫這篇的時候我順手量了一下現況。全域 CLAUDE.md 105 行、3,869 字元,離自己訂的 120 行還有一點空間。七份 rules 檔加起來 587 行、32,628 字元。

最大的那份是判斷準則,146 行,11,297 字元。

Windsurf 那條線是 12,000。

我訂的是行數門檻,它訂的是字元數上限,兩條線的來源完全無關,最後落在幾乎同一個位置,中間只差 703 個字元。這當然是巧合,但它也說明一件事:一份規則檔長到人開始覺得「這好像該整理了」的那個點,跟工程師拍板寫進產品的那個點,其實差不多。差別只在誰先開口。

回到最前面那份什麼都想管的檔案。現在我會怎麼處理?先問這一條是不是每個 session 都需要,不是的話寫進分檔並標上觸發條件;再問它跟現有的哪一條衝突,衝突就先解決衝突再談新增。

產品有沒有幫你設上限,動到的其實是你哪一天會開始刪東西。有上限的人在越線那天刪,沒上限的人在 AI 開始漏看規則那天刪。兩邊最後刪掉的東西可能一模一樣,差別在於,前者知道自己越了線,後者得先出一次事才知道。


資料來源(2026-08-16 查證):

本文對 Windsurf 的所有描述皆來自上述官方文件,未經實際安裝或執行驗證;Claude Code 側的規則檔拆分與行數統計,是本機環境的實際狀態。