TL;DR: 想讓 AI agent 照流程走,直覺是做一個會在執行當下「擋住」它的東西。但那些閘門其實不攔人——它要的是一張收據:這關過了沒、信心多少、幾點過的,寫進記錄裡。真正有牙齒的不是閘門,是那本記錄改不掉:每一筆都用雜湊鎖在前一筆上,動了舊的就會被抓到。所以它能保證的其實只有一件事:你跳了步、做錯了,都留得下記錄、賴不掉。至於擋住你?它沒打算做。


前幾天我想寫一篇講 workflow 的東西,開頭很順,打算寫「我把決策從流程裡拆出來,放進一道道閘門」。寫到一半卡住了。因為我突然答不出來:那些閘門在真的跑起來的時候,到底擋了什麼。

有點不安。這是我自己寫的框架,連我都講不清楚「它怎麼擋」,那就有點糟。所以我把編輯器關掉,去翻 code。

它看起來像個很兇的保全

第一眼,這套東西兇得很。

到處都是大寫的 MUSTverdict: failHARD GATE,還有一條明明白白的「不准繞過」規則:不准跳過任何關卡與證據檢查,狀態不明就一律當失敗。流程本身是一條排好的隊伍:分類、計畫、實作、審查、測試、出貨,一關一關往下走;審查要是發現缺陷,還會把任務退回去重做。看起來就是一個站在門口、誰想插隊就把誰攔下來的保全。

我被跳步咬過很多次,那種 agent 還沒跑第二步、就先回你「好了,搞定」的狀況,是我當初寫這套東西最主要的動機之一,我在AI 代理常見痛點與我們的嘗試裡碎念過。所以我理所當然地以為,我請了個保全。

翻下去,保全根本不出手

結果沒有保全。

我盯著狀態機那份文件,上面寫的是「AI 必須自己遵守這個階段順序」。自己。沒有另一支程式站在那裡、在 agent 想跳步的瞬間把它的手壓住。一道閘門實際在做的事,是要 agent 在過關時吐一小塊東西出來、然後把一張收據寫進它的工作記錄:這關叫什麼、過了還是沒過、信心幾趴、幾點。就這樣。

我又往旁邊看,看到自己當初寫的一行注釋,大意是「這樣 gate 的進度就能被事後稽核,不需要一個 runtime 的硬攔截器」。

是我自己寫的。我居然忘了。

其實有些框架是真的把保全做出來的。像 LangGraph 那一類,會把 agent 的流程寫成一張明確的狀態圖,由一個 runtime 引擎帶著它一個節點一個節點走,那才是真的有一個「保全」在場。我這套剛好賭了相反的方向:不做引擎,改用記帳。沒有哪個一定對,就是兩種取捨。

那張收據今天長什麼樣、用什麼介面寫進去,老實說不重要,以後換個工具大概又不一樣。重點是它是一張留下來的收據,不是一道關起來的門。它寫進去的地方,就是我在Work Log:跨 session 的記憶機制講過的那本工作記錄;而「凡事留證據」這個習慣本身,是只用 Prompt 和技能,也能做到基本治理的主題。

那 agent 想耍賴怎麼辦

既然沒人攔,那它跳步、亂寫收據、甚至事後把難看的記錄刪掉,不就好了?

這就是我翻到後來、覺得當初的自己其實想得比我記得的清楚的地方。框架真正花力氣的地方,不是去攔 agent,是去讓記錄改不掉

那本稽核日誌,每一筆都帶著前一筆的指紋(一段 sha256 取前 8 碼),像鎖鏈一樣一節扣一節。你只要動了中間任何一筆舊的,從那裡開始整條鏈的指紋就對不上,下次一驗就直接報「有人事後竄改」。光這樣還不夠,它還額外拉 git 進來當一個外部見證人,連「把尾巴幾筆悄悄刪掉」這種動作,都會在 PR 的 diff 裡變成一段看得見的刪除。

老實說這招一點都不新。git 的版本歷史就是一筆扣一筆的雜湊;憑證透明度(Certificate Transparency)那種公開稽核日誌也是同一個思路:不阻止壞東西被寫進去,而是讓任何事後的塗改都藏不住。我只是把這個老把戲,搬到 agent 的工作記錄上而已。

所以 agent 還是可以跳步、可以亂搞、可以做錯。閘門攔不住這些。但它沒辦法假裝自己沒跳,也沒辦法偷偷把證據撕掉。所以這裡講的「強制」其實很弱:它攔不住你做壞事,但你別想賴掉、也別想沒人發現。

它兇,但它不騙你

有件事我蠻喜歡當初的自己的:它沒有不懂裝懂。

那一堆兇巴巴的關卡,其實分得很清楚。出貨前的檢查,不少都標著「建議性」:提醒你一下,但你確認過就能過;只有少數幾個是真的硬,例如還有沒解的高風險安全問題,就直接判失敗、不准出貨。而且就連那個「判失敗、停下來」,執行的也還是 agent 自己。我甚至在驗證器的注釋裡寫了一句:每個 agent 到底有沒有乖乖照做,是 honor-system(自律制),我不會假裝它是被測試強制的。

說到底,這跟現在大家專案裡那些 agent 規則檔(AGENTS.md、CLAUDE.md 這類約定)是同一種東西:沒有人在背後強制執行,靠 agent 自己讀、自己守。我只是在上面多疊了一層:守了沒守,都留下賴不掉的記錄。

至於「那我寫一個 skill 叫它跳過驗證不就好了」——這條也堵死了,用的是最樸素的方式:規則的位階比 workflow 高、workflow 又比 skill 高,衝突時上面的贏。skill 我在Skill 邊界設計:從能力到合約談過,它管的是「會做什麼」,掛在某個階段裡幫忙;但拿 skill 去跳過一個階段,本身就被定義成一次違規。skill 是配角,改不動主線。

走到這個設計,其實有個很土的原因

我現在會這樣講這套東西:它從頭到尾沒打算在執行當下攔住一個 agent。它賭的是另一邊——你做了什麼、跳過什麼、在哪一步心虛,全都留得下、改不掉,然後交給人看。這跟 git 的賭注幾乎一樣:不去防止你寫出爛 commit,而是讓歷史不可竄改、可以被一條條翻出來審。

會變成這樣,原因蠻土的。當初是搬到 Antigravity 那邊的時候,我需要更明確、更硬的關卡,才把這層流程拆得這麼清楚;原本在 Claude 上,軟軟地用提示帶著走也就過了。一邊逼我把話講死、一邊不用,差別大概就在那。

但拆完、翻完、看清楚之後,我反而比較踏實。我比較信一道老實說「我只記帳、不攔人」的閘門。至少它沒有假裝自己擋得住——那種假裝,最後通常只是一份沒人在讀的規則。

Agentic OS 是開源專案:github.com/KbWen/agentic-os


延伸閱讀