从0打造编码Agent 阅读 + 实验 ≈ 25 分钟 页内实验 ×1
A3 权限与审批:它要执行 rm -rf 怎么办? 第 3 课

每个调用都问人,人会怎样?

审批疲劳
规则覆盖不到的调用,默认都停下来问人。把我们自己的真实运行轨迹放进十几种权限模式里重算:Manual 模式下将近一半的调用要弹窗,而 Anthropic 自报用户会批准约 93% 的弹窗。出路是分层放行:只读直放、项目内编辑免审、剩下的交给沙箱或另一个模型。
❓

本课一问:规则覆盖不到的调用,各家的兜底都是「停下来问人」。如果每个没把握的调用都问,人会怎样?

这一课先不碰:让另一个模型来审批时它该有多大权限(第 4 课)、沙箱怎么把弹窗变少(A4)。

从已有出发

上一课:规则替人做掉了一部分决定。剩下的调用——没有任何规则命中——落到兜底。Claude Code 的 Manual 模式、CoreCoder 的交互模式、lcc s03 的第三道闸,兜底都是「问人」。

从已有出发 · 累计数据流 点已学环节看它回答什么
每一轮循环都经过

还是贯穿任务。修 test_parse_date 这类任务,一次运行里模型要读文件、改文件、跑测试。读文件是只读的,各家都不问;改文件和跑测试会改变状态,默认都要问。下面把我们 26 次真实运行(Qwen/Qwen3-8B-MLX-4bit,本机录制)的每一次工具调用,放进不同的权限模式里重算。

先自己设计:规则没覆盖的,一律问人

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案规则没覆盖的调用,一律弹窗问人
真实运行里的每次工具调用:在不同模式下弹几次窗

组件加载中……(需要 JavaScript;所有裁决都在你的浏览器里由移植的原算法现算)

🎯

试三件事:① 默认是 Claude Code Manual:读出「弹窗问人」的次数和百分比;② 依次点 acceptEdits、auto:弹窗从 74 次降到 37 次,再降到 0——auto 下跑测试的 37 次变成紫色「送分类器」,本页不模拟分类器怎么判;③ 勾选「每次都选以后别问」,再看 Manual:第一次批准之后同类调用不再问,弹窗变少了,但被跳过审查的调用也变多了。

组件里还放了另外几家的兜底,可以逐个对照:OpenCode 开箱即用的内置默认规则第一条就是 *: allow,所以几乎不问;CoreCoder 用 -p 一次性运行时没人可问,改变状态的调用直接拒绝;Pi 核心根本没有权限层。点任意一格,能看到这次调用在录制时 miniagent 的真实裁决。

改进:按风险分层,而不是一律问

模式:Claude Code 的六档

Claude Code 用 permission mode 设定「什么不用问」的基线,规则叠在上面(deny 规则在任何模式下都生效) :

模式不问就执行的适合
default(界面上叫 Manual)只有读取每一步都自己审
acceptEdits读取、工作目录内的编辑、mkdir / touch / mv / cp 等文件系统命令编辑后用 git diff 事后审
plan读取;auto 可用时还有分类器批准的命令先探索、再动手
auto全部,但有后台的分类器检查长任务、减少弹窗
dontAsk读取与预先批准的工具;本该弹窗的一律拒绝CI 与脚本
bypassPermissions全部只在隔离的容器或虚拟机里

一个值得记下的变化:v2.1.283 起,交互式终端与 VS Code 会话的内置起始模式是 auto;claude -p 与 Agent SDK 仍是 default。产品默认从「人审」迁到了「分类器审」 。

模型审批:auto 的三层与两段式分类器

auto 模式把一次调用按三层处理:明确命中规则的立即定案;只读动作和工作目录内的编辑直接放行(写受保护路径除外);其余一切交给一个分类器模型在执行前判断。上面组件里被标成紫色的,就是走到第三层的调用。

分类器本身又分两段。官方公开了每一段的误差,逐项点开:

auto 分类器的两段(Anthropic《Claude Code auto mode》,2026-03-25,官方自报)
→ ⇒
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
n 与百分比均为原文自报,各段的测试集不同(真实流量、真实越权动作、合成的数据外传各一套),不能相互换算成条数。
⚠

常见误解:「弹窗越多越安全。」

弹窗只有在被认真看的时候才是安全措施。批准率约 93% 意味着大部分弹窗被直接点了「是」;而每一次打断还会让人更快地点「是」。把低风险的调用从弹窗里拿掉,剩下的弹窗才有人看。官方对 auto 的定位也很克制:它减少弹窗,但「does not guarantee safety」。

其他几家怎么分层

权限设计的演进:每一代都被上一代的某个真数字逼出来
  1. Pi 核心、bypassPermissions、CoreCoder --yes
    解决了零打断,模型想跑什么马上跑。
    卡在L1 的 6 条本意危险的构造命令(含 rm -rf /)会全部直接执行。
  2. lcc s01 / s03、CoreCoder bash 正则、Pi permission-gate
    解决了把已知危险的写法挡在执行之前,代码只有几行。
    卡在lcc s03 三道闸(pin 源码实跑):6 条危险命令里漏拦 4 条,5 条日常命令里误拦 2 条(cat sudoku_solver.py 因含子串 sudo 被拒)。
  3. 第一代 每次都问人 你在这里
    CoreCoder 交互模式、Claude Code Manual、lcc s03 的第三道闸
    解决了判断交给人,规则写不全也不怕。
    卡在我们 26 次真实运行的 139 次工具调用,在 CoreCoder 交互模式下有 74 次要停下来问(53%);Anthropic 自报用户批准了约 93% 的弹窗——问多了,人就不看了。
  4. Claude Code(deny → ask → allow)、OpenCode(last-match)、Codex(最严格者胜)
    解决了把常见的放行和拒绝写成规则,只有规则没覆盖的才问人。
    卡在同一份规则换一种求值语义可能换一个答案:同一份 rules-standard.json 改用 first-match,真实运行 pd-firstmatch-s1 里模型的 python -m unittest -v test_dateparse.py 被规则 #8 拒掉。
  5. Claude Code auto、Codex Auto-review(代码名 Guardian)、Hermes smart
    解决了只读直放、项目内编辑免审,其余交给另一个模型判断;弹窗接近清零。
    卡在Anthropic 自报:auto 分类器在真实越权动作上仍有 17% 漏判(n = 52),官方原话「does not guarantee safety」。
  6. 下一章 与 OS 沙箱分层
    Claude Code sandbox、Codex Seatbelt / bubblewrap
    解决了规则管「允许调用什么」,沙箱管「调用之后能碰到什么」。
    卡在L1 的 python3 -c "import shutil; shutil.rmtree(…)" 在四个黑名单里被 4 个全部放行;规则看不见脚本在运行时做什么 → A4。

数字口径:黑名单与「每次都问」由原实现在 pin 源码上实跑(a03-permission-fixtures.json,2026-09-26);真实运行 = 本课程项目 miniagent 用 Qwen/Qwen3-8B-MLX-4bit 本机录制;93% 与 17% 为 Anthropic 官方自报。

证据三问

问本课的回答
① 它解决什么问题?让人工审批只花在真正需要判断的调用上
② 为什么「一律问」会失效?人的注意力有限:问得越多,每次看得越少。这是机制推断,93% 是它的观测证据
③ 实践上选了什么?按风险分层:只读直放、项目内编辑免审,其余交给沙箱或模型审批;产品默认已转向 auto

一句话

📌

问得太多,人就不再看了;把只读和低风险的放行,只把真正需要判断的调用留给判断者。

🚦

先停在这里:记住 93% 和「分层放行」。
再深一层:走岔路:Pi 为什么说权限弹窗是「安全剧场」,看一个干脆不做弹窗的 harness 怎么论证。

下一个缺口

让另一个模型来审批,审批者该有多大权限? → 第 4 课:让另一个模型来审批,审批者该有多大权限?

auto 模式把「问人」换成了「问模型」。模型审批者也会被读到的内容影响、也会出错(17%)。它该看到什么、能做什么、出错时默认怎样,是下一课的问题。

你可能会问