第 6 章 委派、验证与持久状态:谁来防止系统自己给自己打高分
6.1 多代理的真正问题是责任
一听多代理就想到效率提升,像听公司扩编——其实真正棘手的从来是多出来的责任怎么切。若同一系统既执行又总结又验证,还顺手给自己写评语,结论多半令人宽慰但不可靠:"干得不错"。Claude Code 清醒地把 explore、execute、synthesis、verification 拆开,verify 是独立纪律而非礼貌动作——系统不愿让"完成"由执行代理自己宣布。Codex 也走这条路:tools/src/lib.rs 里 create_spawn_agent_tool_v*、create_wait_agent_tool_v*、create_send_message_tool、create_close_agent_tool_v* 说明委派是正式工具能力,不是黑魔法。
6.2 Claude Code:多代理服务于运行时职责分区
Claude Code 的多代理围绕主循环和任务推进展开——主代理不该什么都自己干,尤其不该既干活又验收。因此多代理主要用于:探索外包、执行分流、synthesis 汇总、verification 独立复核。这很符合它的强项在运行时编排——多代理被纳入"当前这轮怎么推进"的治理框架,而不是先有 agent platform 再往里塞任务。
6.3 Codex:多代理服务于显式工具化协作
Codex 把委派定义成工具接口,多代理更像正式子系统。两个直接影响:委派动作更易被记录、审计和组合(显式工具调用,不是 runtime 魔法);协作更易与线程、状态和审批体系对齐(thread/rollout/policy 本就一等公民)。agent_tool.rs 里 spawn_agent、send_input、wait_agent、close_agent 各有 schema:send_input 区分 interrupt=true 立即打断和默认排队;wait_agent 有 default/min/max timeout;close_agent 连 open descendants 一起关闭——抢占、等待、收尾都是协议字段。适合做成平台能力,不见得更灵巧但更易长期维护。
6.4 持久状态让验证不只是礼仪
验证流于形式的一个主因是系统没有足够好的状态承接——上一步干了什么、为什么、哪些工具动过、哪些文件变过,若只在执行代理脑子里,验证就容易沦为貌似认真实则缺材料的表演。Claude Code 让会话状态、工具结果和恢复分支在 runtime 里连续可见,配合独立验证纪律降低自我美化。Codex 通过 thread、rollout、message history、state DB bridge 给验证提供更清楚的材料基础。二者并不冲突——前者补执行者过于沉浸现场的问题,后者补系统协作必须留下结构化证据的问题。
6.5 对恢复与收尾的不同态度
Claude Code 很在乎 task cleanup、父子 abort 传播、subagent lifecycle hook——在它的世界里,多代理首先是运行时现场的一部分,出问题必须能及时收口。Codex 则把代理生命周期纳入显式状态管理和调用协议:不只关心"子代理死没死",还关心"委派行为作为系统事件该如何留存"。前者像现场总工,担心人散场后地上还留坑;后者像带项目管理系统的组织者,担心每个协作动作是否进入记录体系。
骨架:Codex 代理委派协议 (skeleton)
// 骨架: agent_tool.rs spawn/wait/send/close
handle = spawn_agent { role, prompt, timeout, inherit_approval }
for msg in updates:
send_input(handle, msg, interrupt ∈ {true, false}) // true=立即打断, false=排队
result = wait_agent(handle, timeout ∈ [min, default, max])
close_agent(handle, cascade=true) // 连同 open descendants 一并关闭
孤儿与超时故障矩阵
| 事件顺序 | 前置状态 | 触发 | 下一步 | 阈值 |
|---|---|---|---|---|
| 父代理 abort | 子代理在飞 | parent.abort | cascade abort 传到 handle;写 rollout 事件 | — |
wait_agent 超时 |
子代理未返回 | timeout ≥ max | 关闭 handle,返回 timeout 结果 | wait_agent.max |
send_input(interrupt=true) |
子代理排队中 | 抢占 | 丢弃队列,注入新输入 | — |
close_agent |
有 open descendants | 显式关闭 | 级联关闭所有后代 | cascade=true |
| 子代理崩溃 | — | 异常退出 | 返回 error,保留 thread 记录 | — |
| handle 泄漏 | 任务结束未 close | finalize | 强制 close + evict | 不允许悬挂句柄 |
6.6 本章结论
这一章的结论不难写:
Claude Code 的多代理设计更强调运行时职责分离与现场收尾,Codex 的多代理设计更强调工具化委派、状态承接与可审计协作。
二者都试图避免系统自己给自己打高分。
只是 Claude Code 更靠角色分离和验证纪律。
Codex 更靠显式接口、线程状态和协作记录。
最后一章,我们把前面六章压成总判断,回答书名里的问题:究竟是殊途同归,还是根本不同种。