多 Agent 协同
统一 seam 下的进程内、Fork、ACP、Codex、Claude Code 与 SDK 后端
结论:这不是“群体智能调度器”,而是一组可组合的委派生命周期
DeepSeek Harness 的多 Agent 能力由四件事拼成:命名 SubagentProvider seam、一次性 SubagentRun、可冷恢复的 continuable child Session 及其进程内 Activation epoch,以及模型可见的委派/控制工具。这套 subagent subsystem 没有一个统一的 swarm、共享黑板、投票器或任务 DAG;协作来自父子 Session、inbox、持久 descriptor 和可选 provider 的组合。
这个结论很重要:看到 subagent 并不能推出子 Agent 是否继承历史、是否能继续对话、是否由 Job 管理,甚至不能推出它运行在同一进程。Provider 只承诺它明确声明的能力;不支持的 outputSchema、深度限制、工具过滤和 persona 会在启动前失败,而不是被静默忽略。MULTIAGENT-SEAM
Base bundle 注册 service、spawn/fork backend、控制与列表工具,并把 spawn 绑定为 continuable、fork 绑定为 one-shot;Web bundle 保留全局 registry/backend,却把模型可见工具移到每 Session preset。这里的“多 Agent”既是 runtime 能力,也是 composition 选择。MULTIAGENT-BASE-COMPOSITIONMULTIAGENT-WEB-PLANE
1. 真实拓扑:Provider 建子节点,Manager 管可继续会话
模型工具(名称可配置)
subagent / subagent_fork
│
├─ foreground ─────────→ SubagentRuntime.start(provider)
│ └→ provider.start() → SubagentRun
├─ one-shot background → Jobs → provider.start() → SubagentRun
└─ continuable bg ─────→ ContinuationManager
├→ provider.prepareContinuable()(仅 seed 数据)
├→ Agent create / resume + inbox
└→ durable Session + Activation epoch
全局控制:send_message / interrupt_agent / list_agents
子级返回:report(仅 continuable in-process child)
SubagentProvider.start() 拥有一次性 child 的发布前创建;返回 run 后,持有者负责等待结果并 dispose。对 continuable child,provider 只贡献“是否 seed 父历史”这份 detached data;身份、组合、Agent handle、消息、冷恢复、所有权和销毁全部由 continuation manager 接管。MULTIAGENT-SEAM
2. 一个工具定义,实际分成三条执行路线
| 路线 | 触发 | 返回提交点 | 后续控制 |
|---|---|---|---|
| Foreground one-shot | run_in_background:false | child 结束且 run 已 dispose 后返回 output | 没有可继续 ID |
| Background one-shot | backgroundMode:one-shot 且显式 true | Job 注册后返回 jobId | job_output/job_kill |
| Background continuable | backgroundMode:continuable 且省略或传 true | 初始消息被 child inbox 接受即返回 subagentId | send_message/interrupt_agent |
backgroundMode 既选后台机制,也决定省略参数时的默认值;即使 provider 支持 continuation,显式前台仍走 start() 的 one-shot 合同。Continuable 启动返回时,模型请求甚至还不必开始,初始 prompt 也可能尚未被 claim 成 user/message event;acceptance 本身已记录为 Inbox splice。MULTIAGENT-TOOL-ROUTESMULTIAGENT-CONTINUABLE-STARTMULTIAGENT-CONTINUATION-ACCEPTANCE-TESTMULTIAGENT-INBOX-SPLICE
因此“后台 Agent”不是一种状态:one-shot 后台是普通 Job,continuable 后台是有 durable Session ID 的对话。把两者都画成 running/done 会丢掉最重要的控制差异。
3. Provider 矩阵:同一个 seam,六种不同隔离边界
| Provider | 进程/上下文 | 父对话 | Continuable | Start capabilities |
|---|---|---|---|---|
spawn | 同进程,独立 Agent/Session | 无 | 是 | schema、depth、filter、persona 全部支持 |
fork | 同进程,独立 Agent/Session | 已完成 Turn 前缀 | 实现了 | 四项全部支持 |
acp | 外部 ACP 进程 | 无 | 否 | 无 |
codex | 每次新 app-server 进程 | 无 | 否 | 无 |
claude-code | 官方 SDK/CLI 子进程 | 无 | 否 | 无 |
dsh-sdk | 完整独立 runtime 进程 | 无 | 否 | 无 |
Spawn/fork 是真正进入本地父子图的 backend;外部 provider 不继承父对话,唯一可能来自父级的上下文是 workspace cwd(ACP/SDK 也可改用配置的 cwd),并通过 one-shot result seam 返回。ACP、Codex、Claude Code 与 SDK package 是可选能力,不等于默认产品面:Standard/Code preset 中 Codex 与 Claude Code 的工具行明确 disabled。MULTIAGENT-SPAWN-PROVIDERMULTIAGENT-FORK-PROVIDERMULTIAGENT-ACP-PROVIDERMULTIAGENT-SDK-PROVIDERMULTIAGENT-CODEX-PROVIDERMULTIAGENT-CLAUDE-PROVIDERMULTIAGENT-STANDARD-PRESETMULTIAGENT-CODE-PRESET
4. Spawn 与 Fork 的差异只在会话 seed,不在 child 是否“独立”
Spawn
不传 seed;child 从空对话开始,委派 prompt 必须自包含。
Fork
复制父 Session 从 seq 0 到最后一个 turn/end 的平衡前缀。
排除当前 Turn
正在调用委派工具的 Turn 尚未闭合,不能作为合法 child seed。
后续独立
两者都拥有新的 Session ID、自己的 inbox、Turn 和输出后缀。
Fork 的“继承上下文”仅指已完成对话历史;它不意味着共享当前 reasoning、live inbox 或同一个 Session。测试在父级第二个 Turn 悬挂时 fork,验证 child seed 只包含首个已完成 Turn。MULTIAGENT-SPAWN-PROVIDERMULTIAGENT-FORK-PROVIDERMULTIAGENT-FORK-OPEN-TURN-TEST
两种 in-process child 都会加入父级正在运行的同一 preset generation——同一批 plugin instance、工具注册和 prompt section,而不是按 preset 名重新读取可能已变化的配置。MULTIAGENT-PRESET-INHERITANCE
5. 继承矩阵:路线、工作区和能力是不同维度
| 项目 | 规则 | 是否耐久 |
|---|---|---|
| Provider / model / maxTokens | 默认取父级,child request 可覆盖 | provider/model 写入 continuable descriptor;maxTokens 不写 |
| Workspace / lineage | 继承 cwd,记录 direct parent、origin、depth,以及存在时的非零 seedLength | 写入 Session header |
| Prompt / tools | 加入父级 exact live preset,再叠 child persona/filter | preset ID 与 descriptor 支撑恢复 |
| Conversation | 只有 fork 复制 completed-turn prefix | seed 成为 child 自己的 log 前缀 |
| Sandbox / approval | Sandbox policy 已组合时只复制显式 Session override;approval 已组合时钉为 never | 只有已定义的 override 才成为 delegation-source event |
不会继承的内容同样重要:spawn 不看父 transcript;fork 不看 open Turn;一次性授权不会下放;部署 sandbox 默认值不会被快照;child 的 persona 和工具过滤只在自身 scope 中生效,不污染父级或 sibling。MULTIAGENT-CHILD-INHERITANCEMULTIAGENT-CHILD-COMPOSITIONMULTIAGENT-DELEGATED-POLICY
这里的继承不是对象浅拷贝,而是有意拆开的四条通道:Session seed、Agent options、preset scope 和 durable policy events。这比一个含糊的 inheritContext=true 更可审计。
6. 递归预算和权限边界都沿父子 lineage 单调收紧
Tool loader 的默认 maxDepth 是 3;provider-managed 用于无法由父 runtime 强制的外部 provider。底层 depth 读取持久 header 与 runtime option 的较大值,再加一生成 child,因此恢复后的 child 不能伪装回 depth 0。Direct apply 若省略 cap 则可无上限,这说明“默认 3”属于工具配置,不是 service 的全局定律。MULTIAGENT-TOOL-CONFIGMULTIAGENT-DEPTH
send_message 只允许 exact live direct parent;interrupt_agent 可以由 exact live ancestor 作用于更深 descendant。身份比较的是活 Agent 对象与持久 parent lineage,不是调用者提交一个可猜的 Session 字符串。MULTIAGENT-CONTROL-TOOLSMULTIAGENT-COLD-RESUMEMULTIAGENT-INTERRUPT
这不是 role-based team:没有 leader/member 角色表,也没有 sibling 直发通道。现有 authority 是树形且窄化的;想做 team、共享队列或任意 Agent 路由,需要新增显式协议,而不是把现有 parentSession 当成万能 ACL。
7. One-shot 的核心合同:发布前 provider 所有,发布后 run holder 所有
validate provider + capabilities + schema + descriptor
→ provider.start()
→ unpublished setup / rollback on failure
→ publish child or external run
→ emit subagent/start
→ await run.result ──────────→ emit subagent/end
→ map stopReason / preserve partial output
→ holder runs dispose() to quiescence
Provider 启动 reject 时没有 run、也没有 lifecycle edge;一旦返回,Turn/transport failure 进入 result。In-process driver 发布 child 后只提交一个 user prompt并等待 idle,AbortSignal 会 cancel child;dispose() 是幂等资源释放边界。MULTIAGENT-RUNTIME-DISPATCHMULTIAGENT-ONE-SHOT-DRIVER
结果从 seed/activation boundary 后的 child-owned suffix 读取。completed、aborted、error、max-tokens、refusal 不会被压成一个布尔值;取消或截断仍可携带 partial output。One-shot 的 subagent/end 跟随 result settlement,可能早于 holder 完成 dispose;continuable epoch 的 end 则等待 teardown outcome。后台 Job 只有 completed 才把 final text 当成功输出,其他 reason 映射为 killed/failed,并且总在 settle 后 dispose。MULTIAGENT-ONE-SHOT-RESULTMULTIAGENT-LIFECYCLEMULTIAGENT-RUN-SETTLEMENT
8. “最终答案”与“结构化结果”是两套独立提交协议
普通输出的统一选择规则是最后一条非空 assistant message;若没有,则使用累计 text delta;都没有才为空。选择与 stop reason 独立,因此 error/max-tokens 也可能携带诊断价值很高的 partial answer。MULTIAGENT-ASSISTANT-OUTPUT
只有支持该 capability 的 in-process provider 才会在 child scope 安装真实 schema 的 structured_output 工具、专属 prompt 和单调 guard。模型调用工具只是 staged;必须等 authoritative tools/result 成功,Code Mode 下还要等外层调用成功,才提交 capture。Child 声称 completed 却没有有效 capture 时,run 被改判为 error。MULTIAGENT-STRUCTURED-OUTPUTMULTIAGENT-ONE-SHOT-RESULT
这解释了 external provider 为什么声明零 capabilities:工作目录相同不代表父 runtime 能强制其工具 catalog、persona、递归预算或结构化提交点。
9. Continuable 的 durable Session 与 process-local Activation 必须分开看
| 状态 | 依据 | 含义 |
|---|---|---|
running | Agent 正运行,或有已接受但尚未离开 inbox 的 waking message | 当前 epoch 不能 settle |
waiting | Agent idle,但仍拥有未 dispose 的 child Activation | 父级被子树所有权钉住 |
settled | Agent idle 且 owned children 为空 | dispose live handle;durable Session 仍可再恢复 |
Activation 是一个驻留 epoch,不是 durable Task。它持有 exact handle、弱引用 ancestry、owned-child set、accepted message IDs 和一次性 disposal transaction;稳定的是 child Session ID,每次冷恢复会获得新的 lifecycle runId。MULTIAGENT-ACTIVATION-MODELMULTIAGENT-ACTIVATION-OWNERSHIPMULTIAGENT-LIFECYCLE
10. Follow-up 的权威提交点是 inbox acceptance;冷恢复不再调用 provider
send_message(childId)
├─ resident + running → 排入同一 Agent inbox,等当前 Turn 结束
├─ resident + waiting → 唤醒同一 Agent
└─ no Activation → inspect durable Session
→ 校验 exact direct parent
→ fold own descriptor suffix
→ ctx.agents.resume()
→ 排入 inbox
每个 child 的 delivery、release 和 disposal 先经过同一把 ChildLock;Agent inbox 是唯一 FIFO。调用方 AbortSignal 只拥有 acceptance 之前的阶段,消息被接受后不能通过这次 send_message 取消。MULTIAGENT-FOLLOWUP
Cold resume 从持久 Session header 和 child 自己 suffix 中的 descriptor 重建 provider/model、persona 与 tool filter,然后直接走 agents.resume();它不 dispatch 原 provider。因此 provider 卸载会阻止新 start,却不必阻止已有 continuable child 恢复。Descriptor 不保存 maxTokens 或 outputSchema,恢复时不能假定这两个 activation-local 约束仍然存在。MULTIAGENT-COLD-RESUMEMULTIAGENT-DESCRIPTOR
11. 返回通道有四种,完成与报告绝不能混为一谈
| 通道 | 谁发送 | 会不会结束 child | Parent 得到什么 |
|---|---|---|---|
| Foreground result | run holder | 是,一次性 | 直接 tool result |
| Background Job outcome | Job runtime | 是,一次性 | Job 状态/通知 |
report | Continuable child 主动选择 | 否 | direct parent inbox 的 relay |
| Settlement notice | Continuation manager | 在 teardown 后发送 | stop reason + 可用 closing message |
send_message 只返回被接受的 messageId,不是 child 的回答。Child-scoped report 只能发给 direct parent,可按 wakeup 或 quiet 调度,且报告不会结束 Turn/Activation。MULTIAGENT-CONTROL-TOOLSMULTIAGENT-REPORT-TOOLMULTIAGENT-REPORT-DELIVERY
只要 caller 曾收到 child ID,Activation settlement 就独立于 report 尝试投递 runtime notice;即使 max-tokens、失败、取消或 child 忘记报告,parent 仍有机会看到结果。Parent 已不 live 时通知被丢弃而不阻塞 teardown,child Session 是剩余的 durable record。MULTIAGENT-SETTLEMENT-NOTICE
12. list_agents 是发现面,不是任务结果面
底层 listing 从 live Session store 与可选 persistence 合并 corpus,按 durable header 的 origin:subagent 找 direct children/descendants,再通过 projection 分类 mode/label。冷读并发固定为 4;单个 child 损坏或暂时读不到会成为 corrupt/unavailable diagnostic,而不是让整次 listing 失败。它不读取 Activation manager 或 provider 状态。MULTIAGENT-LIST-SERVICEMULTIAGENT-LIST-CONCURRENCY
| 模型状态 | 真实含义 | 不是 |
|---|---|---|
running | Live Agent 正在驱动 | 某个 Job 的 running |
idle | Live Agent 在 Turn 间;可能正等 descendant | 已完成、可收集结果 |
ready | 只有存储记录,可被 direct parent 恢复 | terminal success |
模型工具过滤掉 one-shot child,因为它们不能被 send_message;descendants 仍会穿过这些节点做稳定 pre-order 遍历。Depth 1 才能 follow-up,更深节点只可作为 ancestor interrupt 候选。MULTIAGENT-LIST-TOOL
13. 并发策略是“跨 child 可重叠、单 child 线性化”,不是全局调度
Provider contract 明确允许不同 child 的 starts 重叠;委派工具声明 concurrency-safe,并在 continuable prompt 中鼓励把独立委派放进同一 assistant message。One-shot background 还会进入 Job registry 的 owner capacity 规则。MULTIAGENT-SEAMMULTIAGENT-TOOL-CONCURRENCYMULTIAGENT-JOB-CAPACITY
同一 durable child 的 follow-up、释放和销毁由 ChildLock 排队;accepted-ID set 覆盖“消息已同步插入、Agent status 尚未切到 running”的微任务窗口,避免 settlement 提前赢过已经接受的工作。父级 owned-child set 又把整个 descendant 生命周期纳入 parent settle 条件。MULTIAGENT-CHILD-LOCKMULTIAGENT-FOLLOWUPMULTIAGENT-ACTIVATION-OWNERSHIP
Subagent 层没有全局 worker pool、公平队列、优先级、配额分配或结果归并器。它提供正确的并发边界;“派几个、何时派、如何合并”仍由模型 prompt、Job 层或更高阶 workflow 负责。
14. Interrupt 只停当前 Turn;Drain 才销毁整棵 Activation 子树
| 操作 | 立即动作 | 保留内容 | 完成等待 |
|---|---|---|---|
| Foreground AbortSignal | cancel one-shot child/run | 已产生 partial output | holder 最终 dispose |
| Job kill | abort task-owned controller | Job identity 到 settlement | Job producer settle + dispose |
interrupt_agent | cancel(..., keepInbox:true) | Activation、未 claim 消息、descendants | 不等待,fire-and-return |
| Manager/scoped drain | 同步关闭 admission,自顶向下 cancel | 只保留 durable Session | 自底向上 release,汇总失败 |
Interrupt 对 absent/已完成/one-shot ID 是 accepted no-op;它不是 subtree kill。外部 one-shot provider 在本地取消赢得竞态时把结果归一化为 aborted,并由幂等 handle teardown 等到子进程树退出。MULTIAGENT-INTERRUPTMULTIAGENT-OUTPROCESS-SETTLEMENT
Drain 先封 admission,等已接纳 materialization 发布或回滚,再对所有 root 并行;每棵树先 top-down 传播 cancel、后 child-first 释放 handle。单支失败不会跳过 sibling,最终以 aggregate error 报告。最终 Session flush 是 best effort;失败会警告“恢复可能缺失或陈旧”,但不能永久钉住 ancestor。MULTIAGENT-DRAINMULTIAGENT-ACTIVATION-DISPOSAL
15. 耐久性来自 Session descriptor,不来自驻留 Agent 或 Task queue
Session header
parentSession / origin=subagent / delegationDepth / seedLength / agentPreset
subagent/descriptor v2(model-hidden, log-only)
one-shot: mode / provider / optional label
continuable: mode / provider / label / agentProvider / agentModel / persona / toolFilter
intentionally omitted: outputSchema / maxTokens / subagentDepth
Continuable creation 把 fork prefix(若有)之后追加一个 between-turn descriptor seed,再接受初始 prompt。Descriptor 先做 lossless JSON snapshot;当前版 parser 拒绝未知字段,版本不支持则不可恢复。MULTIAGENT-DESCRIPTORMULTIAGENT-DESCRIPTOR-SEEDMULTIAGENT-DESCRIPTOR-FOLD
Fork seed 可能含祖先的 descriptor。Cold resume 因此只 fold seedLength 后的 child-owned suffix;projection 则采用 last valid descriptor wins,让 child 自己的记录覆盖 seed 中祖先身份。两处规则目的相同,折叠边界不同。MULTIAGENT-DESCRIPTOR-PROJECTIONMULTIAGENT-COLD-RESUME
进程重启后可恢复的是 child 对话及其声明式 composition,不是旧 Activation、run handle、accepted set 或 background Job。最终 flush 失败时,runtime 仍释放 graph,明确选择“可能 stale 的恢复”而不是“确定死锁的祖先”。MULTIAGENT-FINAL-FLUSH
16. Codex 对比:DeepSeek seam 看到一个 one-shot worker,Codex 内部仍可能编排 subagent
仓库里的 codex provider 每次委派启动新的官方 codex app-server --stdio,只继承父 Session 的 cwd。它声明零 start capabilities、没有 prepareContinuable、不共享父 transcript/preset/tool scope,也不返回本地 Agent handle。换言之,DeepSeek Harness 只把整个 Codex 运行包装成一个 one-shot child;即使该 Codex Turn 内部使用自己的 subagents,那棵内部树也不会成为 DeepSeek continuation graph 的可寻址节点。MULTIAGENT-CODEX-PROVIDERMULTIAGENT-CODEX-RUN
启动
固定命令,初始化 JSON-RPC;thread 创建成功前不发布 run。
隔离
thread/start 强制 ephemeral:true,cwd 指向父工作区。
执行
仅接受非空 text blocks,启动一个 Turn。
回收
关闭 wire、结束 stdin、终止并等待整个受管进程树。
Wire 只把最后一个 final_answer(无显式 final 时退回最后个 unphased answer)作为输出;commentary 与 reasoning 不返回。Context window exceeded 映射为 max-tokens,其他异常经 shared out-of-process settlement 变成 error/partial output。MULTIAGENT-CODEX-RUNMULTIAGENT-CODEX-WIRE
Command/file approval 只会选择 cancel 或 decline,permission 请求返回空权限,user input 返回空 answers,MCP elicitation 被拒绝;没有把 child 的审批请求冒充成人类已同意。对应协议测试还验证 ephemeral thread、跨 thread/turn 过滤、commentary 排除和 last-final 选择。MULTIAGENT-CODEX-UNATTENDEDMULTIAGENT-CODEX-WIRE-TEST
Codex 公开多 Agent 合同与本 seam 的差异
| 维度 | DeepSeek Harness 固定源码 | Codex 公开文档 |
|---|---|---|
| 编排单位 | Provider-bound child Session/run;continuable child 有 durable ID | Subagent workflow 与可检查的 agent thread |
| 协调责任 | 模型显式调用工具;direct parent 负责 follow-up,runtime 分开 report 与 settlement | Codex 负责 spawn、follow-up routing、wait 与 close,主 thread 汇总结果 |
| 并发边界 | 跨 child 可重叠;subagent seam 本身没有全局并发 cap | agents.max_concurrent_threads_per_session 可限制并发 open threads |
| 角色与配置 | Provider、preset、persona/filter 与 Agent options 组合 | 内置/default worker/explorer 与 project/personal TOML custom agents,可覆盖 model、reasoning、sandbox、MCP 和 skills |
| 权限 | 对应 service 已组合时,in-process child 复制显式 sandbox override,并把 approval 钉为 never | Subagent 继承当前 sandbox/permission mode 与 parent Turn 的 live overrides;无法呈现审批的非交互 run 会失败 |
Codex 一侧仅使用 OpenAI 公开的 Subagents 文档,检索于 2026-08-13。DeepSeek 一侧是固定 commit 的源码级证据;这个对照不推断任何未公开实现。
这个 adapter 的强项是隔离清楚、失败收敛、进程树可回收;代价是 DeepSeek parent 只得到一次性最终结果,看不到也不能直接 steer Codex 内部 agent threads。若要把 Codex child 暴露为 DeepSeek 可持续消息路由中的节点,不能从 codex provider 名称推断,必须另建有明确 durable/authority 合同的 backend。
17. 失败分层:在哪个提交点失败,决定谁负责善后
| 失败位置 | 外部可见结果 | 资源语义 |
|---|---|---|
| Provider/capability/schema 校验 | Tool 立即失败,无 child ID | 没有 provider work |
| 未发布 create/handshake | Start reject,无 lifecycle edge | Provider/Agent factory 回滚 partial resource |
| 发布后 model/transport | stopReason:error,可能有 partial output | holder 仍必须 dispose |
| Catalog 单 child 损坏 | diagnostic row | 其余 children 继续列出 |
| Parent 已消失 | Settlement notice 丢弃 | child Session 保留事实 |
| Final flush/teardown 失败 | warning 或 error lifecycle | 仍释放 ownership,避免永久 waiting |
Service 在 provider dispatch 前做 capability 检查;out-of-process helper 把发布后 transport rejection 变成稳定 result;listing 把读损坏隔离到单行。MULTIAGENT-RUNTIME-DISPATCHMULTIAGENT-OUTPROCESS-SETTLEMENTMULTIAGENT-LIST-SERVICE
Lifecycle listener 的 throw/rejection 被逐个隔离;one-shot 与每个 Activation epoch 都要求 start/end 身份配对。Invariant companion 还检查 provider add/remove 一致性、非空身份、没有重复的 live runId,以及 end 与 start 的 provider/child/local 字段一致。MULTIAGENT-LIFECYCLEMULTIAGENT-INVARIANTS
18. Pinned baseline 的两项 composition 审计结论
| 发现 | 证据 | 影响 |
|---|---|---|
| Fork continuable 声明与 shipped preset 冲突 | Provider 源码注释称没有随附调用者;base 的确是 one-shot,但 Standard、Code 和 Cordis preset 都配置 continuable | 这些 preset 会走已实现的 prepareContinuable,并给 fork child 增加 report prompt/tool,正好破坏注释所强调的逐字节 prefix reuse 前提 |
| Codex/Claude Code 是可选 package,不是默认可用工具 | Preset 有 provider-bound tool row,但默认 disabled;同一 preset 未装载对应 provider plugin | “仓库含 adapter”不能写成“用户默认能调用” |
Fork 的代码确实实现 continuable seed;base 配置及其理由与源码注释一致,而三个 agent preset 的实际值相反。因为工具在 provider 存在 prepareContinuable 时会成功挂载,这不是死配置。应统一为 one-shot,或更新设计说明并证明 report 增量不会破坏期望的 prefix/cache 语义。MULTIAGENT-FORK-PROVIDERMULTIAGENT-BASE-COMPOSITIONMULTIAGENT-STANDARD-PRESETMULTIAGENT-CODE-PRESETMULTIAGENT-CORDIS-PRESET
Codex 的边界同样需要写准确:provider package 完整存在,但 preset 只提供 disabled 的模型入口。MULTIAGENT-CODEX-PROVIDER
19. 保证矩阵与最终评价
| 形态 | 父历史 | 跨进程重启继续 | 后续消息 | 结果通道 |
|---|---|---|---|---|
| Spawn one-shot | 无 | 否 | 否 | Foreground result 或 Job |
| Fork one-shot | Completed-turn prefix | 否 | 否 | Foreground result 或 Job |
| Spawn continuable | 无 | 是,需 Session persistence | Direct parent FIFO | Report + settlement notice |
| Fork continuable | 创建时捕获一次 completed prefix | 技术上支持;shipped 配置有漂移 | Direct parent FIFO | Report + settlement notice |
| ACP/Codex/Claude/SDK | 无;最多继承父 cwd(ACP/SDK 可覆盖) | 否 | 否 | One-shot result |
最成熟的部分不是“会派 Agent”,而是提交点:发布前失败无 ID、inbox acceptance 后 ownership 转移、interrupt 不冒充 quiescence、Session 与 Activation 分层、树级 teardown 不因单支失败跳过 sibling。最明显的空白也同样清楚:没有全局调度、共享 team state、自动结果归并、durable Job queue 或跨任意 Agent 的消息总线。把这些空白说成边界,比把一组可组合原语宣传成完整 swarm 更有价值。
本章在固定提交 47f943859bef60e4160492346772ded9b24f765a 上追踪 production source、shipped config 与 tests,并运行了 packages/subagent 下 28 个 Vitest *.spec.ts 文件(E2E 文件使用独立配置):603 项全部通过。Codex 对照单独限定为 2026-08-13 检索的 OpenAI 公开文档;配置漂移是跨文件静态审计结论,不会因这些 package tests 通过而自动消失。
我的学习体会
内容仅自动保存到当前浏览器,不上传、不进入仓库。你可以导出 Markdown 自行归档。