Claude Code Auto Mode 配置笔记:信任槽、$defaults,以及会绕过分类器的 narrow allow
自动模式在做什么
自动模式让 Claude Code 跳过常规权限提示,把工具调用路由到分类器,由分类器拦下不可逆、破坏性或指向环境外的操作。permissions 里的拒绝(deny)和显式询问(ask)规则在分类器之前评估,照常阻止或提示。autoMode 设置块的作用是告诉分类器:哪些仓库、存储桶和域属于你们自己,让它别再拦常规内部操作。
所有提供商上的所有用户都能用:Anthropic API、AWS 上的 Claude Platform、Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry,以及已登录的 Claude 应用网关会话。
版本注意:v2.1.158 到 v2.1.206 期间,在 Bedrock、GCP Agent Platform、Microsoft Foundry 和 Claude 应用网关会话上使用自动模式需要设置 CLAUDE_CODE_ENABLE_AUTO_MODE=1;v2.1.207 移除了该要求。
默认信任面非常窄:只信任工作目录和当前代码库的已配置远程。推送到公司源代码控制组织、写入团队云存储桶这类操作会被阻止,直到你把它加进 autoMode.environment。
默认边界:能推什么,什么仍被拦
- 允许推送到你正在处理的仓库的任何分支,包括默认分支,并默认创建 PR。
- 标记为部署或发布目标的非默认分支(
production、release、gh-pages等)不受这条默认值约束。分类器会按自身条件判断对该分支的推送,包括视为生产部署。 - 推送内容仍会被检查。强制推送、提交中出现的密钥、在 CI/部署管道运行时把密钥送出仓库的更改,仍会被阻止。
v2.1.211 之前更严:分类器只允许推送到工作分支、Claude 创建的分支,以及对默认分支的例行推送。
加人工检查点:permissions.ask
最直接的机制是 permissions.ask。内容范围的 ask 规则在分类器之前评估,即使在自动模式下也始终强制权限提示:
{"permissions": {"ask": ["Bash(git push *)", "Bash(gh pr create *)"]}}
这两条匹配以 git push 或 gh pr create 开头的命令。Claude 换个写法就不匹配,也就不会被检查点,例如:
git -C push
git -c = push
需要检查完整命令文本的检查点,得加 PreToolUse hook。
三种边界机制的对照:
- 操作前提示:
permissions.ask。自动模式下匹配的内容范围规则始终提示,分类器无法自动批准。 - 永不运行:
permissions.deny。在咨询分类器之前阻止,分类器和用户意图都覆盖不了。 - 本会话一次性边界:在对话里直说,比如「在我审查之前不要推送」。分类器会阻止匹配操作,但如果 context compaction 删掉了写有该边界的消息,边界就丢了。要持久保证,用 ask 或 deny 规则。
分类器从哪里读配置
分类器读取与 Claude 本身相同的 CLAUDE.md 内容。项目 CLAUDE.md 里写「从不强制推送」这类指令,会同时引导 Claude 和分类器。
跨项目生效的规则放在 autoMode 设置块。分类器从这三个范围读 autoMode:
- 单个开发者:
~/.claude/settings.json(个人受信任基础设施) - 组织范围:托管设置(分发给所有开发者)
--settings标志或 Agent SDK 内联 JSON(自动化的每次调用覆盖)
分类器不读 .claude/settings.json 或 .claude/settings.local.json 里的 autoMode。 这两个文件在仓库目录里,已检入的仓库或构建步骤可能借此注入自己的允许规则。v2.1.207 之前分类器也读 .claude/settings.local.json,如果你之前往里写过 autoMode,把那块挪到 ~/.claude/settings.json。
各范围的条目会合并。开发者可以用个人条目扩展 environment、allow、soft_deny、hard_deny,但不能删除托管设置提供的条目。
这里有个容易误判的点:允许规则在分类器内是软阻止规则的例外,所以开发者添加的 allow 条目可以覆盖组织的 soft_deny 条目。组合是累加的,不是硬策略边界。分类器只是权限系统之后的第二道门。必须永不运行的操作,请写进托管设置的 permissions.deny。
定义受信基础设施:autoMode.environment
对大多数组织来说,environment 是唯一需要设置的字段。分类器用它决定「外部」的含义,任何未列出的目标都是潜在的数据泄露目标。
从 v2.1.198 起,claude auto-mode defaults 会打印三类环境条目(在此之前只打印前五个信任槽):
Context slots — 描述组织、技术栈和安全态势,每项默认为 None configured 或保守假设:Organization(默认「软件开发」)、云提供商、Repository visibility、Internal sharing / snippet hosting(公开粘贴和 gist 服务默认在信任边界外)、Org-specific CLIs、Secrets management、CI/CD deploy targets、Network posture、Host containment、Protected deployment namespaces / environments、Data retention / declassification。
其中 Host containment 默认是「具有开放互联网的普通开发者机器或 CI runner」。在受限容器/VM/pod 中需要命名允许主机、说明云元数据端点是否可达、以及云项目/集群/注册表与身份。在该条目命名身份之前,分类器会阻止对主机自身凭证的请求;此能力需 v2.1.257+。
Trust slots — 命名分类器视为边界内的内容:Trusted repo、Source control、Trusted internal domains、Trusted cloud buckets、Key internal services、Internal package registry。repo 和 source-control 默认为工作仓库及其配置远程,其他槽默认 None configured。
仓库可见性只用于机密材料范围:私有仓库是机密材料的可接受目标,但把仓库设为私有永远不会「清除」秘密、个人或受信数据。分类器会从工作仓库外部移植、重指向或首次读取的内容,视为不是该仓库自己的工作。这个范围界定需要 v2.1.203+。
Sensitivity slots — 命名保护规则视为高风险的内容:Sensitive data locations & audiences、Sensitive remote targets、Protected IaC scopes。每项默认为广泛启发式,例如把名称含 prod / production 的主机或命名空间视为敏感远程目标。此能力需 v2.1.195+。
v2.1.211 之前,context slots 里还有一个 Default/protected branches 条目,把 main 和 master 视为受保护;v2.1.211 移除了它。
想在默认值旁添加自己的条目,在数组里包含字面字符串 "$defaults":
{
"autoMode": {
"environment": [
"$defaults",
"Source control: github.example.com/acme-corp and all repos under it",
"Trusted cloud buckets: s3://acme-build-artifacts, gs://acme-ml-datasets",
"Trusted internal domains: *.corp.example.com, api.internal.example.com",
"Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com"
]
}
}
保存后运行 claude auto-mode config 确认有效规则包含你的条目。条目是散文,不是正则或工具模式,分类器把它们当自然语言规则读。
用 /auto-mode-setup 生成环境条目
/auto-mode-setup 让 Claude Code 从项目和最近会话草拟 autoMode.environment 条目,有时也会草拟规则条目。接受草稿即写入 ~/.claude/settings.json。
使用条件:Pro、Max 或 Team 计划,且 v2.1.228+;原生 Windows 需 v2.1.233+;无法在网页版运行;需要功能标志获取。
它读取的内容:
- 项目 CLAUDE.md、README.md、配置文件和 git 远程
- 你的
autoMode与permissions.allow设置 - Claude 近期在此项目运行命令涉及的主机、存储桶和命令名(从不读你的消息)
两个可选扫描:shell 历史中每个命令的第一个单词;主目录下的远程主机和仓库名。
接受时,environment 列表写入时不带 "$defaults";allow / soft_deny / hard_deny 列表各含 "$defaults"(除非你已经写了不带它的 allow 列表)。保存后它会提供删除 ~/.claude/settings.json 中被自动模式忽略的 permissions.allow 规则,例如 Bash(*)。
想关掉命令和提议:在对话框选「不再显示」,或往 ~/.claude/settings.json 加:
{"skillOverrides": {"auto-mode-setup": "off"}}
覆盖阻止和允许规则:hard_deny / soft_deny / allow
三个字段替换分类器的内置规则列表,每个都是散文描述数组:
autoMode.hard_deny:无条件安全边界autoMode.soft_deny:用户意图可以清除的破坏性操作autoMode.allow:软阻止规则的例外
需要在分类器之前运行的基于工具模式的硬阻止,用 permissions.deny,不是这三个字段。
分类器内优先级四层:
hard_deny无条件阻止,用户意图和 allow 例外都不适用soft_deny其次阻止,用户意图和 allow 例外可覆盖allow作为例外覆盖匹配的soft_deny- 显式用户意图覆盖剩余软阻止——前提是用户消息直接且具体地描述 Claude 即将采取的确切操作
一般请求不算显式意图。要求「清理代码库」不授权强制推送;要求「强制推送此分支」则授权。
调节方向:分类器反复标记默认例外不涵盖的常规模式,往 allow 加;环境特定的破坏性风险默认漏了,往 soft_deny 加;必须永不跨越的边界,往 hard_deny 加。要保留内置规则同时添加自己的,数组里包含字面字符串 "$defaults":
{
"autoMode": {
"environment": [
"$defaults",
"Source control: github.example.com/acme-corp and all repos under it"
],
"allow": [
"$defaults",
"Deploying to the staging namespace is allowed: staging is isolated from production and resets nightly",
"Writing to s3://acme-scratch/ is allowed: ephemeral bucket with a 7-day lifecycle policy"
],
"soft_deny": [
"$defaults",
"Never run database migrations outside the migrations CLI, even against dev databases",
"Never modify files under infra/terraform/prod/: production infrastructure changes go through the review workflow"
],
"hard_deny": [
"$defaults",
"Never send repository contents to third-party code-review APIs"
]
}
}
坑点: environment、allow、soft_deny、hard_deny 任何一个不包含 "$defaults",就会替换该部分的整个默认列表,丢弃内置规则。丢掉的包括——soft_deny:强制推送、curl | bash、生产部署、自动模式绕过;hard_deny:内置数据泄露规则。每个部分独立评估,只在你打算完全接管该列表时才省略 "$defaults"。可以先跑 claude auto-mode defaults 打印内置规则,复制后逐条审查。
从 /permissions 编辑规则
运行 /permissions 选择 Auto mode 标签页(需 v2.1.246+,且仅当 auto mode 对当前会话可用)。它会列出分类器读取的每个范围的 allow / soft_deny / hard_deny / environment 条目,并显示内置规则是否生效。来自托管设置或 --settings 的条目只读,改动保存到 ~/.claude/settings.json。
classifyAllShell:让所有 shell 命令走分类器
默认的 narrow Bash/PowerShell 允许规则(如 Bash(npm test))在自动模式下继续有效,在分类器运行前就解析掉了。Claude Code 只会暂停授予任意代码执行的广泛规则(Bash(*) 或通配符解释器)以及命名 Monitor 的规则。
这意味着 narrow 规则可能让分类器看不到的破坏性参数通过,例如规则前缀没预料到的脚本路径或标志。把 autoMode.classifyAllShell 设为 true,会暂停每一个 Bash/PowerShell 允许规则,让分类器评估每条 shell 命令,不管允许列表怎么写:
{"autoMode": {"classifyAllShell": true}}
这是用延迟换覆盖范围:原本立即批准的命令现在要等分类器决策,每个 shell 命令计一次分类器调用。该设置仅在自动模式活动时适用,需 v2.1.193+。
检查默认值和有效配置
claude auto-mode defaults— 以 JSON 打印内置environment/allow/soft_deny/hard_deny。claude auto-mode defaults --label 'Git Destructive'— 读取单条规则的完整措辞。前缀不区分大小写匹配,需 v2.1.208+。claude auto-mode config— 打印分类器实际使用的内容(应用你的设置或默认值)。claude auto-mode critique— 对你的自定义allow/soft_deny/hard_deny规则给出 AI 反馈,标记模糊、冗余或可能误报的条目。claude auto-mode reset— 放弃自定义设置返回内置默认,需 v2.1.212+。它删除用户设置文件中的autoMode部分,写入前会询问,--yes跳过确认。Reset 仅改~/.claude/settings.json,托管设置或--settings里的autoMode规则仍然适用。
审查和修复拒绝
打开 /permissions 选 Recently denied 标签页,按 r 标记重试,退出对话框时 Claude Code 会发消息告诉模型可以重试并恢复对话。
当分类器无法做出判决(分离安全检查拒绝分类器请求,或响应无法解析),Claude Code 直接拒绝该操作,且不在 Recently denied 记录。要查看分类器到底拦了什么,找到那个工具调用,比如显示为折叠摘要行(如 Ran 3 shell commands),按 Ctrl+O 打开记录查看器。想以编程方式捕获拒绝的精确输入,加 PermissionDenied hook,它把输入作为 tool_input 接收。
大多数会话里与调用一起显示的原因是固定文本 Blocked by classifier。v2.1.208+ 起分类器在内部严重度量表上评分,不写解释;某些会话运行会写出简短解释的分类器模型(v2.1.193+)。
修复思路:
- Claude 整个任务都需要访问的目标(包注册表、内部域、仓库主机)→ 加进
autoMode.environment - 以后想免审查直接运行的命令 → 加
allow规则 - 确实打算执行的一次性操作 → 在下一条消息里说明意图,让 Claude 重试
这些都能从 /permissions 的 Auto mode 标签页添加。对同一目标的重复拒绝通常意味着分类器缺上下文:加 environment 或运行 /auto-mode-setup,然后用 claude auto-mode config 确认。
另请参阅
- Permission modes:什么是自动模式、默认阻止什么、哪些会话在其中启动
- Managed settings:在整个组织部署
autoMode配置 - Permissions:分类器运行前应用的 allow/ask/deny 规则
- All settings:每个设置键,包括
autoMode