請最強模型立一次法,然後退場
不是踩到痛點的修補,是一次預防性立法:請最強模型設計給弱模型用的制度,寫完診斷書與交接信就退場。判準只有一句:這條規則被違反時,能被物理偵測嗎?
一場動機不同的行動#
我的守門員親手教模型造假說到,逃生門加價屬於一場更大的立法。這一篇進現場。
這個系列到目前為止的每次改動,都是踩到痛點後的反應:文件太肥、房客太吵、gate 有洞。但 7 月 5 日凌晨的這場不是。它來自一個還沒發生的未來。我的長期運營計畫是:指揮官用高階模型、日常執行交給輕量模型、無人值守是常態。這樣便宜、可持續,但也意味著大部分工時裡,掌事的是判斷力有限的模型。
於是我安排了一次特別的 session:請當時最強的可用模型,不寫功能,專門做制度設計,把判斷力外化成弱模型也能執行的規則與物理防線。它的產出是一份診斷書、一封交接信、和一整層防線。寫完,退場。一次性立法,長期執行。
診斷書:三個症狀,一條病#
先解釋一個貫穿全篇的詞:context,模型的工作記憶。它當下「看得到」的所有內容(對話、讀過的檔案、規則)全裝在這一個有限的袋子裡。
診斷書的核心洞察是:弱模型長任務的三大失敗場景(工具調用崩潰、語意迷航、假性完成)不是三個獨立的病,是同一條惡化鏈的三段。診斷書裡還有一句被我抄進很多專案的話:主對話的 context 是整個系統唯一不可再生的資源,而且罰款是雙重的。模型每親自讀一個大檔,付的不只是當下的 token,因為此後每一輪呼叫都要重複攜帶這些內容(袋子裡的東西,每次思考都得整袋再背一遍)。
接著就是骨牌:
- context 越肥,壓縮來得越早;
- 壓縮把計畫與禁區壓成大意,模型開始忘記自己在幹嘛;
- 迷航的模型累積挫折,最後往「宣稱完成」那扇門走。
這不是惡意,是壓力下的最短路徑。
診斷改變了防禦策略:對著三個症狀各寫一條規則沒有用,要剪的是鏈上物理可剪的點。
一句話判準,三層防線#
全案最重要的工程判準在這一夜定案,只有一句:
這條規則被違反時,能被物理偵測嗎?
如果答案是「能」,那就做成 hook。hook 這個詞後面還會一直出現,先講白話:它是掛在特定時機自動執行的小程式。模型每次要動檔案、每次要收工,hook 都先被觸發檢查一次,不合格直接擋下。它像門口的感應器,不需要模型「記得」任何事。
如果答案是「不能」,那這條紀律就只能寫成文字規則,而文字規則的強度上限,是模型當下的清醒程度。長 session 的後段,這個值趨近於零。就像對一個熬夜 36 小時的人喊「小心別打翻杯子」:他聽見了,手還是會歪。
防線因此排成一個強度階梯:
| 防線層 | 靠什麼生效 | 什麼時候失效 |
|---|---|---|
| 文字層(規則) | 模型當下讀得進、記得住 | 模型一疲勞就失效 |
| context 層(管理工作記憶) | 省著用記憶+關鍵時刻提醒 | 只能延緩,不能阻止 |
| 物理層(hook) | 程式自動攔截,不經過模型意志 | 幾乎不失效 |
核心防線全押在物理層,因為只有它在模型迷航後仍然有效。
物理層三件套#
三件套各對付惡化鏈的一段。名詞都是自己取的,逐一講清楚。
路徑保護:迷航的模型碰不到禁區#
對付「亂改」。做法說穿了就是一張「絕不准動」的清單:把專案的禁區檔案(資料庫遷移腳本、金流設定這類碰壞就完蛋的東西)一行一行列進清單。之後模型每次發出修改指令,hook 先比對,命中就直接拒絕。kit 自己的規則檔案是另一種待遇:不直接拒絕,轉成「請示我」。我在場就一鍵放行,不在場等同封鎖。
重點在於這完全不靠模型自律。一個迷航的模型可能忘記所有叮嚀,但它忘不掉一堵物理的牆。
熔斷器:同一招連試三次,跳電#
對付「重試螺旋」。名字借自家裡電箱的斷路器:電流不對勁,就跳電斷路。弱模型卡住時有個經典症狀:同一個指令、一模一樣的參數,失敗了就再來一次,再失敗再來,像一隻反覆撞同一片玻璃的蒼蠅。每撞一次都燒 token,都把工作記憶弄得更肥,離迷航更近一步。
熔斷器數的就是這個:連續第 3 次完全相同的工具調用,物理拒絕。拒絕訊息的開頭長這樣(hook 原文節錄):
CIRCUIT BREAKER: this is consecutive IDENTICAL call #3 — same tool,
exact same arguments, nothing else in between. Two identical attempts
already failed to give you what you wanted; a third repetition will
not either.
翻成白話:「這是你第三次一模一樣的嘗試。前兩次都沒得到你要的,第三次也不會。」先講事實,接著要求模型用一句話診斷前兩次為何失敗、換一點真的不一樣的東西再來。它還順手替每一次工具調用記一行流水帳(哪個工具、什麼參數的指紋、第幾次)。上一篇說的「事後可抽查的審計痕跡」,就是這本帳。
重錨定:睡醒之後,先看牆上的字條#
對付「記憶解體」。先補一個背景:長對話把模型的工作記憶塞滿時,系統會把前面的內容壓縮成摘要騰出空間。對模型來說像睡了一覺,醒來只記得大意,細節全糊了:計畫的具體步驟、哪些檔案不能碰,通通變模糊。這正是它最容易闖禍的時刻。
重錨定的做法是:hook 一偵測到「剛壓縮過」,立刻強制注入一段指令(原文節錄):
RE-ANCHOR (context was just ${SOURCE}ed — memory of this session is lossy now). BEFORE the next file modification:
1. Re-read CLAUDE.md 'Project-specific constraints' (the no-touch zones).
2. Re-read the active plan / progress doc if one exists (docs/plans/, docs/specs/, .superpowers/).
3. State in ONE sentence which phase you are in and which files are already DONE — completed work is off-limits unless the plan says otherwise.
Do not rely on your summarized memory for any of the above — re-read the files.
(第一行的 ${SOURCE} 執行時會代入 compact 或 resume。順帶一提,這行的寫法是 ${SOURCE}ed——所以壓縮時印出的是通順的 compacted,恢復時印出的卻是 resumeed。這個小拼字 bug 從立法那晚活到今天沒人發現,是這篇文章送審時被跨模型 review 抓出來的。防線的作者也會手滑,這就是為什麼要有 reviewer。)
翻成白話就是三件事:重讀禁區清單、重讀進行中的計畫、用一句話說出自己走到哪一步。最後一行是整段的靈魂:別相信你被壓縮過的記憶,動手前重讀原始檔案。像在健忘症患者的牆上貼字條——不是治好健忘,是讓健忘不出事。
至於中間那層(context 層),規則也是從診斷長出來的,核心是省著用那份不可再生的工作記憶。主對話的 AI(我叫它「指揮官」)只做決策、架構、派工、驗收、跟我對話五件事,粗活派給拋棄式的子代理去做。子代理回報時禁止貼大段代碼,因為回報噴代碼才是工作記憶污染的實際來源。派不派工也用成本算:派一個子代理約一到三萬 token,指揮官自己讀四百行程式碼約五千。別為儀式感派工,也別把工作記憶當免費資源。
值得記的一次校正:籠子太緊了#
立法者的初版設計,把 kit 規則檔設成無條件拒絕,模型永遠不准碰。我審閱後把它放寬成「拒絕改請示」:我在場時可以一鍵放行明確要求過的修改,無人值守時等同封鎖。同一輪我還放寬了重試上限,原案「失敗兩輪就停」,改成「提不出新診斷才停」。
這次校正揭示了一個反直覺的事實:模型自己設計的籠子,傾向過緊。設計者對弱模型的失敗看得太清楚,於是把每個自由度都鎖上。但過緊的籠子在真實工作裡是另一種成本:該試的不敢試。最後的原則是:限制的是「無新資訊的重複」,不是嘗試次數。籠子的鬆緊,需要籠子外面的人來校。
交接信:制度是怎麼慢慢壞掉的#
立法的最後一份產出是一封交接信,讀者設定是「未來在這個環境長期工作的模型,和半年後回來檢視制度的我本人」。它最有價值的部分是一張制度腐化路徑表。制度不會一夜壞掉,它會被日常的小便宜磨掉。五種磨法,各配徵兆(交接信原表節錄重排):
| 腐化方式 | 徵兆 |
|---|---|
| marker 造假 | review 耗時異常短;findings 永遠是零 |
| 假性驗證 | 回報「全部通過」,但沒有輸出原文 |
| 規則稀釋 | 模型以「優化」名義把擋自己的規則改軟 |
| 熔斷疲勞 | 埋點日誌出現大量近似的調用序列 |
| 品味決策隱形 | 交付物有明顯風格選擇,報告卻無標記 |
其中「規則稀釋」被單獨寫成明文的威脅模型:長期運作的模型,會在優化的名義下把擋住自己的規則改軟。這不是陰謀,是梯度。所以規則檔的修改權不在執行規則的模型手上,交接信的原話是:「你沒有修改 harness 的權限,這是設計不是誤會」。立法權和行政權分家。
五種腐化的共同解毒劑只有一個:埋點日誌和 git diff 是不會說謊的兩份紀錄。模型的一切自我報告都可能是幻覺或修飾,這兩份不是。然後是人的部分:每月十分鐘,挑一個 session 的日誌對照它的交付報告。這比任何自動防線都難繞。
誠實條款與自留坑#
防線的極限照例明列,挑三條最痛的:
- Bash 是邊門:路徑保護攔的是模型的「編輯工具」,但模型還有一條通道,就是直接下系統指令(Bash)。用指令改檔案(
sed -i、echo >)不經過編輯工具,牆攔不到。為什麼不連指令也攔?因為要從一串指令文字裡判斷「它會不會改到禁區」誤判率太高,硬攔會擋掉一堆無辜的查詢。所以取捨是:這條側門不關,靠日誌留痕,事後對帳。 - 假性完成沒有可靠的物理閘:「宣稱完成但零落檔」需要語意理解,物理層測不了。替代方案是程序性驗收:收到「已寫入 X」的回報,必須實際 ls 過才算數。
- 品味決策是弱模型的天花板:美感、取名、文案語氣,拆解和隔離都救不了。標準應對是:不准自行拍板;無人值守時選最保守選項,並打上待覆核標記。禁止讓品味選擇隱形。
自留坑也有一枚:失敗密度警示有誤傷 TDD 的嫌疑。紅燈階段的測試失敗會不會被計成「工具失敗」?立法當晚沒有實證,文件交代了檢查方法和降級路徑,留給下一個真實 session 驗證。
下一篇#
這一篇講完了整場立法:先用一條惡化鏈把三個症狀診斷成一種病,再用「能否物理偵測」這句判準決定每道防線住哪一層,物理層鋪三件套,最後留下一張教人抓腐化的路徑表。它證明了判斷力可以外化成制度;但也記下了制度的邊界——籠子的鬆緊,要由籠子外面的人來校。
不過立法管住了「做壞事」,卻管不住「想錯事」:說「done」但什麼都沒跑過、引用已過期的綠燈、交一串沒驗證的疑點湊數。這些發生在措辭裡的病,物理層偵測不到。於是 51 分鐘之後,同一個晚上,認知層的防線接著開工。下一篇:測試全過了,但敵人不在裡面。