在 AI Coding Agent 里,最难做的功能之一,不是写代码,也不是读代码,而是这句产品需求:
尽量别老问我,但也别乱来。
这句话几乎天然自相矛盾。
你要少问用户,就得放权; 你要防止乱来,就得收权。
很多产品最后会走向两个极端:
- 要么非常保守,几乎每一步都确认
- 要么非常激进,所谓 auto 实际上接近 “trust me”
Claude Code 的 Auto Mode 有意思的地方在于,它没有简单选边站,而是试图把这个问题改写成:
能不能让一个专门的安全分类器来做动态权限判断?
从源码看,这才是 Auto Mode 的真正核心。
第一层误解:Auto Mode 不是“默认放行”
如果你只看产品表面,很容易以为 Auto Mode 的意思是:
- 开了之后别再弹确认框
但源码里 types/permissions.ts、permissionSetup.ts、yoloClassifier.ts 一起传达出的意思完全不同:
Auto Mode 的真实语义是:
把“是否需要用户确认”这件事,交给一套分类器策略系统。
也就是说,它不是直接绕过权限,而是把权限决策换了个执行者。
这点非常关键。
因为“自动”这个词很容易让人联想到:
- 关闭安全带
- 降低摩擦
- 牺牲控制
而 Claude Code 的做法更像:
- 不再由固定规则或人类实时点按钮决定
- 改由专门的 classifier 做一次上下文感知判断
这和“无脑自动批准”是两回事。
第二个关键点:它把 Auto Mode 做成了可编程策略,而不是写死规则
utils/settings/types.ts 和 utils/settings/settings.ts 里,Auto Mode 提供了三类可配置输入:
allowsoft_denyenvironment
这三类配置特别值得琢磨。
allow
告诉分类器:哪些动作通常可以被放行。
soft_deny
告诉分类器:哪些动作应该倾向于拦住,要求用户确认。
environment
告诉分类器:当前环境有什么上下文,比如工作区特点、项目约束、团队习惯。
这套设计其实非常成熟。因为它承认了一个现实:
安全判断不是只看“动作本身”,而是动作 + 环境 + 用户意图。
这比传统 allowlist/denylist 高级太多了。
更有意思的是,源码明确把 projectSettings 排除在外,只接受 trusted settings source。注释甚至直接写了原因:
否则恶意项目可以注入 classifier allow/deny rules,带来 RCE 风险。
这说明 Claude Code 团队对一个非常容易被忽略的问题想得很清楚:
如果分类器的规则来自不可信项目本身,那整个安全系统会被反向利用。
所以它不是简单“让用户配规则”,而是先定义谁有资格配规则。
第三个关键点:不是所有动作都值得进分类器
utils/permissions/classifierDecision.ts 里维护了一份 SAFE_YOLO_ALLOWLISTED_TOOLS。
这里面包括:
- 读文件
- Grep / Glob
- LSP
- 一些 task metadata 操作
- Plan Mode 相关工具
- 一些团队协作工具
这意味着 Claude Code 并不是每次 tool use 都跑一遍 classifier。
它先做了一层前置判断:
足够安全、足够确定的动作,直接跳过分类器。
这其实非常重要。
因为如果所有动作都交给 classifier:
- 成本会炸
- 延迟会炸
- 用户会感觉系统变慢
所以 Claude Code 的 Auto Mode 实际上是一个分层决策系统:
- 明显安全的,直接放
- 有静态规则可判的,走规则
- 模糊而高风险的,交给 classifier
这才是一个能上线的“自动模式”,而不是学术 demo 里的全量推理。
第四个关键点:分类器看的不是原始聊天,而是“投影过的安全转录”
yoloClassifier.ts 里一个我非常喜欢的设计是:它不会把完整对话原样丢给分类器。
它会构造一份专门的 transcript:
- 保留 user text
- 保留 assistant 的
tool_use - 不保留 assistant 普通文本
为什么?
源码里注释给出的答案很直接:
assistant text 是模型自己写的,可能会反过来影响 classifier 的判断。
换句话说,Claude Code 团队非常清楚:
如果分类器直接读取主模型产出的自由文本,那么分类器本身也会被上游模型的措辞污染。
所以它做了一个“安全投影”:
只取和权限判断最相关、最结构化的那部分内容。
这是个非常典型的安全工程思路:
- 不是把全部上下文都喂进去
- 而是把上下文压成最小必要证据集
这一步看起来朴素,但非常关键。很多所谓“再让一个模型审一遍”的架构,恰恰死在这里:二级模型被一级模型的文本叙事带偏。
第五个关键点:CLAUDE.md 被当成“用户意图”,而不是系统真理
源码里还有一处特别妙的处理:classifier 在构造输入时,会把 CLAUDE.md 包成一个特殊 message,并明确告诉分类器:
这代表用户提供给 agent 的配置,应当视为用户意图的一部分。
这背后其实是权限系统里一个很难的问题:
本地约束文件,到底属于谁的意图?
如果把 CLAUDE.md 当成纯系统规则,它可能过强;
如果完全忽略,又会丢失用户真实期望。
Claude Code 选了一个中间位:
它把 CLAUDE.md 视为 user-provided configuration。
这个语义很重要,因为它影响 classifier 对动作的解读:
- 某个动作是不是符合用户意图
- 某条限制是不是用户主动声明的边界
这类“归属语义”的细节,恰恰最体现团队是否真的做过复杂 Agent 产品。
第六个关键点:它甚至把分类器做成两阶段
yoloClassifier.ts 里最让我印象深刻的,是 XML 版两阶段分类器。
它支持三种模式:
fastthinkingboth
默认的 both 逻辑大概是:
- 先跑一个超快阶段,快速判断是否可以直接放行
- 如果 fast 阶段判阻断,再升级到 thinking 阶段
- thinking 阶段给出更稳的阻断结论和理由
这套设计特别像现代搜索/风控系统里的 coarse-to-fine pipeline:
- 第一层便宜、粗糙、召回高
- 第二层贵一点,但只处理真正疑难样本
它解决的是一个非常现实的问题:
你不能让所有动作都走深度推理,但你又不能只靠浅层判断。
于是 Claude Code 的答案是:分阶段。
这点非常值得做 Agent 安全的团队参考。因为“安全”和“可用”经常不是二选一,很多时候只是缺一个多级流水线。
第七个关键点:两阶段之间还做了 prompt cache 设计
更妙的是,这两阶段不是简单串起来,而是专门为了缓存去布置前缀。
源码注释提到:
- stage 1 和 stage 2 共享同一个 system prompt 和 transcript prefix
cache_control被放在 action block 上- 这样 stage 2 可以命中 stage 1 的完整前缀缓存
这件事看起来很底层,但价值很大。
因为两阶段 classifier 最大的问题就是“更准,但更贵”。
Claude Code 的处理方式不是放弃两阶段,而是尽可能让第二阶段吃到第一阶段写下的缓存。
这说明他们在做的不是一个“逻辑正确”的 Auto Mode,而是一个成本上可持续的 Auto Mode。
第八个关键点:失败时不是一律瞎放,而是做安全降级
YoloClassifierResult 里有很多字段都在说明一件事:这个团队默认相信分类器会出故障。
比如:
unavailabletranscriptTooLongerrorDumpPathstage1Usagestage2Usage
而在异常路径里,它也不是简单“classifier 挂了那就算了”,而是区分不同情况:
- transcript 过长
- stage 1 成功但 stage 2 失败
- 完全不可用
然后选择:
- 阻断
- 要求用户确认
- 给出 warning
这里我最欣赏的一点是:它不神化 classifier。
很多 AI 产品一旦引入“第二个模型做审核”,就会下意识把它当真理。
Claude Code 不是。它把 classifier 也当成一个会超时、会溢出、会失败、会不可靠的服务来设计。
这才是工程,不是信仰。
第九个关键点:Auto Mode 连 sub-agent handoff 也会审
在 tools/AgentTool/agentToolUtils.ts 里,Auto Mode 甚至会在子 Agent 完成后,对 handoff 做一次 classifier 审查。
这非常值得注意。
因为如果你只审工具调用,不审子 Agent 回传结果,就会留下一个很大的漏洞:
- 子 Agent 可能做了危险动作
- 主 Agent 把它的输出当“可信中间结果”继续推进
Claude Code 看到这个问题了,所以它把 handoff 也纳入 Auto Mode 的审查链。
这说明它在设计上已经不再是:
- 只保护单 Agent 单步动作
而是在向:
- 保护整个 agent graph 的状态传递
靠近。
我最认同的设计思想
如果让我总结 Claude Code Auto Mode 最值得学的地方,不是“用 LLM 审 LLM”,而是它把 Auto Mode 做成了一个完整的安全产品层:
第一,规则是可编排的。 允许用户和系统一起定义 allow / soft_deny / environment。
第二,输入是投影过的。 不是全量聊天记录,而是权限判断最需要的结构化上下文。
第三,执行是分层的。 allowlist、静态规则、fast classifier、thinking classifier 各干各的。
第四,失败是可降级的。 不是“AI 说了算”,而是出错时有明确 fallback。
很多团队谈 Auto Mode,实际上讨论的是“弹窗优化”。
Claude Code 讨论的却是:
如何把“少打扰用户”和“保持安全边界”变成一个可持续运行的决策系统。
这就是层级差距。
最后
所以我会把 Claude Code 的 Auto Mode 定义为:
它不是一个自动放行开关,而是一套由分类器驱动、由可信配置塑形、由缓存和降级策略托底的权限编排系统。
如果你在做自己的 Agent 产品,这里面最值得借鉴的一点也许不是具体 Prompt,而是这套思路:
不要问“要不要 Auto Mode”,而要问:
你的自动,到底由谁决策、看什么证据、失败时怎么退回。
想清楚这三个问题,Auto Mode 才可能真正可用。
评论