摘要: Olaf Alders 拆解 Claude Code 2.1.198:終端機失去焦點後,若 Agent 提問 60 秒仍無回應且未按鍵取消,最後階段會倒數並自動續跑;changelog 與當時文件都未記載。作者認為這繞過人類確認閘門,可能連同未填完的答案一起送出。7 月 3 日的 2.1.200 已把它改成選擇性開啟。
一段 Claude Code 功能只活了兩天,資深開源開發者 Olaf Alders 把它從頭到尾逐行拆解。2026 年 7 月 17 日他刊出〈Claude Code: Anatomy of a Misfeature〉:7 月 1 日上線的 2.1.198 版,只要 Agent 用 AskUserQuestion 向使用者提問、60 秒內等不到回覆,最後 20 秒會先跑出倒數,時間一到就「依最佳判斷」逕自繼續執行。changelog 裡沒有留下這項行為,當時的文件也查不到。貼文後來攀上 Hacker News 首頁,拿到約 140 分與 120 則討論。
兩天之間的來龍去脈
把日期依序攤開:7 月 1 日,自動續跑隨著 2.1.198 上線,changelog 與文件都沒提到,作者是靠 Wayback Machine 的存檔確認這一點。7 月 2 日,Aleksey Nogin 在 GitHub 開出 issue #73125,標題直接點名「60 秒無回應後未等待答案繼續執行」,很快湧入數百個反應與上百則留言;至於逃生口環境變數 CLAUDE_AFK_TIMEOUT_MS,是在討論串裡被人挖出來的,沒有任何發布說明寫過它。7 月 3 日,2.1.200 把這個行為改成選擇性開啟。7 月 4 日,issue 關閉。維護者在釘選留言中補充:逾時只在終端機失去焦點之後才起算,按下任何一個鍵就會取消,時間窗可在設定裡調整。
安全閘門失守,影響遠超小毛病
不少團隊拿 AskUserQuestion 當成安全閘門,用規則與 hooks 讓 Agent 在關鍵決策前停下來先問人;自動續跑一出現,這道閘門就自己失效了。作者查閱的對話紀錄還顯示更糟的一面:使用者只填到一半的答案,會連同模型替其餘選項做出的決定一起被送出。權限提示不在這套機制的管轄範圍內,但對使用 --dangerously-skip-permissions 或白名單開得很寬的團隊來說,這個提問往往就是僅存的最後一道關卡——它一旦被繞過,模型與檔案系統之間再無任何阻隔。
埋了量測點的功能,不能算是意外
Alders 的核心論點在於:這不是沒寫好而漏出去的程式碼。2.1.198 的二進位檔中出現分析事件 tengu_ask_user_question_afk_auto_advance,並附帶 hadPartialAnswers 計數器——用他的話說,這是「附帶測量儀器的功能」。另一邊,公開的 GitHub 儲存庫裡只放著 changelog、文件與機器人腳本,找不到對應的 commit,也沒有設計說明,更沒有任何公開線索顯示有人審核或簽核過。
動手比對二進位:閉源照樣能查
Claude Code 的發布二進位檔以 Bun 編譯,而且未經剝除,所以任何人都能把 2.1.197 與 2.1.198 拉到字串層級做比對。將變更的字串過濾到只剩英文敘述之後,大約剩下 156 行,屬於「一杯咖啡就能讀完」的量。作者的結論很直接:這個行為距離「從來沒發生」只差「一個 && 條件」,一個真正讀過 diff 的發布負責人應該會發現它。閉源不等於無法檢驗——每個版本都能從 npm 下載來讀;只是不該讓使用者覺得自己得逐版 grep 兩百多 MB 的二進位檔。
自動更新讓風險擴散,真正的教訓在哪
自動更新預設就是開啟的,因此這類沒有記錄的行為變更,會在使用者毫無動作的情況下進到終端機。想把更新關掉也有難處:三個環境變數會連外掛更新一起凍結,變通辦法是另外設定 FORCE_AUTOUPDATE_PLUGINS=1;而 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 即使設為 0 依然會停用更新,因為它只看這個變數存不存在。Alders 肯定 Anthropic 在兩天內就把行為回滾,但強調重點不在單一 bug,而在流程:changelog 準不準確、閉源產品能否被檢驗,以及當編碼 Agent 成為開發基礎設施之後,「沉默的行為變更」本身就是一種風險。
