avatar
蕭富云行動應用開發者 · Android & Flutter

唯一一道等人的閘 — 一輪 agent 工作的八個階段

2026-08-29 · 9 min read

說明: 本文由 AI(Claude)根據我的初始筆記與想法完成。

上一篇〈把計畫寫在票上〉談的是 agent 的狀態該存在哪裡。結論是抬到 issue tracker 的留言串上。但票上記的只是階段之間的交接——計畫、核准、PR、合併。一輪工作內部怎麼跑,票根本管不到。

這篇要談的就是那個內部。

先講清楚一件事:agent 最常出的錯,不是寫錯程式碼,是做了你沒要它做的事,然後告訴你做完了。

「你確定嗎?」不是閘門

最直覺的防線,是讓 agent 每動一次手就問一次。這招會失敗。而且失敗得很安靜——問得太頻繁,人就開始無腦按 yes。閘門還在畫面上,但已經不擋任何東西了。

真正的問題從來不是「問幾次」。是被問的那一次,你手上有沒有足夠的資訊可以回答。

八個階段,只有一道等人

現在的做法是把整輪切成八段。只有第三段停下來等人:

1 估量 → 2 驗收條件 → 3 閘門〔等人〕→ 4 草圖
8 收工 ← 7 重跑驗證 ← 6 合規審查 ← 5 實作迴圈

其餘七段,沒有人在旁邊看著。是模型自己的紀律,僅此而已。

閘門長什麼樣

停下來的那一刻,吐出來的就是四個欄位:

Size ▰▰▱ medium — 一行:範圍多廣、思考多深、多難還原
Acceptance:
- 一條可觀察的結果
Non-goals: 這一輪刻意不碰的東西
Changes: 動哪些檔案、意圖是什麼

四個欄位,各有各的用處。

估量看三軸——範圍、深度、可逆性。大小不等於範圍,這點要注意。一個講得很窄的要求,也可能重得要命。

驗收條件要寫成結果,不是動作。「空清單會顯示佔位文字」,不是「顯示佔位文字」。差別在哪?動作可以單方面宣稱完成,結果不行。

Non-goals 是欄位,不是裝飾。它是後面審查時,diff 不准越過的那條線。範圍沒有歧義就寫 none,別為了填滿硬湊。

Changes 講檔案與意圖,讓你知道等一下會發生什麼。

這四格真正的作用,是讓你在一次回答裡就把整輪講完。閘門只有一道,因為它值錢。資訊最完整的那一刻,你點一次頭,就這樣。

剩下七道,交給紀律;而紀律會衰減

問題來了。模型會忘記規則。尤其是便宜的模型。

忘記的方式還很具體。寫在設定檔開頭的規則,到了第四十個回合,早就被推到脈絡的邊緣去了。它沒有被違反,只是不在視線裡了。一次載入的規則會隨對話衰減——這跟模型聰不聰明沒什麼關係。

我的解法很笨,但有效:每一回合重新注入。每一則使用者訊息進來,hook 就把閘門的規格和審查的觸發條件重新貼回脈絡裡。規則不再是開場白。是背景音。

這是整套設定裡最不起眼的一件事。但也最有效。

三條往回的邊

只能帶走一件事的話,我希望是這三條:

步驟長大了  ──→ 回到估量        (不是硬著頭皮做完)
驗證分歧了  ──→ 回到程式碼      (不是去改測試)
審查有發現  ──→ 回到程式碼,且在重跑之前

第一條。你當初給的那句話,涵蓋的是你當時看到的描述,不是它後來長成的樣子。範圍變寬、深度變深、還原變難——只要有一項超出當初的估量,就該停下來重估,重新等你的話。做到一半發現變成另一件事,卻還拿著舊的許可繼續走——這是我看過最常見的失控方式,沒有之一。

第二條。結果跟計畫不一致的時候,回到程式碼,不要回到測試。把測試改到通過,是所有捷徑裡最便宜、也最致命的一條。它讓紅燈變綠,但沒有讓任何東西變對。

第三條。審查發現的東西,要在重跑驗證之前修完。順序不能顛倒。理由,下一段講。

最後一道閘:在同一個回合重跑

「三則訊息之前測試是綠的」——不算數。

證據必須跟它支撐的那句宣稱,來自同一個回合。上一次綠燈之後你又改了東西,那次綠燈就不再描述現在這棵樹了。沒有當回合的重跑就報完成?那不是事實。是穿著事實外衣的猜測。

順帶一個很小、但很賺的坑:

set -o pipefail; flutter analyze 2>&1 | tail -6

沒有前面那句 set -o pipefail,shell 回報的是 tail 的離開狀態。tail 不管分析器抓到什麼都會成功。於是這個檢查會永遠顯示通過。這種東西得寫進規則裡,不然每隔一陣子就會再犯一次。真的會。

收工要講三件事

完成了什麼、延後了什麼、還不確定什麼——就這三件事。

「做完了」如果有東西被默默跳過,就是錯的。「測試通過」如果有測試被 skip、被標 pending、被 stub 掉,也是錯的。誠實的報告不好看。但使用者可以對一個被指出來的疑慮採取行動。對一個沒被說出口的空洞,他什麼也做不了。

一個誠實的但書

成本是真的。每一輪都要先寫一個 block。小事情會覺得囉唆,所以留了三個出口——唯讀的回合直接豁免、用斜線指令叫起來的技能不加外層閘門(叫它本身就是許可)、一句「就做吧」可以把整個 session 的閘門關掉。

更該說清楚的其實是另一件事:我沒辦法證明模型百分之百守得住這八段。每回合注入只是讓它更難忘記,不是保證。老實說,這只是機率問題。所以下一步不是再加規則。是去量它到底守了多少——那是另一篇要講的東西。

一句話收尾

把閘門收斂成一道,讓人在資訊最完整的那一刻點一次頭。其餘七道交給紀律,讓紀律每一回合重新注入——別指望它自己記得。剩下的偏移,靠那三條往回的邊收回來。