Code Agent 看起来都能理解任务、调用工具、修改代码,但一旦进入真实工程,差异往往不在“能不能写出一段代码”,而在任务由谁推进、关键动作由谁批准,以及完成声明能否被独立证据支持。工作流编排、人工确认和结果验证分别解决控制流、风险控制与质量证明问题。三个维度可以组合,却不能互相替代:流程跑完不代表结果正确,有人工点击同意也不代表改动已经通过测试,而测试通过同样不能证明部署动作经过授权。
工作流编排回答的是“下一步做什么”。它把一个目标拆成若干节点,并规定节点之间的依赖、条件分支、重试、超时和失败处理。例如先读取仓库约束,再生成修改,随后执行静态检查和测试;只有检查成功才允许准备提交。编排能力越强,流程状态越显式,任务中断后也越容易恢复。
人工确认回答的是“这一步是否允许执行”。它通常出现在不可逆、昂贵或影响范围较大的边界上,例如覆盖文件、删除资源、发送外部消息、合并代码和部署生产环境。确认机制的核心不是弹出一个按钮,而是暂停点是否可靠、审批人能否看到足够上下文、批准范围是否明确,以及拒绝之后流程如何收敛。
结果验证回答的是“刚才的工作是否满足约定”。验证可以是编译、测试、类型检查、格式检查、安全扫描,也可以是对输出文件、退出码、结构化字段或页面状态的断言。可靠验证必须由可重复执行的规则给出结论,而不是让同一个 Agent 在完成工作后再用自然语言评价自己。
来源页面也按类似思路比较多种工具:有的负责并行管理多个会话,有的用图或 YAML 定义流程,有的提供中断或审批节点,还有的只把验证能力交给用户自己的代码。这说明“编排工具”并不是单一产品类别。会话管理器、通用 Agent 框架、自动化平台和围绕现有编码 Agent 的流程引擎,解决的层次不同,不能只按是否支持多 Agent 来判断强弱。
最轻量的编排存在于提示词和项目说明文件中。开发者写明步骤,Agent 根据上下文自行选择工具并推进。这种方式灵活,适合探索性任务和小型仓库,但流程约束本质上仍由模型解释。同一段说明在不同上下文中可能走出不同路径,遗漏步骤时也不一定有外部系统阻止它。
更进一步是脚本式编排。流程由 Shell、Python、配置文件或 CI 作业明确表达,Agent 只负责某些节点。节点顺序、退出条件和输入输出由程序控制,因此可复现性更好。其代价是流程变化需要维护脚本,遇到未知情况时不如纯 Agent 灵活。实践中,这通常是工程成本和可靠性较平衡的一层。
图式或状态机式编排把节点、边、状态和中断都作为一等对象。它适合长任务、并行分支、失败恢复与跨系统协作。例如代码生成和文档更新可以并行,二者完成后再进入集成测试;若测试失败则回到修复节点,并限制最多重试次数。它的价值主要出现在流程确实复杂且需要审计时。若任务只有“修改、测试、提交”三步,引入完整图引擎可能增加部署、观测和状态一致性的负担。
多 Agent 会话管理解决的则是并发与隔离。每个会话可以拥有独立工作区,最后由人审查和合并。这能提高吞吐量,却不会自动提供确定性的业务流程。多个 Agent 同时工作也可能造成重复劳动、接口假设冲突和集成成本。因此,多 Agent 数量不是编排成熟度的直接指标。
人工确认至少有三种粒度。第一种是工具调用级确认,例如执行危险命令前询问一次;第二种是阶段级确认,例如方案评审通过后才开始修改;第三种是交付级确认,例如审查差异后才合并或发布。工具调用级确认最细,但频繁弹窗容易让人形成机械批准。阶段级确认更符合工程职责,却要求系统能保存和恢复流程状态。
一个有效的确认请求应包含动作、对象、影响范围和可撤销性。只显示“是否继续”几乎没有审计价值。比如数据库迁移审批应展示目标环境、迁移摘要、预计锁表风险和回滚方案;代码合并审批应展示改动范围、测试状态与未解决告警。审批人确认的是具体意图,而不是为 Agent 的所有后续行为提供无限授权。
还要区分真正的暂停与事后审查。有些工具让用户在独立工作区查看改动,满意后再合并,这属于交付边界的人工把关;另一些工具可以在流程中间持久化状态,等待指定人员批准后继续,它更适合部署、采购和权限变更。两者都叫 human-in-the-loop,但风险覆盖范围并不相同。
拒绝路径同样重要。用户拒绝后,系统应该终止、退回上一步或要求 Agent 修改方案,而不是换一种工具调用继续尝试。审批记录还应绑定流程版本和输入摘要,避免批准后输入发生变化。对于高风险操作,应采用最小权限凭证,并让批准只对单一动作、单一环境和有限时间有效。
最低层的验证是进程退出码,但退出码为零只表示命令按自身规则成功结束,不保证业务目标已实现。测试命令可能没有发现任何测试,构建脚本也可能跳过目标模块。因此还要检查测试数量、产物是否存在、结构是否符合约束,并为关键行为设置断言。
结构化验证比自然语言总结可靠。若要求生成 metadata,可以用 JSON Schema 检查字段、类型和枚举;若要求修改网页,可以检查 DOM、无障碍规则和关键交互;若要求修复接口,可以运行契约测试与回归测试。验证器应尽量由确定性程序执行,并把命令、日志、产物摘要和失败原因保存下来。
对文件做哈希能够证明“被检查的文件”和“随后交付的文件”是同一份,但哈希本身不能证明内容正确。它解决的是证据绑定问题,而测试和断言解决正确性问题。成熟流程会组合这些机制:先执行质量检查,再记录被验证产物的标识,最后只允许同一产物进入交付阶段。
验证还需要防止 Agent 自己降低标准。若 Agent 能随意删除失败测试、修改检查脚本或把严格规则改成宽松规则,那么“全部通过”没有意义。关键测试、策略文件和部署规则应由受保护的仓库分支或外部流水线持有。Agent 可以提出修改,但不能在同一授权范围内既改规则又据此宣告成功。
假设任务是修复支付回调的重复入账问题。编排器先读取问题描述和仓库约束,再让 Agent 定位幂等逻辑、提出方案并生成修改。此时流程只负责保证步骤顺序,并保存调查结果和代码差异。
修改完成后,验证节点运行单元测试、并发回调测试、数据库约束检查和静态分析。若测试失败,流程返回修复节点,但重试次数受限;超过限制则停止并交给工程师。这里的验证器输出具体失败证据,而不是简单让 Agent 回答“是否修好了”。
全部检查通过后,人工确认节点展示差异、数据迁移影响、测试摘要和回滚方式。审批通过只允许把已验证的提交部署到指定预发布环境。部署后还要执行一次冒烟测试;只有新的运行证据通过,流程才可结束。这个例子中,编排负责连接步骤,验证负责产生证据,人工确认负责承担风险决策。
plan -> edit -> test -> approval -> deploy -> smoke_test
| |
+-- fail: revise +-- fail: rollback
首先检查流程定义是否位于模型之外。如果关键步骤只写在提示词里,需要接受它可能被上下文影响;如果采用脚本、配置或状态机,则应检查版本管理、条件分支、并发控制、重试上限和恢复机制。尤其要确认任务进程退出后,状态是否仍然存在,而不是只能从聊天记录猜测进度。
其次检查人工确认是否能真正阻断动作。测试方法很直接:在沙箱中构造一个需要审批的步骤,不批准并重启执行端,观察流程是否仍保持暂停;批准后改变输入,再确认旧批准是否失效。只有在异常、重启和输入变化场景下都保持边界,确认机制才值得信任。
再次检查验证证据是否机器可读并绑定产物。应能回答具体运行了哪些检查、检查了哪个提交或文件、成功标准是什么、日志保存在哪里,以及交付后能否追溯。如果产品只展示 Agent 的完成摘要,却拿不出测试结果或产物标识,应把它视为交互体验,而不是验证能力。
最后考虑接入位置和维护成本。有的方案位于 Agent 前面,由流程调用 Agent;有的位于 Agent 后面,由 Agent 请求流程服务;还有的包裹本地会话和工作区。接入位置会决定权限模型、故障边界和替换 Agent 的难度。团队应先找出最需要控制的风险,再选择对应层次,不必为了“支持多 Agent”而引入额外系统。
个人开发和低风险仓库通常可以从项目约束文件、隔离工作区和固定测试脚本开始,在删除、发布等动作前保留工具级确认。此时重点是减少误操作,并让每次完成声明都附带实际检查结果。
多人团队更适合把确定性规则放入 CI:Agent 可以自由调查和修改,但合并必须通过受保护测试和代码评审。对于长时间任务,可再加入持久化状态与阶段审批,避免聊天会话成为唯一记录。
涉及生产系统、资金、隐私数据或合规要求时,应采用外部编排、细粒度凭证、职责分离和不可篡改审计。验证规则不能完全由执行 Agent 控制,审批也不能由提出动作的同一身份完成。这里的目标不是让 Agent 更自主,而是让每一步的授权和证据都能被追溯。
因此,Code Agent 的核心差异并非 ReAct 循环的名字,而是控制面是否清晰。优秀的系统允许模型处理开放性推理,同时把顺序、权限和验收标准放在可检查的边界上。评估产品时分别测试“能否稳定推进流程”“能否可靠停下来等人决定”“能否用独立证据证明结果”,比比较功能清单更能反映真实工程能力。