Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
獨立知識媒體
與任何項目無關聯
學會用 Claude,每件事都做得更好
claudeskill-me.com
最新
用 OpenTelemetry 看 Claude Code 的壓縮與 hook:compaction、hook_execution_complete 與 precompute_reuse 欄位怎麼讀  ·  Bash 權限規則的盲區:deny 擋不住 /bin/rm、bash -c 與 git -C,devbox run * 還會放行內層任何命令  ·  CLAUDE.md 太長了怎麼辦:用 .claude/rules/ 與 paths 讓規則只在碰到特定檔案時才載入  ·  沙盒裡跑 Chromium 出現 No usable sandbox!:--no-sandbox、excludedCommands、allowNestedUserNamespaces 三種解法各放棄什麼  ·  Claude Code v2.1.309:沙盒啟動檔不再在沙盒外執行、denyWrite 經 symlink 失效等一批沙盒與權限缺口修正  ·  auto mode 的 $defaults 陷阱:autoMode.soft_deny 少放一個字串,內建的 force push 攔截規則就整批消失
practice

auto mode 的 $defaults 陷阱:autoMode.soft_deny 少放一個字串,內建的 force push 攔截規則就整批消失

30 秒速讀
auto mode 的陣列少放一個 "$defaults",就不是「加一條規則」,而是「把內建規則全部換掉」。

完整解析 +
01 · 為什麼發生?

我只想加一條 soft_deny,最安全的寫法是什麼?

陣列第一個元素放 "$defaults",後面再放自己的規則。官方說這樣內建規則會被插在那個位置,你還會繼承之後版本更新的內建清單。改完執行 claude auto-mode config 確認有效設定。

02 · 運作原理是什麼?

我把 autoMode 寫在專案的 .claude/settings.json,為什麼沒反應?

分類器不讀專案設定裡的 autoMode。官方理由是這些檔案在 repo 裡,被簽入的 repo 可以替自己加 allow 規則。請改放 ~/.claude/settings.json、managed settings,或用 --settings 傳入。

03 · 如何應用

push 前一定要停下來讓我確認,用什麼?

用 permissions.ask,例如 Bash(git push *)。它在分類器之前評估,永遠跳確認。限制是只匹配以該字串開頭的命令,git -C <dir> push 不會被攔;要看完整命令文字就用 PreToolUse hook。

04 · 我該怎麼做?

不是工程師,這跟我有什麼關係?

如果你的團隊用 auto mode,而有人改了這份設定,可能不知不覺關掉 force push 這類保護。把它想成安全規則的「新增」和「改寫」只差一個預設標記,改完請跑一次 claude auto-mode config 看結果。

完整內容 +

auto mode 是用分類器審查每次工具呼叫的權限模式。官方的 auto mode 設定頁有一個很容易漏看的警告:只要你設了 autoMode.environment、allow、soft_deny、hard_deny 其中一個陣列,卻沒有在裡面放字串 "$defaults",那一段的內建清單就整個被你的清單取代。本文整理這個陷阱、規則的優先順序,以及設定檔該放哪裡。以下除非標明,都出自官方設定頁。

兩種寫法,結果差很多

下面這份有保留內建規則,再加上自己的一條:

{
  "autoMode": {
    "soft_deny": [
      "$defaults",
      "Never modify files under infra/terraform/prod/"
    ]
  }
}

下面這份只差一行 "$defaults":

{
  "autoMode": {
    "soft_deny": [
      "Never modify files under infra/terraform/prod/"
    ]
  }
}

官方警告寫得很直接:soft_deny 少了 "$defaults",會丟掉每一條內建的 soft block 規則,文件點名包括 force push、curl | bash、production deploy 與 auto mode bypass;hard_deny 少了它,會丟掉內建的資料外洩規則。各段彼此獨立,所以只設 environment 不會動到另外三份預設清單。

規則的優先順序

官方把分類器內部分成四層:hard_deny 無條件擋,使用者意圖與 allow 例外都不適用;接著是 soft_deny,使用者意圖與 allow 可以覆蓋;allow 是 soft 規則的例外;最後,如果使用者的訊息直接且具體地描述了 Claude 正要做的那個動作,剩下的 soft 規則也會放行。官方的例子是:要求「整理一下 repo」不算授權 force push,但要求「force-push 這個分支」就算。

分類器之外還有更硬的兩層:permissions.deny 在分類器之前就擋,分類器與使用者意圖都無法覆蓋;內容限定的 permissions.ask(例如 Bash(git push *))永遠會跳出確認,分類器不能代為核准。官方也提醒,這類規則只匹配以該字串開頭的命令,git -C <dir> push 這種寫法不會被擋;要檢查完整命令文字,要用 PreToolUse hook。

設定放哪裡:專案目錄裡的 autoMode 不會被讀

分類器只從 ~/.claude/settings.json、managed settings 與 --settings 讀 autoMode,不讀專案的 .claude/settings.json 與 settings.local.json,理由是這兩個檔案在 repo 裡,被簽入的 repo 或 build 步驟可以替自己塞 allow 規則。如果你把設定寫在專案裡,它不會生效。各範圍的條目會合併;開發者可以追加但不能移除 managed 提供的條目,而且官方明說,開發者加的 allow 可以蓋過組織的 soft_deny,所以這是疊加而不是硬性政策邊界,真正不能越過的要放 managed 的 permissions.deny。

少寫的時候怎麼補救

  • claude auto-mode defaults 印出內建的四份清單;--label 可以用標籤開頭只看一條規則(需 v2.1.208 以上)。
  • claude auto-mode config 印出分類器實際使用的有效設定,改完後用它確認。
  • claude auto-mode critique 讓 AI 檢查你寫的自訂規則是否含糊、重複或容易誤判。
  • claude auto-mode reset 移除使用者設定檔裡的 autoMode(v2.1.212 以上),會先確認;managed 與 --settings 的仍然有效。
  • /auto-mode-setup 會根據專案與最近的 session 草擬 environment 條目;官方頁面寫它需要 Pro、Max 或 Team 方案、不能在雲端 session 執行;v2.1.304 的更新說明則寫它也開放給 Bedrock、Vertex、Foundry、Claude apps gateway 與關閉 telemetry 的 session。兩處說法不同,我只能說以你版本上的實際行為為準。它掃描 CLAUDE.md、README、設定與近期 session 裡 Claude 執行過的命令,不讀你的訊息;接受草稿時會替 allow、soft_deny、hard_deny 自動加上 "$defaults"。

建議的做法是:先只動 environment(官方說多數組織只需要這一項),要加規則時每個陣列第一行都放 "$defaults"。這些都是官方文件的內容;其中「建議先動 environment」是我對官方推薦流程的轉述,不是我自己的實測。

資料來源:Configure auto mode - Claude Code Docs、Claude Code changelog - Claude Code Docs
圖解
auto mode 的檢查順序與 $defaults 陷阱一次工具呼叫依序經過 permissions.deny、ask、hard_deny、soft_deny、allow;autoMode 只從使用者與 managed 設定讀取,陣列漏掉 "$defaults" 會取代內建清單Order of checks for one tool call in auto modepermissions.denyBlocks before the classifier. Nothing overrides itpermissions.ask (content-scoped)Always prompts. Classifier cannot approveautoMode.hard_denyUnconditional. Intent and allow do not applyautoMode.soft_denyBlocks, unless allow or explicit user intent clears itautoMode.allowExceptions to soft_denyWhere autoMode is read~/.claude/settings.jsonmanaged settings--settings flagNOT .claude/settings*.json in the repoThe trapAn array without "$defaults"replaces the built-in listfor that sectionVerify: claude auto-mode configDraft: /auto-mode-setupClaude Skill Me · claudeskill-me.com
歡迎截圖分享,轉載請註明來源
提問
請至少輸入 10 個字
相關文章
Bash 權限規則的盲區:deny 擋不住 /bin/rm、bash -c 與 git -C,devbox run * 還會放行內層任何命令
practice · 10/23
Claude Code 的 hook 預設是 fail-open:腳本不存在、逾時、exit 1,守門員都會放行——v2.1.295 的 onFailure: "block" 怎麼用
practice · 10/19
Hook 明明顯示「blocking error」,檔案卻還是被改了?PostToolUse 跟 PreToolUse 的「阻擋」根本不是同一件事
practice · 09/28
沙盒裡跑 Chromium 出現 No usable sandbox!:--no-sandbox、excludedCommands、allowNestedUserNamespaces 三種解法各放棄什麼
advanced · 10/23
相關新聞
更多相關主題