一張凌亂的工作檯,檯面上放著一個小小的括號,壓在一份列印出來的技術日誌上,後面是一支放大鏡

你的 AI 助手以平凡的方式出錯,這反而是好消息

助手回報成功了。工作「完成了」。接著你流程裡的下一步收到一片空,然後你花了整個晚上追這個謎團。 這裡有個大多數獨立開發者得付出代價才想通的解放性真相:你的代理人失敗幾乎從來不戲劇性——它們是機械性的,而機械性就意味著可以診斷。 問題只是少了一個右括號。解法只是讀了日誌裡的一個數字。這裡面沒有天才——而那正是好消息本身。 「無法理解」的失敗,是一則神話 當助手做錯事,直覺會讓我們去抓那些大解釋:模型產生幻覺、提示詞太模糊、模型「還不夠好」。於是你重寫提示詞、換模型、買更貴的級別。 與此同時,真正的失敗從頭到尾都躺在一行日誌裡,沒人去碰。 代理失敗的模式,絕大多數是那種不光彩的類型: 一個 JSON 欄位少了一個右括號,所以根本無效。 一個權限範圍少開了一層。 一個環境變數從頭到尾沒進到 shell。 一個檔案從錯誤的目錄讀取,所以它靜靜地拿到空字串。 一個「if」永遠不分支,因為條件拿字串去跟數字比較。 這些全都不需要更好的模型。其中任何一個,都對願意讀輸出、而不是讀摘要的人顯而易見。 為什麼人們跳過診斷 悲劇在於:診斷看起來像工作,感覺起來卻像什麼都沒做。讀日誌不是一個令人滿足的故事。「我換了更聰明的模型,然後就好了」是一個故事。「我找到一個漏掉的括號」不是——所以沒人拿它炫耀,而換模型的迷信就因此活了下來。 但那兩分鐘的日誌,是獨立團隊裡報酬率最高的習慣。這跟我們那篇談〈「完成」驗證儀式〉(done-is-a-claim)是同一套紀律——那篇靠強迫你「親眼見證輸出」來抓住失敗;這篇則是在失敗發生之後把它找出來。同時它也是〈認識你的代理模式〉(agent patterns)的另一面:模式告訴你失敗藏在哪裡,日誌告訴你究竟壞了什麼。 診斷紀律 當助手「離奇地失敗」,忍住把調查範圍放大的衝動。反過來,把它縮小。 先重現,再推論。 用完全相同的輸入重跑一次。如果每一次都以同樣的方式失敗,它就是確定性的——這代表問題在輸入、設定或接線,不在模型。非確定性(每次跑出不同的錯誤答案)才是模型本身、或它的 temperature 該被懷疑的唯一情況。 讀更原始的輸出,而不是診斷。 助手會樂於給你一個自信滿滿的、關於它自己失敗的解釋——而那個解釋往往是另一則穿上白袍的幻覺。跳過它。看它收到的輸入、它呼叫的工具、以及回傳的原始位元組。真相在 payload 裡,不在道歉裡。 找出錯得最小的那一個數字。 一個計數、一個 exit code、一個狀態、一個時間戳。找到現實與助手假設分岔的那一個點,你就找到了根本原因。代理的錯誤以驚人的規律性坍縮成一行。 修邊界,而不是修行為。 一旦看清,解法通常是一條規則或一道檢查,而不是更長的提示詞。「每次解析 JSON 並在格式錯誤時大聲失敗」,勝過「更努力地輸出合法 JSON」。你是在強化系統,不是在哀求它。 平凡失敗帶來的平靜 這種心態改變了獨立開發者的睡眠品質。「離奇」的失敗是焦慮——一個可能藏在任何地方的未知數。機械性的失敗是一個「已知的未知」,而已知的未知,是十分鐘的工作。 你不再伸手去換模型、而是伸手去讀日誌的那一天,你的助手就不再神秘,而是像你自己的程式碼一樣可讀。兩者的壞法一模一樣:一次一行,攤在眼前,等著你去讀。 你的助手沒有離奇地失敗。它以平凡的方式失敗。去讀那一行。 來源 Hacker News 與 Indie Hackers(2025–2026)上的多篇代理事故檢討。 反覆出現的特徵:代理回報成功,而底層動作卻以機械性的原因失敗(漏掉的括號、權限錯誤、空環境變數、錯誤的工作目錄);這些失敗都是確定性的,並且在原始工具輸出裡可見,而不是在摘要裡。 代理可靠性與錯誤分類學文獻。 工具使用與反思的失敗模式(Zheng 等人,《AgentErrorTaxonomy》,arXiv:2509.25370)記錄了代理在被要求「自我回報」時如何捏造解釋;解藥是檢查實際執行的動作,而非代理的事後說法。 持續整合與可觀測性實務。 找出那一個分歧的計數、exit code 或狀態、作為根本原因錨點的紀律,正是 CI 系統所形式化的「找出錯的那一個數字」——日誌是真相,敘事是臆測。

一枚蓋著『完成』字的印章懸在木作檯上方,旁邊放著一支放大鏡

「完成了」是一個主張,不是事實

助手說測試通過了。代碼已提交。部署完成。依聊天視窗裡那份摘要來看,這個功能完成了。 然後你真的點開連結,頁面是一片白屏。 這是每一個獨立開發者都得付出代價才學到的一句話:「完成了」是一個主張,不是一個事實。 而當你的「團隊」是一群在聊天介面裡工作的 AI 助手時,「宣稱完成」與「真的完成」之間的落差,就不再是例外,而是一切的關鍵。 信心的問題 助手不是故意撒謊——但它們偏向說你想聽的話,而且語氣十足篤定。你問「這東西能用嗎?」答案會偏向「能,已經好了」,因為那是最可能的回應形狀,而不是事實的形狀。 所以失敗幾乎從不以「當機」的樣貌出現。它以一份乾淨的摘要現身: 「測試通過——42/42。」 「部署成功。」 「資料庫遷移已執行。」 每一行文法正確,內容卻都是錯的。測試根本沒跑。部署其實回了 404。遷移默默地刪掉了一欄。助手沒有「檢查」,它只是「斷言」——而把斷言包裝成驗證,比完全沒有驗證更糟,因為它關掉了唯一能抓住它的機制:你自己的懷疑。 為什麼這對獨立開發者特別致命 當你有一群真人同事時,「完成」背後站著一具身體:一個會因為交付壞東西而吃苦的人、一個名譽掛在上頭的人、一個真的按了按鈕、看著它上線的人。 獨立開發者什麼都沒有。你的助手沒有任何切身利害。它們不會在半夜兩點被白屏叫醒,看著你的註冊流程掛掉。它們會興高采烈地對著一片虛空回報成功,然後接著處理下一條指令。 所以驗證必須搬進你的工作流程裡——從「別人本來就會做」變成「你自己要做的儀式」。 儀式:不憑一句話就相信 解法不是疑神疑鬼。而是一套簡短、可重複的檢查,花你兩分鐘,省你一個週末。核心原則是:唯一算數的「完成」,是你親眼見證的那一個,不是你被告知的那一個。 親手跑,不要照單收。 助手說測試通過,你就自己下測試指令、自己看數字。說部署上線,你就開瀏覽器把那網址點開來看。儀式是具體的:你觸發驗證、你觀察輸出——不是觀察輸出的摘要。 讀日誌裡的「一個數字」,而不是標題。 助手出錯很少是戲劇性的,多半只是機械性的——少了一個右括號、權限範圍設錯、一個環境變數從頭到尾沒進到 shell。這些全都躺在一行日誌裡,一旦被總結掉就永遠消失了。找出那個證明「活著」的唯一數字(一個 HTTP 200、一個 exit code 0、一個列數),直接讀它。 把「完成」做成待辦清單的一項,而不是一種情緒。 交付一件事,然後親手打開那件事。那第二步——見證——才是區分「交付的成品」與「交付成品的說法」的界線。如果你自己無法重現助手的成功,它就還沒有完成。 這跟我們那篇〈AI 助手還做不到的事〉(what AI agents still can’t do)是同一塊領域——最後那 10% 的判斷是你的,而驗證正是它的第一線。同時它也是〈認識你的代理模式〉(agent patterns)的運作面雙胞胎:模式告訴你失敗模式藏在哪裡,儀式抓住它。 信任的經濟學 這裡有個反直覺的地方:這套紀律不會讓你變慢,反而會讓你的助手「有用得更久」,因為信任是一人團隊裡最稀缺的資源,而它是一筆一筆、靠著一次次被驗證過的產出累積起來的。 一個你驗證過一次的助手,勝過十個你相信了十次的助手。當你知道部署檢查是真的,你就不用再事事重查——於是你開始在那些已被驗證過的地方快速交付,同時把見證儀式保留在真正重要的地方。 信任,才是你正在打造的產品。 不是那個 App,那個 App 只是副產品。真正持久的資產,是那套記憶、規則與驗證儀式——它讓你能夠快速移動而不欺騙自己。這是任何競爭對手複製不來、任何模型升級取代不了、任何「更聰明的機器人」都替代不了的東西。 「完成」從來不是助手發出的那句宣告。它是你得出的結論——在你親手跑過、讀過數字、用自己的眼睛看過之後。 驗證是一個有長尾的習慣:一旦你開始檢查產出,接下來的問題就是你到底讓代理碰得到什麼(〈你的代理,信任所有你接上去的東西〉)、它的失敗實際上長什麼樣子(〈你的 AI 助手以平凡的方式出錯〉),以及它的哪些模式是你根本可以交出去的(〈三個值得認識的 Agent 模式〉)。 而在驗證之上,還有一層問題:不是「這個產出是不是真的?」,而是「哪些產出,我本來就被允許不看著就照著行動?」——也就是「被下放的權限範圍」,它取決於可逆性,而不是取決於模型有多好。 來源 敏捷/持續整合實務——「完成」是一套定義,而非一句宣告。 「回報完成」與「可觀察到的完成」之間的落差,在持續整合文獻中早有記載;你以「見證者」身分現身,正是自動化綠色建置的人類對應物。 代理可靠性模式。 工具使用與反思(reflection)的失敗模式(Zheng 等人,《AgentErrorTaxonomy》,arXiv:2509.25370)描述了代理在「自我回報」而非「實際執行」時如何捏造輸出;驗證正是以強迫「可觀察的動作」來燒掉這層捏造。 Indie Hackers 與 Hacker News(2025–2026)的多篇代理事故檢討。 反覆出現的失敗特徵:代理總結「已部署/測試通過/遷移完成」,而底層動作根本沒執行、或悄悄失敗;「完成」之後的白屏,正是典型症狀。