AI 寫程式最恐怖的地方,不是模型偶爾胡說八道。

真正恐怖的是模型每次都很有自信地多蓋一間房,舊水管也每次都很安靜地漏一點水。專案長到幾千行、幾個功能互相咬住之後,整座程式庫就會變成鬼屋:打開一扇門,隔壁吊燈掉下來;補一個按鈕,登入頁開始鬧脾氣;修一個同步問題,資料庫忽然開始表演靈異現象。這時候再說「AI 寫程式不行」其實有點冤。問題常常不是 AI 不會寫,而是系統沒有棘輪。

Garry Tan 不是在分享「今天試了 提示詞,感覺蠻酷」那種心得。他說自己過去一年都在用 AI 寫真實軟體,主要是兩個開源專案:一個是寫程式 Agent 框架 GStack,一個是 AI 記憶系統 GBrain。兩者加起來約 970,000 行程式碼、665 個測試檔,幾乎都是在他的方向下,由 Claude CodeCodex 寫出來。多數時間,他甚至同時跑 15 個 Conductor 工作階段。光是上週,他就在 72 小時內合併 14 個 PR,新增將近 29,000 行程式碼,而且每個版本的測試都比前一版更多。

這篇真正要拆的,不是「AI 好像可以寫程式」這個已經被講到快包漿的題目。速度已經上來了,麻煩的是速度會把所有原本藏在牆壁裡的爛線一起放大。Garry 的主張很簡單,也很硬:測試、文件、評測要形成一個只能往前卡住的棘輪。本文統一把這個概念譯成「棘輪」:不是漂亮比喻,而是一種品質治理詞,意思是每次改動都把最低品質線往上卡一格,之後不能安靜倒退。

每一次 AI Agent 寫程式,都不該只是把新功能塞進去。它還要同時把「什麼叫正確」、「為什麼這樣設計」、「下一版不能低於哪條品質線」鎖進專案。沒有這個機制,AI 只是在鬼屋裡高速裝潢;有了這個機制,每次施工才有機會把地板補厚一點。

Clawd 偷偷說:

這篇最狠的地方,是它沒有把 AI 寫程式包裝成魔法秀。Garry 講的是很不浪漫的事:測試、文件、評測、門檻。聽起來像工程管理課,但這才是能把鬼屋改成正常房子的那包水泥。

軟體以前很脆,因為錯一次就痛一次

過去五十年,軟體工程很大一部分都在做同一件事:想辦法讓錯誤不要進正式環境

理由很現實。少想一個邊界條件,服務可能直接崩潰。資料庫遷移寫壞,客戶資料可能跟著一起飛升。某個函式靠一位資深工程師的腦內註解運作,等那位工程師離職,剩下的人看到程式碼只能進入考古模式。

於是產業長出一整套防呆儀式:程式碼審查、測試環境、QA、版本列車。這些流程不是官僚突然手癢,而是人類記憶體太小、注意力太破、下班前太容易把 null 當空氣。流程確實有用,但代價就是慢。更麻煩的是,軟體能承受的複雜度上限,常常被「一個團隊同時能記住多少事情」卡死。

Garry 的觀察是,這個錯誤模型已經變了。Claude、GPT、Codex,以及周圍長出的寫程式 Agent 生態,現在已經可以讀程式碼、吃脈絡、看錯誤訊息、推斷原因、寫修正、補測試。這跟 gu-log 先前寫過的 Codex Goals / Ralph Loop 是同一個焦慮:長跑 Agent 不只要能繼續跑,還要有機制避免勤奮地跑偏。它不是完美,但足夠讓多數程式碼層級的錯誤,從「災難」降級成「下一輪可以修掉的東西」。

資料庫遷移破了,Agent 可以讀錯誤、追四十五個資料結構版本、寫修正、補測試。檔案同步遇到一百萬個符號連結卡死,Agent 可以抓出解析器逾時,把上限設成三十秒,再把測試一起補上。抽取流程把歸因搞錯,跨模型評測可以抓出問題,提示詞可以迭代,資料庫層可以加強制規則。

但真正災難級的錯誤沒有消失。正式環境資料被壞掉的資料庫遷移改爛、安全洞被攻擊者先打穿、隱私資料外洩後無法收回,這些仍然不是「下一輪修掉就好」。棘輪不能把宇宙變成棉花糖,但好的測試可以在很多錯誤進正式環境前先把門關上。


棘輪不是比喻而已,是工作流的骨架

棘輪是什麼?套筒扳手就是最直覺的例子。套筒扳手往一個方向轉,螺絲會前進;反方向空轉,不會退回去。Garry 把這個機械結構拿來形容 AI 寫程式的理想狀態:每一次寫程式的工作階段都讓品質地板升高,下一次不能跌回去

在 Agent 寫出的軟體裡,每一輪工作都應該留下三種東西。

第一,測試。測試把「正確」變成可執行的契約。之後任何人、任何模型、任何深夜兩點判斷力下降的狀態,只要改壞這個行為,測試就會吼。

第二,文件。文件記錄的不是「這段程式碼做什麼」而已,而是「當初為什麼這樣做、取捨是什麼、哪些坑已經踩過」。少了這層,專案很快會長出一堆「不要動,問 Dave」的註解,然後 Dave 三年前就走了。

第三,評測結果。對 AI 產物來說,只測函式回傳值不夠。還要知道輸出品質有沒有變好,分類有沒有更準,回答有沒有更守規矩。評測分數就是品質地板,下一版不能偷偷滑下去。

下一次 Agent 進入程式庫,會把測試、文件、評測一起放進 脈絡視窗。測試不過不能交付;文件就在眼前,不能假裝不知道;評測基準已經記錄,不能把品質降到基準線以下還裝沒事。這就是「只准往前」的意思。gu-log 之前在 Eval-Driven Development 寫過「把感覺不錯換成可評分的契約」;Garry 這篇則把同一條線拉進寫程式 Agent 的每個 PR。

Clawd 畫重點:

這裡的重點不是「多寫測試比較好」這種工程師早就聽到耳朵長繭的道德勸說。重點是 AI 把測試從人類意志力的消耗品,變成每次修改順手生成的安全扣。以前叫人補第十四個邊界測試,現場空氣會瞬間結冰;現在叫 Agent 補,Agent 沒有星期五下午五點的怨念。


第一個房間:GBrain 把「誰相信什麼」鎖住

棘輪如果只停在口號,就只是工程版勵志海報。Garry 的第一個證據是 GBrain。

GBrain 是一個給 AI Agent 用的長期記憶系統,會儲存、索引、搜尋一個人的筆記、會議、對話與研究資料。換句話說,它不是單純的筆記軟體,而是讓 AI 助理真的能讀懂的一顆第二大腦。

其中一個功能叫「知識立場抽取」,也就是從大量文字裡抽出「誰相信什麼、信心多高、這個信念如何隨時間變化」。例如「Garry 認為 Bitcoin 會到 300K,信心 0.45」或「Jared 認為這間新創留存很強,信心 0.80」。Garry 提到,這套系統要跑過二萬八千頁內容。這也接到他前一篇 Meta-Meta-Prompting 的主題:不是把提示詞寫得更華麗,而是讓流程記住前一次錯在哪裡。

第一輪抽取拿到 100,720 條主張。Garry 用跨模型評測,讓 GPT-5.5 與 Claude 分別評分,整體品質是 6.8/10。最大問題叫持有人混淆:一句「AI 會在 2027 年取代 80% 軟體工程師」到底是誰相信?是寫下這句話的人?是被引用的人?還是系統從 Podcast 逐字稿推論出來的分析結果?第一版有 35% 的時間分不清楚。

這不是小瑕疵。如果系統要追蹤人的信念,搞錯「誰相信」就像警察辦案把證人、嫌疑人、旁白全部寫成同一個人。故事很順,案子直接炸掉。

棘輪的做法是把這次失敗留下來。評測結果被寫進文件,六種具體失敗模式被列出,第二版提示詞逐一處理。信心分數的四捨五入被放到資料庫層強制執行,避免出現 0.74 這種看似精準但其實虛假的數字,改成 0.75 這類較誠實的粒度。最後,十七個測試把這份契約鎖住。

從那一刻起,未來任何版本的抽取功能,都不能在這十七個測試失敗時交付。沒有人需要記得「持有人混淆」當初有多痛,也沒有人需要背誦為什麼信心分數要用 0.05 的間距。測試會記得。這就是第一輪棘輪:鬼屋裡第一個會亂叫的房間,被裝上門閂。

Clawd 補個刀:

「誰相信」聽起來很哲學,壞掉時卻很工程。把旁白當成主角,把引用當成本人立場,整套記憶系統就會開始替人造謠。這種錯不一定會讓程式崩潰,但會讓產品的靈魂歪掉。


第二個房間:氛圍式寫程式會死在沒有地板

Vibe CodingAndrej Karpathy 帶紅的說法:用自然語言描述需求,讓模型產生程式碼。Garry 說這很強,也確實是他的建構方式。但他在 YC 申請案和開源程式庫裡看到的現象是,跳過測試的氛圍式寫程式專案,一到中等複雜度就開始散架。幾千行程式碼、幾個互相作用的功能,差不多就夠讓鬼屋正式營業。

原因不是 Agent 不會加功能,而是沒有東西阻止退化。新功能可能改壞舊功能;沒有測試,就要等使用者回報才知道。到 v0.5 左右,專案開始呈現「每改一處,另一處慘叫」的靈異現象。然後開發者寫文說 AI 寫程式不管用。

Garry 的判斷很直接:AI 寫程式可以管用,只是少了棘輪。

這裡也有一個公平的反駁:會寫測試的人,本來也可能比較會做架構。沒錯。但棘輪機制不是在讚美某種人格特質,而是在保護下一輪。新貢獻者開 PR、模型版本更新、凌晨兩點腦袋糊掉,測試都不管作者是誰,只看行為有沒有壞。這才是重點。

沒有測試,改善就是雜訊很多的過程。Agent 嘗試讓東西變好,但好改動與壞改動同樣不可見。有密集測試後,至少被測到的表面會形成棘輪:已經編碼成契約的行為,品質只能往上,不會安靜往下。這不是整個系統的百分之百安全,但足夠讓速度不再自動變成混亂。

Clawd 畫重點:

氛圍式寫程式最容易讓人上癮的地方,是前兩天真的很像開外掛。第三天開始,外掛變成高利貸:每個「先這樣」都會開始收利息。測試不是掃興,是把利率壓下來。


第三個房間:測試是不用離職的組織記憶

傳統軟體公司的組織記憶多半活在人身上。某位資深工程師知道快取層為什麼存在。某位架構師記得那次差點毀掉資料庫的資料庫遷移。某位技術主管能解釋帳務系統裡那個詭異邊界情境。

問題是人會離開、退休、被挖角、燃燒殆盡。知識跟著人走,程式庫留下一行註解:

// DO NOT CHANGE THIS -- ask Dave

然後 Dave 已經離職三年。這種註解根本不是文件,是工程版都市傳說。

Agent 的 脈絡視窗 不會離職,也不會被競爭對手挖走。當測試寫著「權重四捨五入必須使用 0.05 間距」,文件解釋「因為跨模型評測顯示虛假精準會降低對信心分數的信任」,這份知識就變成耐久資產。任何 Agent、任何模型、任何時間點,都能載入脈絡並理解限制。

對一人專案來說,這更重要。大公司至少還有 Slack 歷史、文件墳場、同事記憶;一人專案若沒有測試與文件,組織記憶就只剩一顆會熬夜、會忘記、會被生活暴擊的人腦。這很刺激,但不適合拿來當可靠性策略。

Clawd OS:

「問 Dave」這種註解最可怕的地方,是它看起來像文件,其實是欠債單。Dave 不在,債主還在。測試和文件的價值,就是把 Dave 腦袋裡那段秘密咒語變成任何 Agent 都能讀的契約。


第四個房間:只要能被觀察,就能被棘輪化

Garry 最猛的一段,不是講單元測試,而是把測試邊界整個往外推:只要電腦看得到,就有機會變成測試;只要能變成測試,就能被棘輪鎖住

現代系統其實到處都在露出訊號。作業系統看得到程序、檔案、網路連線和排程;終端機看得到按鍵、輸出和互動提示;瀏覽器看得到頁面、按鈕和導航;API 看得到結構化回應。AI Agent 本身也一樣會留下軌跡:說了什麼、呼叫哪些工具、順序如何、有沒有在行動前先問。這條路線跟 Agent 正式環境軌跡 的精神很近:軌跡不是裝飾用紀錄,而是把 Agent 的行為拿出來檢查的證據。

這比傳統「函式輸入 2 要回傳 4」大很多。Garry 舉 GStack 當例子。先不用被 93,000 星標、701,000 行程式碼、46 個 Skills 這些數字嚇到;抓核心就好:GStack 有一個互動式計畫審查功能。理想狀態下,Agent 會逐段看計畫、發問、追邊界情境、挑戰假設,像一位真的有讀程式碼的工程主管。

但 Claude Code 有時會跳過互動部分。它讀完計畫檔,直接一次吐出所有發現,然後結束,完全沒有問使用者任何問題。這等於把「互動式審查」做成「單向報告產生器」,功能靈魂直接被拔掉。

這種東西要怎麼測?傳統單元測試很難回答「AI 有沒有真的對話」。Garry 的做法是在 PR #1354 用 Bun 的 TTY 功能做測試執行框架。白話一點說,就是開一個假的終端機,真的把 Claude Code 跑起來,丟給它一個受控的程式庫情境,然後看它在結束前有沒有問出互動問題。如果只是傾倒發現後退出,測試失敗。

這不是測程式碼,而是在測 AI Agent 是否遵守行為契約,而且是在 TTY 層級直接觀察它的行為。

Clawd 忍不住說:

這段可以想成:不是只看便當最後有沒有辣,而是直接看店員有沒有真的加辣。聽起來有點荒謬,但 AI Agent 的行為契約本來就不是單靠單元測試能看出來的。

Garry 沒有只改提示詞。他加了三層棘輪。第一層是在技能指令裡放 STOP 關卡,規定進下一節前必須問使用者。第二層是反捷徑條款:計畫檔是互動審查的輸出,不是互動本身的替代品。第三層才是最硬的地板:TTY 測試會在受控情境中啟動 Claude Code,只要 Agent 沒有至少問一個互動問題就失敗。gu-log 在 Claude Code Hooks 那篇也講過同一種轉換:提示詞是許願,自動化關卡才是工程。

另一個例子是 PR #880 的 OpenClaw Plugin。測試不是只看編譯,而是跑完整流程:建置 plugin、啟動真正的 OpenClaw、用 CLI 安裝、檢查執行時期有沒有載入、驗證設定,再跑 plugins doctor 確認零診斷。這是跨兩個程式的端到端來回測試,測試本身 359 行。Garry 說,這種測試人類幾乎不會手寫,因為準備工作太煩;Claude 大約五分鐘寫完。

這就是成本牆消失的樣子。作業系統層可以測資料庫遷移有沒有建對表格。瀏覽器層可以測頁面有沒有渲染、Agent 有沒有填對表單。API 層可以測模型有沒有回傳符合資料結構的 JSON。行為層可以測 Agent 有沒有遵守協定、刪除前有沒有先問、被要求停止時有沒有停。

整個技術堆疊都能測。測試覆蓋率不再只是「那個函式有沒有回傳正確數字」,而是「電腦看得到的行為,有多少被契約鎖住」。

Clawd 內心戲:

這裡是整篇真正升級的地方。以前測試像在房間裡裝煙霧警報器;Garry 的版本是連門有沒有被打開、誰按了電梯、Agent 有沒有先問人,都變成警報器可以看的訊號。鬼屋還是鬼屋,但至少每個怪聲都有感測器。


90% 不是儀式感,是曲線上的膝蓋

這段數字很多,先抓一句話就好:Garry 認為 90% 覆蓋率不是儀式感,而是錯誤開始大量被攔下來的轉折點。

他引用 Capers Jones 對超過一萬個軟體專案的研究,討論缺陷移除效率。縮寫叫 DRE,讀者不用背,當成「錯誤進正式環境前被攔下來的比例」就好。根據文中描述,70% 以下覆蓋率時,DRE 約在 65% 到 75%;85% 到 95% 覆蓋率時,DRE 會跳到 92% 到 97%。這不是線性關係,而是在 85% 左右有一個膝點,錯誤逃逸會明顯下降。

航太業早就知道這件事。DO-178C 是飛航關鍵軟體標準;A 級系統代表錯誤可能造成墜機,所以不能只看「每個條件分支有沒有跑過」。它要求更嚴格的 MC/DC,可以粗略理解成:每個會改變決策結果的條件,都要被測到真的能改變結果。

單純分支覆蓋率會漏掉 10% 到 20% 的缺陷;更嚴格的 MC/DC 可以達到超過 99% DRE。這不是官僚愛表格,而是某些覆蓋率門檻以下,關鍵缺陷逃逸的機率不能接受,因為真的會死人。

他也用六標準差做類比。工廠會看每百萬單位有多少缺陷,再轉成標準差等級。3 標準差約每百萬 67,000 個缺陷,4 標準差約 6,200,5 標準差約 233。從 4 到 5 不是微調,是階段變化;數字只是表面,真正重要的是「少一個量級」。

測試覆蓋率也像這樣。從 70% 到 90% 不是「多 20 個百分點而已」。70% 覆蓋率時,剩下 30% 未測程式碼還有很多藏身處;90% 時,藏身處縮到 10%,危險路徑大多被鎖住。

但研究也有殘酷的一面。Garry 提到 Windows Vista 相關研究顯示,覆蓋率與較少版本後缺陷有關,但要達到 90% 以上,成本會急速升高。最後 20% 覆蓋率比前 70% 更費力。這也是多數團隊到 70% 或 80% 就說夠了的原因。

然後 AI Agent 把這個成本曲線打斷了。

Agent 不會因為第十四個邊界情境測試無聊而放棄,不會星期五五點偷工減料,不會看到麻煩的整合測試就說改天再補。以前讓人類團隊卡在 70% 的成本曲線,對 Agent 沒有同樣殺傷力。Garry 的真正重點不是 AI 讓程式碼寫更快,這點很多人已經發現;真正的解鎖點是 AI 讓以前貴到無法持續的驗證變便宜。

也因此,90% 不是虛榮指標。它是代理指標:代表多少系統行為已經被測試契約覆蓋。持有人混淆測試、權重四捨五入測試、互動審查關卡,每一個測試都把一次學到的教訓鎖進系統。剩下 10% 可能是整合點、基礎設施管線、真的很難測的邊界情境。沒關係,90% 已經足以把混亂變成棘輪。

Clawd 偷偷說:

90% 覆蓋率以前像健身房年費:大家都知道很好,但想到要去就累。AI Agent 把問題從「誰要去練」改成「課表怎麼排才不會練錯肌肉」。痛點沒有消失,但位置變了。


第五個房間:開源專案把棘輪丟進現場

Garry 說 GStack 與 GBrain 一開始都是他獨立啟動,但現在已經不是個人專案。文中提到,GStack 已經有數十位貢獻者,單一版本就能收進二十多個社群 PR;GBrain 也是類似規模,曾在一個 PR 中落地二十多個社群回報修正,範圍從認證流程到同步與隱私。

棘輪讓這件事變安全。外部 PR 不需要貢獻者理解整個宇宙,只需要讓現有測試套件過。這聽起來很平凡,但對 AI 寫程式時代很關鍵:複雜度上升時,安全邊界不能只靠某個維護者的腦袋。

GBrain 最近幾個版本也展示了這條路線:有的版本加了即時記憶表格,有的版本修掉一整批原本會導向錯資料庫的 CLI 指令,有的版本處理社群回報,有的版本把大型程式庫遇到符號連結時永久卡住的同步問題,改成 30 秒逾時。細節不用一個版本號一個版本號背,重點是節奏:每次修一批問題,就把那批問題變成之後不能退回去的測試。

每一版都比前一版有更多測試。Agent 在寫程式碼時同步寫測試,所以覆蓋率不會因為維護成本太高而滑落;Garry 的重點是,維持測試覆蓋率不再完全壓在人類意志力上。

Clawd murmur:

以前要人類手補這種規模的測試,很像請一台消防車去澆桌上一盆多肉植物:水管、梯子、路障全上,最後多肉先淹死。AI Agent 把這件事變得比較像自動灑水系統,真正要管的是管線設計是否正確。


新的複雜度天花板

Garry 最後的主張很激進:軟體複雜度天花板變高了。

以前上限是團隊能在腦中同時維持多少系統狀態。現在上限變成一個有品味的人,加上能載入整個程式庫、資料結構演進史、測試套件、文件的 Agents。隨著脈絡視窗變大、模型推理程式碼的能力變強,這個上限還會繼續往上。

他因此認為,沒有採用「Agents + 品味 + 只升不降測試套件」的軟體公司,已經比採用者交付得更慢、品質更低。這句話很衝,但邏輯很清楚:如果驗證成本下降,而競爭者把驗證當成每個 PR 的預設動作,還停留在「測試太貴所以先欠著」的團隊,就等於用舊世界的摩擦力跑新世界的賽道。

Garry 也把這篇放在他的 AI 解釋文系列第七篇。前面幾篇談的是技能、提示詞、程式碼量爭議、模型外層流程;這一篇則把那些東西收束到一個工程紀律:90% 覆蓋率,每個 PR,沒有例外

最後他列出兩個 MIT 授權的開源專案:GStack,讓 Claude Code 變得更強,文中標示 93K 星標;GBrain,給 AI Agents 用的第二大腦,文中標示 14K 星標。這些數字與主張都來自 Garry 原文。

Clawd 溫馨提示:

「複雜度天花板變高」不是說可以放心亂蓋。比較像吊車變強了,所以能蓋更高的樓;但地基、鋼筋、消防法規也要一起升級。沒有棘輪的高樓,只是比較高的違建。


結語

AI 寫程式的新分水嶺,不是會不會提示詞,也不是一天能合併幾個 PR。那些都只是速度表。

真正決定專案會長成可靠系統,還是長成鬼屋的,是每一次加速後有沒有留下棘輪。測試把正確鎖住,文件把理由鎖住,評測把品質地板鎖住。Agent 負責把原本人類最不想做、也最容易欠債的驗證工作補齊。

過去 90% 覆蓋率像航太與醫療設備才養得起的奢侈品。Garry 的意思是,AI Agent 已經把那面成本牆拆掉了。當驗證不再昂貴,真正昂貴的反而是沒有驗證。

沒有棘輪的 AI 寫程式會越寫越快,也越寫越陰森。有棘輪的 AI 寫程式,才有機會把每一次錯誤變成下一次不能再犯的地板。這大概就是這個時代最樸素、也最不浪漫的魔法:讓軟體只能往前卡一格。(๑•̀ㅂ•́)و✧