假設今天早上,有人打電話說你們公司的 AI 昨晚改壞了一份共用文件,或者把一份不該外流的資料寄了出去。你第一個要回答的問題是:真的是我們的 AI 做的嗎?
很多人答不出來。不是不誠實,是沒有紀錄。
今年的 AI 代理事件裡,這個情況一再出現。Hugging Face 7 月 16 日先發現自己被入侵,OpenAI 到 7 月 21 日才把它跟自己的內部測試連起來。9 月有研究者把 5 月 RubyGems 套件庫被灌進大量惡意套件的事,指向 OpenAI 的代理;OpenAI 的回應是,它的代理確實用過 RubyGems 做一般任務,但「無法證實」上傳惡意套件的指控。Simon Willison 的評語很直接:不管是查不了自己的紀錄,還是查了不說,兩種都不好。
出事那天要回答的四個問題 它做了什麼 → 動作、參數、結果 誰准的 → 你按的/規則/分類器 當時什麼模式 → 手動、自動、略過權限 因為哪句話 → 從你的指令串到動作
同意鍵換人按了,紀錄也要換
以前你每一步都按同意,「誰准的」答案永遠是你。自動模式變成預設之後,多數動作是你寫的規則或分類器准的,你根本沒看到。你沒看到的放行,只能靠紀錄還原。
2026 年 10 月 15 日的 2.1.301 版,Claude Code 在每一次權限判斷的紀錄裡加了兩個欄位:判斷當下是什麼權限模式,以及自動模式分類器的結論(放行、擋下、沒有結論、無法使用)。官方的說法是,這樣才分得出一個動作是分類器准的還是權限規則准的。再加一個開關,被擋下時還會記下擋它的是哪一條內建規則,例如資料外洩。
原本就有的欄位也值得知道:每次判斷都記了來源,分得出是設定檔、hook、你按了「以後都同意」、你只同意這一次、你按了拒絕,或你直接關掉了詢問。動作執行完另有一筆紀錄,開了詳細模式會包含完整的指令。每筆紀錄都帶著同一句指令的編號和動作編號,官方說可以用它們把「你說了什麼 → 它判斷了什麼 → 它做了什麼」整串接回來。
這些紀錄要送到你自己的收集端(OpenTelemetry),預設是關的。你下的指令原文預設也不記,要另外開。官方建議組織把這些開關鎖在管理設定裡,因為開發者自己的設定可以把紀錄關掉,除非管理設定鎖住它。
沒有收集端的人,至少留三樣
多數個人和小團隊不會架紀錄收集系統。那就退一步,確保出事時至少有三樣東西。
Git 的提交紀錄。它改了哪些檔案、什麼時候改的,Git 都記得。前提是你讓它在分支上工作、每一段落提交一次,而不是在主線上一路改到底。
被擋下的清單。/permissions 裡有一個「最近被拒絕」分頁,自動模式擋下的動作都在那裡。它擋過什麼,往往比它做過什麼更能告訴你它試圖做什麼。
對話紀錄本身。Claude Code 會在本機保存對話,但有保留天數的清理設定。重要的長任務,結束時請它寫一份「做了什麼、碰了哪些檔案和網站」的摘要存進專案資料夾,不要只靠預設保存。
要留多少,看它做到哪裡
紀錄不是越多越好,留太多沒人看,跟沒留差不多。我自己的分法是看 AI 這次能碰到什麼:
| 你讓 AI 做的事 | 至少要留 | 保存多久 |
|---|---|---|
| 只產生草稿給你改 | 不用特別留 | — |
| 在你的資料夾裡改檔案 | Git 提交(在分支上做) | 跟專案一樣久 |
| 自己上網、自動模式跑長任務 | 再加:任務結束紀錄檔、被擋清單 | 至少到成果交出去之後一個月 |
| 碰正式環境、錢、客戶資料 | 再加:集中收集的事件紀錄,鎖在管理設定裡 | 寫進公司規定,不要靠預設 |
紀錄檔有一個細節我很堅持:要求它只記事實、不寫評語。我遇過不只一次,AI 寫的工作摘要說「全部測試通過」,回頭重跑才發現有一支根本沒跑。讓它自己寫的紀錄,要能被別人重跑驗證,所以檔案、指令、網址都要寫完整,不能只寫「已處理」。
台灣的風險分類框架在列管理手段時,寫了一句「記錄事件確保人工智慧系統運作的可追溯性」。這句話現在是寫給各部會訂規範用的,但它說的事情很樸素:沒有紀錄的 AI,出事時連「不是我們」都證明不了。
動手做
每一次讓 AI 跑長任務或無人看管的任務,在交辦的最後加上這段,讓它自己留一份紀錄:
任務結束時(不論成功、失敗或中途停下),請在專案資料夾的 _logs 資料夾新增一份紀錄檔,檔名用今天日期加任務名稱,內容包含: 1. 我交辦的原話(逐字貼上)。 2. 你實際做了的每一個動作:讀了哪些檔案、改了哪些檔案、開了哪些網址、執行了哪些指令。 3. 哪些動作被擋下或你主動停下,原因是什麼。 4. 你不確定、需要我確認的地方。 只記事實,不要寫評語。這份紀錄寫完不要再修改。
有組織管理權限的,請負責的人看一次官方的監控文件,把權限判斷和執行結果兩種事件送到公司的收集端,並鎖在管理設定裡。
做對了的樣子:出事那天,你能在半小時內回答那四個問題;你知道公司的紀錄是誰收、存多久;你翻過一次「最近被拒絕」,而且看懂它當時想做什麼。
同意鍵換人按了之後,「誰准的」只能靠紀錄回答。出事那天你要答四件事:它做了什麼、誰准的、當時什麼模式、因為哪句話。有收集端的把紀錄打開並鎖住;沒有的,至少留 Git 提交、被擋清單和一份任務結束時的紀錄檔。沒有紀錄,連「不是我們」都證明不了。
站內延伸
- 自動模式預設放行什麼 → 同意鍵消失之後
- 還原鍵和 Git 怎麼分工 → 還原鍵救不回哪幾種情況
- 出事後的報告怎麼寫 → 找方法AI 資安事件報告
來源: Claude Code:Monitoring(tool_decision 事件的 permission_mode、classifier_verdict、classifier_category、source 各值,tool_result 的指令欄位,用指令編號與動作編號串接,指令原文預設不記,管理設定鎖定);Claude Code:changelog 2.1.301(新增上述欄位,「分得出分類器與權限規則」原意;發布日依 npm 版本紀錄為 2026-10-15);Claude Code:Configure auto mode(/permissions 的最近被拒絕分頁);Simon Willison:OpenAI agents and RubyGems(2026-09-12;OpenAI 9 月 11 日的回應、對未揭露的評論);Simon Willison:OpenAI's accidental cyberattack against Hugging Face(7/16 與 7/21 的時間差);數位發展部:人工智慧風險分類框架 v1.0(3.4.1 管理措施「記錄事件確保人工智慧系統運作的可追溯性」)。
同意鍵換人按了,
誰准的只能靠紀錄回答
什麼時候看這張:你讓 AI 在自動模式下跑任務,但說不出它昨天做了哪些事。
- 出事時連「不是我們」都要靠紀錄證明
- 沒有收集系統,至少留提交紀錄和被擋清單
- 長任務結束時,叫它自己寫一份紀錄檔
第一個動作下次交辦長任務時,最後加一句:結束時把做過的每個動作寫成紀錄檔。被擋清單在 /permissions 的最近被拒絕分頁。