给 coding agent 划职责边界:用只读侦察和验收闸门减少返工

· 约 4 分钟阅读

让 coding agent 直接接手一个模糊的大任务,通常会得到一种很熟悉的返工:它先猜文件位置,改了几个看似合理的地方,跑到报错才回头补上下文;等测试绿了,又发现接口契约、迁移顺序或部署脚本根本没碰到。问题不一定是模型能力差,而是把“找证据、动手改、判断交付”塞进同一条上下文里。上下文越长,早期猜测越难被推翻,后面的命令输出还会把真正的约束淹掉。

更稳的做法是给任务设三个阶段,每一段只产出下一段需要的东西。侦察阶段只读,交付一页证据卡;实施阶段只接受已确认的边界;验收阶段不相信实施者的自述,只看命令和结果。Claude Code 的 Explore 子 agent 本身就是只读工具集,官方建议把搜索结果、日志和不会再次引用的文件内容放进独立上下文,再把摘要带回主会话。[1] 这不是为了“多 agent 很酷”,而是把昂贵的噪声挡在改代码之前。

第一段:侦察只回答可证伪的问题#

侦察任务别写成“研究一下认证模块”。这种提示会诱导 agent 产出百科式总结,实施的人还是要重新翻仓库。换成四个必须落到路径和符号的问题:入口在哪里;数据从哪里来、流向哪里;哪些测试覆盖了目标行为;这次改动不能碰什么。要求它附上文件路径、函数名、关键调用链和未确认项。没有证据的判断要明确写“未知”,不要替它脑补。

证据卡最好限制在 20 行以内。它应当包含改动候选文件、验证命令、风险点,以及“完成”的可观察条件。例如“提交表单后,错误响应不会写入本地缓存;现有 pnpm test auth 通过;新增一个覆盖 401 的测试”。这比“修复登录问题并保证质量”有用得多。Claude Code 对自定义 subagent 的说明也强调,描述字段决定何时委派,描述本身会占主会话上下文;该短就短,把细节放在 agent 自己的系统提示里。[1]

第二段:实施必须有改动预算#

拿到证据卡后,再启用能写文件和跑命令的执行 agent。给它一份明确预算:允许改哪些目录,最多触及多少文件,必须新增或修改哪些测试,遇到卡片之外的依赖时停止并报告。预算不是束缚创造力,而是防止 agent 把一个局部 bug 变成“顺便重构”。如果预期只改三处,结果 diff 动了二十个文件,默认结论应该是范围漂移,先审查再继续。

实施提示里还要禁止两件事:不要为了让测试通过而删除断言;不要以“现有行为不清楚”为理由悄悄改契约。它可以提出替代方案,但要把选择写进结果:改了什么、为什么改、运行了什么、没能验证什么。Codex CLI 的官方文档把检查、编辑、运行本地工具放在同一工作流里,同时建议在任务前后创建 Git checkpoint,方便回退。[3] 对高影响改动,这个 checkpoint 就是最低成本的撤销开关。

快速上手:把阶段合同写成可复制的提示#

先在仓库根目录创建一份任务卡,不需要接入新框架:

# task-card.md
目标:修复订单取消后库存未释放
边界:只允许改 apps/api/orders 和对应测试
侦察输出:入口、库存写入点、现有测试、未知项
验收:pnpm test orders;取消后库存加回;重复取消不重复加库存
停止条件:发现需要数据库迁移或跨服务协议变更,停止并说明

先跑只读侦察。无论你用哪个 agent 工具,要求都保持一致:

只读侦察 task-card.md 中的任务。不要编辑文件,不要执行写操作。
输出不超过 20 行:相关路径与符号、调用链、现有测试命令、风险和未知项。
每个结论都附文件路径;找不到证据就写“未知”。

人工花两分钟核对路径和停止条件,再把确认后的卡片交给执行 agent:

按 task-card.md 实施。仅改允许目录,保留现有断言。
先展示计划,再编辑;结束时给出 git diff --stat、实际修改文件、
测试命令及退出码。若超出边界,立刻停止,不要自行扩展范围。

最后开一个干净的验收会话,或至少换一个不参与实施的 agent。它只读 diff 和测试输出,检查任务卡里的每条验收条件是否有对应证据。Claude Code 的 hooks 可在会话、每轮和每一次工具调用时触发,PreToolUse 能在命令执行前阻止它。[2] 因此可以把“禁止危险命令”和“提交前必须跑特定测试”做成硬闸门,而不是靠提示词提醒一次就算。

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{"type": "command", "command": "./.claude/hooks/check-command.sh"}]
    }]
  }
}

这里的脚本应先只记录或拦截最明确的危险操作,例如生产环境命令、删除迁移、越过允许目录的写入。别一上来做“智能审批”:误拦太多,团队迟早会关掉它。官方示例说明命令 hook 从标准输入接收 JSON,并可返回拒绝决定来阻止调用。[2]

这套流程的关键不在于阶段数,而在于每段都有退出条件。侦察没有路径证据就不能实施;实施没有测试结果就不能验收;验收发现范围漂移就回到任务卡,而不是让 agent 在原地继续补。这样做会多一次短暂的核对,但通常少掉的是最贵的那种返工:代码已经改乱、上下文已经塞满,才发现起点错了。

Sources#

[1] https://code.claude.com/docs/en/sub-agents — Create custom subagents [2] https://code.claude.com/docs/en/hooks — Hooks reference [3] https://learn.chatgpt.com/docs/codex/cli — Codex CLI | ChatGPT Learn