Skip to content

【架构】 重构 NeoCode Agent Loop:Workflow Orchestrator、统一 AgentLoop 与上下文隔离 #721

@wynxing

Description

@wynxing

目标问题(Why)

NeoCode 已具备 ReAct 主循环、Plan/Build、Todo DAG、子 Agent、Context Compact、验收、Checkpoint 和 Runtime Event,但编排权分散在 runtime.Run、独立子 Agent loop、Todo Scheduler 和多个控制面组件中。复杂任务缺少统一的多阶段编排、结构化上下文交接和节点级恢复;继续在 runtime.Run 中叠加分支会扩大维护与正确性风险。

本 RFC 的目标是以 Workflow Orchestrator 和统一 AgentLoop 重构编排内核,提高复杂编码任务完成质量,并让每个阶段可观测、可持久化、可恢复、可测试。

现状与边界

  • TUI/Gateway:Gateway 是唯一通信边界;现有 v4 事件只能表达线性 Run。目标协议由 TUI v2 消费,TUI v1 冻结目录不修改并停止支持。
  • RuntimeService.Run 同时承担生命周期、provider、tool、budget、compact、plan、verify、checkpoint 和终止。目标是让 Orchestrator 管节点间流程,AgentLoop 管节点内闭环。
  • Provider/Tools:Provider 继续负责厂商适配;模型工具仍统一通过 internal/tools,不得把执行逻辑写入 Orchestrator。
  • Session/Context:Session 保留用户可见会话;Workflow、Node、Artifact 和 NodeTranscript 独立持久化。Context 只构建 PromptBundle,不作调度决策。
  • 写入边界:Explore、Synthesize、Verify 只读;Execute 是唯一工作区写入者。

关联议题:

核心设计(How)

主流程:

Intake -> Route
          |-- Fast: Execute -> Verify -> Finalize
          `-- Orchestrated:
                Explore[1..N] -> Synthesize/Plan -> Execute -> Verify -> Finalize
                                      |                         |
                                      | Plan mode approval      `-> Replan(有上限)
                                      v
                                Await Approval

关键设计:

  1. 混合路由:确定性规则处理明显 fast/orchestrated 场景,其余由无工具 Router 判断;输出非法时按质量优先进入 orchestrated。
  2. 受约束 DAG:模型只能生成固定类型节点的任务与依赖,不能定义权限、失败策略或任意节点类型。
  3. 统一 AgentLoop:主 Agent 与子 Agent 共用 provider、tool、budget、compact、stream、usage 和 transcript 闭环。
  4. 单写者:并行 Explore 只读;Execute 独占工作区写租约,第一版不实现并行 coder 或 worktree 合并。
  5. Artifact handoff:节点使用结构化 Artifact 交接,不复制父节点完整历史;节点 transcript 与 Session transcript 隔离。
  6. 节点级恢复:已完成节点不重跑;只读节点可重试;发生写入后中断的 Execute 进入 needs_recovery,结合 checkpoint、tool receipt 和 diff 决策,禁止盲目重放写操作。
  7. Context 分层:PromptBundle 固定为 role stable、workspace stable、workflow state、node context、turn delta;缓存提示保持 provider-neutral,由 adapter 映射。
  8. Event v5:事件携带 workflow_id、node_id、event_id 和单调 sequence;Gateway 提供快照、审批、恢复和事件重放 RPC。
  9. 角色模型配置:Router、Planner、Explorer、Executor、Reviewer 可覆盖 provider/model/thinking,默认继承会话模型。

为什么选择该方案:受约束 DAG 在复杂任务适应性和确定性之间取得平衡;单写者使恢复与回滚可证明;Orchestrator/AgentLoop 分离消除两套 ReAct 实现;Artifact 与节点 transcript 隔离能降低上下文污染并提高缓存前缀稳定性。

数据流、事件流与恢复流

  • 数据流:用户输入经 Gateway 创建 Workflow;Orchestrator 选择模板或 Planner DAG;节点由 AgentLoop 执行;Tool Manager 执行工具;Artifact 提供下游输入;accepted Verify 允许 Finalize。
  • 事件流:状态与事件在同一事务提交;客户端用 event_id 去重、sequence 检测缺口,重连时先读快照再增量重放。
  • 恢复流:启动扫描非终态 Workflow,将遗留 running 标为 interrupted;只读节点重试,写节点审计 checkpoint/receipt/diff 后继续、恢复或等待用户决议。

落地清单(What)

  • Phase 0:建立真实任务评测基线和迁移护栏。
  • Phase 1:落地 Workflow/Node/Artifact 领域模型、SQLite Store 和 v5 事件序列基础。
  • Phase 2:提取统一 AgentLoop,收敛主/子 Agent 重复闭环。
  • Phase 3:实现受约束 DAG Scheduler、单写者和节点级恢复。
  • Phase 4:接入混合 Router、Planner、并行 Explore、审批和 Verify/Replan。
  • Phase 5:接入 PromptBundle、节点 Context、Artifact handoff 与缓存抽象。
  • Phase 6:完成 Runtime Event v5、Gateway RPC 和 TUI v2 reducer。
  • Phase 7:全量评测、正式切换并删除旧编排链路。

验收标准(Done)

  • 正常路径覆盖 fast、并行 Explore、Plan 审批、Build 自动执行、Verify accepted 和 Finalize。
  • 异常路径覆盖 Router/Planner 非法输出、部分 Explore 失败、provider/tool/permission/budget/persistence 错误和 Verify failed。
  • 恢复路径覆盖只读节点重试、Execute 写后中断、tool receipt 已提交但消息缺失、checkpoint 不一致和 Gateway 重连。
  • 主链保持 TUI v2 -> Gateway -> Runtime -> Provider / Tool Manager -> Tools,无跨层直连。
  • Provider 厂商字段不泄漏到 Runtime、Context、Gateway 或 TUI。
  • 所有新增修改逻辑达到仓库 100% 覆盖目标,go build ./...go test ./... 和前端测试通过。
  • 真实任务评测显示复杂任务成功率提升,且错误完成声明和重复写入不增加。

风险与回滚

  • 风险:迁移期间存在两套状态来源;通过阶段性单一入口和 Store revision 禁止双写。
  • 风险:Planner DAG 不稳定;通过固定 schema、图校验和一次修正调用控制。
  • 风险:节点恢复误重放写操作;所有写后中断进入 needs_recovery,禁止自动重放。
  • 风险:v5 是 breaking change;先完成 Gateway/TUI v2 conformance,再切换 Runtime,并在发布说明中明确 TUI v1 停止支持。
  • 回滚:Phase 1–6 保留入口级回滚到旧 Run;每个 schema migration 使用事务。Phase 7 删除旧链路后按版本整体回滚,不让旧二进制处理活动 Workflow 新状态。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions