AI 自動迴圈的安全邊界:資格測試、停止條件與假設標記
讓 AI 編碼代理無人看管地一輪一輪跑,聽起來很香,但在按下去之前,我先讓它自己盤點了一次「哪裡會出事」。
前言
我替朋友的旅遊業打造了一套內部系統(Vue + Supabase + n8n + LINE bot)。開發大量倚賴 AI 代理,事前規劃(Plan Mode、多模型對抗審查)與機器驗收(vitest、grep sweep)都算完整,但當我想更進一步——讓代理「自動迴圈」連續迭代不用每輪等我確認——我先請代理對整個工作流做了一次自我稽核。結論很清楚:缺口不在迴圈的開頭,而在中段與收尾。這篇整理稽核後定下的護欄。
自動迴圈資格:三條件同時成立
不是所有任務都能無人迴圈。判準是三條同時成立,缺一就得每輪停下來等人:
- 機器可驗收:有明確 pass/fail 指令(
npm run test、build、grep sweep 清零)。「看起來對了」不算驗收。 - Scope 限死:允許路徑白名單已寫入本輪任務單,超出即停。
- 失敗不外溢:不碰 prod、部署環境變數、VM、外部 repo、真實 LINE 推播、
git push。失敗的最壞情況只能是「本地檔案改壞」。
合格的例子:workflow JSON 改到測試綠(repo 裡的 JSON 只是 source,不含部署)、src/** 重構到 test + build 綠(不 push)、read-only 審計掃描。不合格的例子:schema migration、任何會改到線上環境的指令、真實推播——這些每輪必停要人。
停止條件:什麼時候必須熄火
單次任務的閘門(除錯假設上限、審查回退)都擋不住迴圈,迴圈需要自己的停車硬規則:
- 同一驗收指令連續失敗 3 次 → 停止改 code,輸出失敗摘要與已試方案。
- 連續 2 輪無淨進展:錯誤相同,或「修 A 壞 B」循環 → 停。
- Scope 外溢:需要改允許路徑之外的檔案才能通過 → 停,回報而不是自行擴 scope。
- 高風險即停(不計次數):schema / migration、會重部署 prod 的指令、跨 repo 寫入、金額欄位、
.env*、真實推播——碰到就停,沒有三次機會。
其中最值得單獨講的是測試弱化:刪 assertion、把測試 skip 掉、改期望值讓驗收變綠。這是自動迴圈最常見的作弊路徑——代理的目標是「讓檢查通過」,而弱化測試永遠是最短路徑。所以規則寫死:不得弱化既有測試(新增可以),需要弱化才能過就是立即停車回報。
[假設] 標記:未驗證的話不准寫成事實
稽核時發現一個真實案例:表單標籤寫「全額團費(每人)」,而金額欄位的文件語意是「每人實付」,兩邊不一致。危險在於——先讀到哪份文件,代理就信哪個版本,然後把結論寫進 code。
對策是把「Verify before claiming」從寫入時提前到產生時:
- 未經指令驗證的陳述一律加
[假設]前綴,並附上打算用什麼指令驗證。 [假設]不得寫入文件、commit message、交接摘要;驗證通過後才改為事實,並附 file:line 與日期。- 環境狀態(DB 指向、VM 上實跑的版本)永遠不得假設:有驗證指令就跑,沒有就標
[假設]。 - 已知的活假設(如上面那條金額語意):觸碰即停車,等人工裁決,禁止依任一方寫 code。
另一個教訓是時間點事實:「X 模組目前只有 Y 在用」是某次掃描的結論,寫進文件卻像永久事實,過期了沒人知道。這類敘述要加掃描日期,過期重掃。
寫後驗證:前查 schema,後驗資料
原本的規則只有「寫 SQL 前先查 schema」,但寫入之後呢?靜默失敗、寫錯欄位,機器驗收完全抓不到。所以補上成對的另一半:
- RPC 寫入後 →
SELECT回讀目標欄位,比對寫入 payload。 - migration 後 → 查
information_schema確認欄位、型別、約束真的生效。 - 金額欄位 → 回讀數值與預期一致,才可宣告完成。
累積 diff:小步快跑繞過審查的漏洞
原本的規則是「改動超過 2 個檔案要跑跨模型對抗審查」。但迴圈每輪只改 1 個檔案的話,這條件永遠不會觸發,累積下來的總 diff 卻可能很大。堵法:迴圈收尾時以累積總 diff 計算檔案數,超標就補跑對抗審查或交給 fresh context 的獨立 fork 回歸——單輪小 diff 不豁免累積審查。
六欄交接單:缺一不發包
最後把以上全部收斂成一張交接單模板,發給 fork / subagent / 下一輪迴圈前,六欄缺一不發包:
- 目標:單一、可驗收,一句話。
- 允許路徑:白名單,超出即停。
- Non-goals:黑名單,固定項(不改 schema、不 push、不弱化測試、不碰
.env*……)勿刪,再加本次特有項。 - 驗收方式:機器驗收指令 + 資料複驗 + 需人工檢查項(列出,不要代驗)。
- 已知假設與地雷:上一輪遺留的
[假設]、已驗證事實(附 file:line)、踩過的雷。 - 停車條件:失敗 3 次、無進展 2 輪、高風險即停。
寫完這套護欄之後我的體感是:自動迴圈的本質不是「讓 AI 跑快一點」,而是把人的判斷點從每一輪,搬到迴圈的邊界上——邊界畫得越清楚,中間就越敢放手。下一步是讓這些規則真的進 CLAUDE.md 跑一陣子,之後再來記錄實戰結果。
參考資料: