DSHarness 系统拆解 固定基线 47f943859b · 36 已复核 / 0 撰写中 / 36 章
English
编排·第 24 章

多 Agent 协同

统一 seam 下的进程内、Fork、ACP、Codex、Claude Code 与 SDK 后端

已复核上游 47f943859b范围: 分析 provider registry、spawn/fork、上下文继承、continuation activation、控制工具、报告与作业集成。

结论:这不是“群体智能调度器”,而是一组可组合的委派生命周期

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-shotrun_in_background:falsechild 结束且 run 已 dispose 后返回 output没有可继续 ID
Background one-shotbackgroundMode:one-shot 且显式 trueJob 注册后返回 jobIdjob_output/job_kill
Background continuablebackgroundMode:continuable 且省略或传 true初始消息被 child inbox 接受即返回 subagentIdsend_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进程/上下文父对话ContinuableStart capabilities
spawn同进程,独立 Agent/Sessionschema、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 的工具行明确 disabledMULTIAGENT-SPAWN-PROVIDERMULTIAGENT-FORK-PROVIDERMULTIAGENT-ACP-PROVIDERMULTIAGENT-SDK-PROVIDERMULTIAGENT-CODEX-PROVIDERMULTIAGENT-CLAUDE-PROVIDERMULTIAGENT-STANDARD-PRESETMULTIAGENT-CODE-PRESET

4. Spawn 与 Fork 的差异只在会话 seed,不在 child 是否“独立”

1

Spawn

不传 seed;child 从空对话开始,委派 prompt 必须自包含。

2

Fork

复制父 Session 从 seq 0 到最后一个 turn/end 的平衡前缀。

3

排除当前 Turn

正在调用委派工具的 Turn 尚未闭合,不能作为合法 child seed。

4

后续独立

两者都拥有新的 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/filterpreset ID 与 descriptor 支撑恢复
Conversation只有 fork 复制 completed-turn prefixseed 成为 child 自己的 log 前缀
Sandbox / approvalSandbox 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 读取。completedabortederrormax-tokensrefusal 不会被压成一个布尔值;取消或截断仍可携带 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

Structured 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 必须分开看

状态依据含义
runningAgent 正运行,或有已接受但尚未离开 inbox 的 waking message当前 epoch 不能 settle
waitingAgent idle,但仍拥有未 dispose 的 child Activation父级被子树所有权钉住
settledAgent 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 runIdMULTIAGENT-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

Provider 不参与恢复

Cold resume 从持久 Session header 和 child 自己 suffix 中的 descriptor 重建 provider/model、persona 与 tool filter,然后直接走 agents.resume();它不 dispatch 原 provider。因此 provider 卸载会阻止新 start,却不必阻止已有 continuable child 恢复。Descriptor 不保存 maxTokensoutputSchema,恢复时不能假定这两个 activation-local 约束仍然存在。MULTIAGENT-COLD-RESUMEMULTIAGENT-DESCRIPTOR

11. 返回通道有四种,完成与报告绝不能混为一谈

通道谁发送会不会结束 childParent 得到什么
Foreground resultrun holder是,一次性直接 tool result
Background Job outcomeJob runtime是,一次性Job 状态/通知
reportContinuable child 主动选择direct parent inbox 的 relay
Settlement noticeContinuation manager在 teardown 后发送stop reason + 可用 closing message

send_message 只返回被接受的 messageId,不是 child 的回答。Child-scoped report 只能发给 direct parent,可按 wakeupquiet 调度,且报告不会结束 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

模型状态真实含义不是
runningLive Agent 正在驱动某个 Job 的 running
idleLive 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 AbortSignalcancel one-shot child/run已产生 partial outputholder 最终 dispose
Job killabort task-owned controllerJob identity 到 settlementJob producer settle + dispose
interrupt_agentcancel(..., 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

Ancestor descriptor 防串台

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

1

启动

固定命令,初始化 JSON-RPC;thread 创建成功前不发布 run。

2

隔离

thread/start 强制 ephemeral:true,cwd 指向父工作区。

3

执行

仅接受非空 text blocks,启动一个 Turn。

4

回收

关闭 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 只会选择 canceldecline,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 IDSubagent workflow 与可检查的 agent thread
协调责任模型显式调用工具;direct parent 负责 follow-up,runtime 分开 report 与 settlementCodex 负责 spawn、follow-up routing、wait 与 close,主 thread 汇总结果
并发边界跨 child 可重叠;subagent seam 本身没有全局并发 capagents.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 钉为 neverSubagent 继承当前 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/handshakeStart reject,无 lifecycle edgeProvider/Agent factory 回滚 partial resource
发布后 model/transportstopReason:error,可能有 partial outputholder 仍必须 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-shotForeground result 或 Job
Fork one-shotCompleted-turn prefixForeground result 或 Job
Spawn continuable是,需 Session persistenceDirect parent FIFOReport + settlement notice
Fork continuable创建时捕获一次 completed prefix技术上支持;shipped 配置有漂移Direct parent FIFOReport + 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 自行归档。