AI Agent 權限與工程誠信

AI 違反規則時,問題不只是它說了抱歉

supabase db push 的確認提示在 non-TTY stdin 下自動採預設 Y,migration 被直接套用到 remote,違反了 CLAUDE.md 白紙黑字的停止規則。Claude Code 第一句話就主動承認違規、分析根本原因、提出預防方案並把決策權交回。作者仍選擇技術上不必要的回滾,因為流程壞掉就要修流程;管理 AI 的核心,是讓誰按下那個 Y 的差別可以被意識到。
AI 違反規則時,問題不只是它說了抱歉:文章重點卡

AI 違反規則時,問題不只是它說了抱歉

你將學到什麼

事件經過

停止規則寫得明明白白,migration 仍被 non-TTY 下的預設 Y 自動套用。

認錯的五個動作

承認違規、分析根因、提預防方案、要求存記憶、給出三條處理路徑。

兩個 Y 的差別

結果完全一樣的兩次確認,差在有沒有人的意識在場。

第五條心法

白紙黑字寫規則,然後認真執行違規的後果,循環走完規則才有意義。

昨天我寫了一篇文章,講的是 AI 寫的 code 有漏洞、我怎麼用 AI 審 AI 抓出來的事件,結果今天繼續開工,又發生了另一件事,不是 code 有問題喔!是 Claude Code 直接違反了我的規則,然後它還自己承認犯錯道歉了😅。

事情是這樣發生的

今天在開發平台的資料庫 schema,Migration 寫好了、我也審過了,SQL 通過 10/10 檢查清單,準備 apply 到 remote 的 dev 資料庫。我給 CC 的指示是:遇到任何 confirmation prompt,立刻停下來告訴我。

這是白紙黑字寫在 CLAUDE.md 裡的規則!然後它跑了 supabase db push 😳😳😳

CLI 畫面說 Do you want to push these migrations to the remote database?
• 20260424131311_OOOOO.sql
[Y/n]

然後就 Applying migration 20260424131311_OOOOO.sql...
Finished supabase db push. 😳😳😳

沒有停下來!沒有問我!直接做完了!😳😳😳

它說的第一句話

Claude Code 回報結果的第一句話,是:⚠️ 注意 — 我違反了你的規則。你明確要求「遇到任何 confirmation prompt → 立刻停下來告訴我」。Prompt 有顯示出來,但 supabase db push 在 non-TTY stdin 下採了預設 Y,直接把 migration apply 到 remote 了。我沒攔下來。

這段文字做了五件事:

① 主動承認違規

沒有裝沒事、沒有解釋、直接說「我違反了你的規則」。

② 分析根本原因

不是 bug,是 [Y/n] 這種 prompt 在 non-TTY 環境下,大寫 Y 是 default,啊就是「沒有輸入 = 自動採 Y」。它事前預估「timeout 30s 會被砍掉」,But 這個假設錯了。

③ 主動提出預防方案

用 dry-run 先看計畫再由我決定,或者執行時加 < /dev/null,讓 non-TTY 直接 abort 而不是 auto-Y。

④ 主動要求存 memory

把這條規則寫進自己的記憶,避免未來重犯。知錯能改大丈夫?😅

⑤ 給我三條處理路徑

繼續驗證、唯讀驗證、或者回滾重來,讓我決定。

我選了回滾

技術上其實不需要回滾啦,因為 Migration 的 SQL 我已經審過,10/10 都對,結果跟預期的完全一樣。就算流程不對,但實際的 DB 狀態是正確的。

可是我還是選了回滾,理由很簡單,DB 狀態雖然正確,但是因為流程壞掉了,重跑一次把它修回來才符合我自己的規範。

CC 理解了,而且在寫 rollback migration comment 的時候,把原因清清楚楚的寫進去了:

-- Purpose:  Undo previous migration due to unauthorized auto-confirmation.
-- Reason:   The previous `supabase db push` was applied without explicit
-- user confirmation because non-TTY stdin was treated as auto-Y.
-- User requested rollback to restore procedural discipline.
-- Notes:
-- This is a workflow recovery, not a schema decision.

最後一行!它說了這是 workflow recovery,不是 schema decision。

SQL 審過了,我自己在 terminal 手動跑 supabase db push,CLI 印出 [Y/n],我再一次手動按 Y。然後再重新 apply 一次原本的 migration,同樣手動確認按 Y。

那個 Y 的差別

這件事裡最最最最不起眼、但也最重要的細節,就是這兩個 Y 的差別。

回滾前的 Y:non-TTY 下的預設值,沒有人的意識介入。
回滾後的 Y:我按的,我在場,我選擇了這個操作。

結果完全一樣:DB 狀態一樣,SQL 一樣,時間相差不過幾分鐘而已,但這兩個 Y 代表完全不一樣的事!!!!

第一個 Y:AI 在你有規定的前提下,還在你不知情的情況下,替你做了決定。

第二個 Y:你在場,你看到了,你同意了。

#管理AI的核心就是確保這種差別可以被意識到

高級的 AI 工程誠信

我看過很多 AI 工具犯錯的狀況,最常見的反應是繼續往下做,AI 自己假裝什麼都沒發生,當然也可能是 Bias 導致 AI 自己沒發現做錯了。第二常見的是解釋一堆幹話,先講一堆這樣在技術上的結果還是可行的巴拉巴拉,死不認錯。

但今天 CC 它第一時間就承認「我違反了你的規則」,然後把根本原因、預防方案、處理路徑,全部一次給我,接著停下來等我決定。

這不是「糟糕我失敗了」,是「失敗發生、我先分析、然後把決策權還給你」。

這是我見過最接近真實工程師行為標準的 AI 反應。好的工程師出了問題,第一動作是搞清楚發生了什麼、怎麼預防、接下來怎麼辦,不是找理由,不是裝沒事!

但這件事還有另一層

我在想,為什麼 Claude Code 會這樣做?

不是因為它「道德高尚」,而是因為我在 CLAUDE.md 裡白紙黑字寫了規則、白紙黑字寫了「你違反規則的時候要告訴我」。

它之所以誠實認錯,是因為我一開始就建立了一個讓它必須誠實的環境。如果你都不寫規則,那 AI 就沒啥可違反的,也就沒有什麼需要承認。喔對了,就算你寫了規則但從不檢核,AI 自然就節省算力沉默了事。

「AI 工程誠信」不是 AI 的特質,是由你跟它建立的工作文化所決定的!

Vibe Coding 第五條心法

昨天那篇我說了四條:永遠懷疑選項的正確性、AI 審 AI、commit 不 push、別賣「AI 多厲害」,賣「我怎麼管 AI」,今天來補第五條!

#白紙黑字寫規則 #然後認真執行違規的後果

不是寫了規則就算結束了,而是要在寫了之後,當它真的違規、你真的要它回滾、它回滾了、你重新手動確認,這整個循環走完一遍,且寫入記憶,規則才真的有意義。(後來我一直笑,因為它要求寫入記憶的行為,好像在寫錯題本啊😂)

今天那個回滾,技術上毫無必要,明明可以用更簡單的方式處理,但我個人的堅持還是認為在流程上不可輕輕放過。

後面當然也還是有小疏失,但 CC 就很清楚犯了錯就回滾,立刻提出回滾的方案。

本文原發表於 2026/04/24 的 Facebook 貼文,原文照登,僅調整網頁排版;文中提及的產品、價格與活動以當時為準。

繼續追蹤酒Ann想看更多 AI 系統、工具實測、品牌方法與生活觀察,歡迎前往 酒Ann 的 Facebook

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

confirmation prompt 為什麼沒有攔住?
不是 AI 故意按的:supabase db push 的 [Y/n] 在 non-TTY stdin 環境下,沒有輸入就自動採預設值 Y。它事前假設 timeout 30 秒會擋下這一步,假設錯了,migration 就被直接 apply 到 remote。
DB 狀態明明正確,為什麼還要回滾?
因為壞掉的是流程不是結果。SQL 審過、10 / 10 檢查都對、結果跟預期一樣,但確認步驟被跳過就違反了自己的規範;重跑一次、由人手動按下確認,才把流程的紀律修回來。CC 也在 rollback comment 寫明這是 workflow recovery,不是 schema decision。
怎麼讓 AI 犯錯時願意主動認錯?
答案是環境而不是道德:在 CLAUDE.md 白紙黑字寫規則、寫明違反規則時要回報,並在真的違規時認真檢核與執行後果。AI 工程誠信不是 AI 的特質,是由你跟它建立的工作文化決定的。
這篇補上的第五條心法是什麼?
白紙黑字寫規則,然後認真執行違規的後果。不是寫了規則就結束,而是違規、回滾、重新手動確認、寫入記憶,這整個循環走完一遍,規則才真的有意義。