TL;DR: AI 回報「完成了」的時候,真的做完、做一半繞過去、方向整個誤會,這三種在那段話裡讀起來幾乎一樣。它把「以為做了」講得跟「真的做了」一樣流暢。與其去判斷那句話可不可信,不如把預設反過來:做完了,就讓它給我看一個我自己查得到的東西,commit、測試輸出、diff,證據大小配任務大小。
你叫 AI 改個東西,過一會它回你一段話:「完成了,我改了 authService 的驗證邏輯,順手補了 token 過期的處理,邊界情況也測過了。」
讀起來很順,像一個真的把事情做完的人寫的。問題就在這裡。
你有沒有過這種經驗:AI 說搞定了,你也就點頭了,過兩天才發現它根本沒動到那一塊?我在AI 代理常見痛點與我們的嘗試裡把這個列成第一個痛點:輸出難以核查。你拿到的是一段「已完成」,但完成的依據是什麼,往往什麼都翻不出來。AI 不是在騙你,它只是把「我以為我做了什麼」講得跟「我真的做了什麼」一樣流暢。
看起來做完,跟做完,中間那一段空隙,就是這篇想聊的。
為什麼那句「完成了」這麼好騙
它寫「測過了」的時候,不管有沒有真的測,那三個字都一樣順。因為對它來說,寫出那句話跟去把測試跑一遍,是兩個各自獨立的動作。文字漂亮,不保證事情發生過。
我自己一遇到講得很順的回報,就會不自覺地信。大概是人跟人相處養出來的習慣吧。一個能把事情說得有條有理的人,我們會假設他真的懂。這套假設對人多半還行,套到 AI 上就會漏。
而且它的回報幾乎都是報喜。你很少看到 AI 主動說「這塊我沒做完」,它預設交差。所以你這邊得有一個對應的預設去接它,不然它報什麼你信什麼。
把預設反過來
一句話:預設不信,看到東西才算數。
這與其說是疑神疑鬼,比較像是把舉證責任擺回它那邊。AI 說做完了,那給我看一個我自己查得到的東西。它說「測過了」,我就請它把指令直接跑一遍,輸出貼上來;它說「改好了」,我問哪個檔案、第幾行。
光是把這句問出口,常常就有額外收穫。你問一句「測試真的有跑?」,很多時候就會冒出「啊那個其實還沒跑,setup 卡住了」這種補充——這句你不問,它就默默蓋過去了。要證據要的不只是那份證據,還有它在補證據時順手交代出來的、原本要悄悄略過的那一截。
證據要配得上任務大小
要的證據得配得上任務,不然你自己也撐不住。
改一個 typo,證據就是一句 grep:舊字串還在不在,一行的事。一個功能,證據是測試輸出,幾個 pass 幾個 fail,不是「測試通過」這四個字。refactor 就麻煩一點,要 diff,還要原本那批測試在覆蓋得到的範圍內還是綠的;行為沒變才叫 refactor,不然只是改壞了沒被發現。動到資料庫 schema,那得看 migration 真的在目標 DB 上跑完、留下了版本紀錄,或者用 \d 看新欄位確實進了 schema,不是「我寫好 migration 了」就算。
差別在能不能被戳破。「測試通過」很難證偽,「跑 npm test,比如 47 個 pass、exit 0」可以,它能錯得很具體。一個沒辦法被證偽的證據,在「查核」這件事上等於沒做,只是換個地方再講一次「相信我」。
開工前先問自己:做完會長什麼樣
「什麼東西能證明這做完了?」這個問題,表面上在查 AI,但先卡住的常常是我自己。如果我答不出來,說不清這件事做完該長什麼樣,那問題多半出在任務本身,還沒想清楚。
所以這個習慣最值錢的地方不在事後抓錯,在事前。任務還沒開始,先問自己一次:做完的話,我會指著什麼說它好了?答得出來,你就有了一個完成的標準。答不出來,等於把「怎樣算完成」整包外包給 AI,它會自己定一個,而那個幾乎不會是你心裡那個。
英文那邊我把這件事寫成一條結構原則,No evidence, no completion,從訊息佇列的 delivery acknowledgment 一路講到它怎麼把完成標準、範圍、檢查點一起拉進來。那篇偏骨架,這篇是同一件事落到每天的手感。
它撐得住的地方,跟撐不住的地方
你要是在搭 agent,那「給我看東西」這個問答可以自動化,框架裡那個 evidence gate 就是把它固定成流程的一環,每過一關就留一張收據。收據寫進工作記錄,等收尾歸檔,那本稽核日誌用雜湊一筆鎖一筆,事後動了就會被抓到、賴不掉,這我在怎麼讓 AI agent 照流程走寫過。但你要只是開著對話框在用,那下面這個手動的小動作,對你來說就是全部了:收據還沒被自動要求、要不要信全在你一念之間的時候,靠的就是這個。
它有一個本質上補不了的洞:你只驗得了你知道要驗的東西。AI 在一個你壓根沒想到要檢查的地方出錯,這個習慣接不住。能稍微擋一下的,是順手要它列一句「這次我沒動到什麼、預設了什麼」,把它替你做的假設逼出來,但那也只是把洞縮小,補不滿,剩下的還是得靠你對任務本身夠熟。
它穩穩擋得掉的,是另一種:那種你心裡其實有點數、做一半繞過去、看起來完成其實沒有的情況。方向整個誤會的那種,它只能擋一半,但至少你會發現:它給你看的證據,對的根本是別的東西。以我的經驗,前一篇我抓過的那種「接受了看起來完成、後來發現沒有」大概六七成都落在這一帶,先把這塊穩穩接住,已經很划算。
所以我現在不太把它當成一道驗證關卡,比較像一個習慣性的小動作:在相信「完成了」之前,先讓那句話對上一個你自己跑得出來、查得到的東西。看到了,再點頭。
Agentic OS 是開源專案:github.com/KbWen/agentic-os
延伸閱讀
- No evidence, no completion — 英文系列裡把「要證據」當成一條結構原則來推的那篇,骨架版
- AI 代理常見痛點與我們的嘗試 — 「輸出難以核查」就是這篇講的那句「完成了」,那邊把它列成第一個痛點
- 只用 Prompt 和技能,也能做到基本治理 — evidence 是那裡四個治理動作之一,這篇是它背後那層
- 怎麼讓 AI agent 照流程走 — 收據被自動要求之後會怎麼被鎖住、賴不掉



