控制爆炸半径

发布于:2026-08-30 1,622 字 6 分钟阅读

很多团队讨论 AI Coding 时,第一反应仍然是:Agent 写完代码以后,谁来 Review?能不能 Merge?出了问题谁负责?

这些问题没有错,但它们继承了一个旧前提:一次代码变更昂贵而危险,所以必须在进入主分支前集中检查、谨慎放行。

PR 工作流正是在这个前提下发展起来的。人写代码慢,一次改动往往攒得比较大;Review 的人也稀缺,于是团队需要设置一道明确的关口,把代码拦下来检查。Merge 因此像一道闸门:闸门之前是草稿,之后才算进入真实世界。

Agent 改变了这笔账。它可以不断提交小改动,自动运行测试,发现失败后继续修复。Git 又保存了完整历史。只要改动足够小,问题能够及时发现,失败后也确实能够恢复,每次变更都排队等待一次庄严的人工 Review,反而可能成为系统里最慢的一环。

真正该问的已经不是“有没有 PR”,而是:这次变化的爆炸半径有多大?

信任来自有限的损失

普通的个人 Todo List 通常是失败成本较低的软件;银行核心系统则是失败成本高、责任密度高的软件。软件风险的高低不只取决于功能复杂度,更取决于它承担了多大的现实后果。

让 Agent 自主处理低失败成本的工作,不要求我们先证明 AI 永远不会犯错。我们给 Agent 自由,不是因为相信它足够聪明,而是因为错误便宜、可见、可逆。

因此,好的 Agent 基础设施不该只追求“让它做更多”,还要不断缩小每次行动的爆炸半径:

  • 使用隔离工作区,避免多个任务互相污染;
  • 保持提交足够小,随时可以定位和撤销;
  • 用 Feature Flag(功能开关)、灰度发布和自动回滚控制影响范围;
  • 先在测试环境运行,再逐步接近真实用户;
  • 让 Agent 提交证据,而不只是提交代码;
  • 把一次大变更拆成许多可以分别验证的小变化。

Sandbox(沙箱)可以把这些约束落实到任务环境:每个 Agent 都有独立环境、明确的生命周期和有限的任务边界。任务可以扔出去运行,人不必守着每个 Terminal;出了问题,也不至于拖垮整个工作现场。

Git 只能撤销代码,不能撤销世界

Git 的可逆性很容易给人一种错觉:反正有版本控制,怕什么,有问题 Revert 就好。

数据库里被删除的数据,不会因为代码回滚而自动回来。已经发出的邮件收不回,已经扣掉的钱不会自行退还,泄漏的密钥也不能重新变得秘密。一个错误的 API 返回被客户系统消费以后,对方据此采取的行动同样不会消失。

这些操作就是 Agent 面前的核弹按钮。

核弹按钮不一定长得吓人。它可能只是一个普通的 DELETE,一次数据库迁移,一个发送通知的 API,或者一次看似平常的生产部署。危险不在命令本身,而在它被执行以后,世界已经发生变化,Git 无法替你把它改回来。

Agent 治理真正需要的,既不是“所有操作都由人审批”,也不是“全部自动化,失败就回滚”。更合理的边界是:低爆炸半径的操作,尽量让 Agent 自主完成;不可逆、高爆炸半径的操作,把最终签字权留给人。

把边界写进权限,而不只是 Prompt

这条线不能只写进 Prompt。如果一个 Coding Agent 同时拥有生产数据库写权限、云账户管理员权限和对外发送消息的能力,再漂亮的系统提示词也只是礼貌提醒。

真正可靠的 Harness,也就是承载 Agent 的运行环境、工具和权限体系,应该从能力上拆开权限:Agent 可以准备迁移脚本,但不能直接执行;可以生成邮件,但不能代表公司发送;可以部署到隔离环境,但进入生产需要另一道独立验证。

人的角色也会随之变化。过去,人通过逐行 Review 控制质量。以后,人更重要的工作可能是设计变化的边界:哪些东西允许自动试错,如何发现失败,怎样恢复,什么动作一旦执行就无法撤回,以及谁有资格按下最后那个按钮。

逐行检查所有代码,容易给人一种自己仍掌控全局的安全感。真正危险的地方却往往不在某一行代码写得漂不漂亮,而在系统是否会把一次普通错误放大成无法收拾的事故。

新世界不是没有闸门。只是闸门不该继续机械地放在每一次 Merge 前面。

它应该放在爆炸半径突然扩大的地方。