架构与执行循环
- 文档状态
- draft
- 文档 Owner
- DOC
- 事实源
- canonical-docs
- 更新
- 2026/10/16
Symphony 把任务来源、项目工作流和编码 Agent 接成一个持续运行的执行循环。核心负责决定何时执行、何时继续、何时停止;任务的业务含义由来源和项目合同决定。 Plane 可以通过团队适配层提供任务,不参与定义核心调度算法。
本页说明官方参考实现 be10a1b79df723d6d7612b5651c8522704dafb2e 中已读取的行为;不是团队已部署版本的声明。实现依据为 SPEC §3、§8、§10与 Orchestrator。
组件怎样协作
| 组件 | 输入与职责 | 输出与边界 |
|---|---|---|
| Workflow Loader / Config | 读取 WORKFLOW.md 的 YAML 配置与 Markdown 提示模板,解析默认值及环境变量引用 | 提供有效配置和模板;不凭配置文件存在证明部署成功 |
| Tracker Adapter | 从选定来源读取候选任务、按 ID 刷新任务、查询终态任务,归一化身份、状态、优先级、依赖等字段 | 提供稳定的任务模型与来源工具;来源写操作不成为调度器的通用业务 API |
| Orchestrator | 持有调度状态、轮询、准入、并发槽位、认领、重试及运行核对 | 决定派发、停止或释放;单进程内的认领不构成跨实例分布式锁 |
| Workspace Manager | 为任务分配、复用和清理工作目录,调用生命周期 hook | 提供受路径约束的目录;目录隔离不等于操作系统沙箱 |
| Agent Runner | 准备目录、渲染任务提示、启动 Codex app-server、执行一轮或多轮任务 | 把事件、用量、错误和退出结果交回调度器,不直接定义产品验收 |
| 日志与可选状态界面 | 展示会话、重试、阻塞和运行汇总 | 反映该服务实例的观测结果;不替代 tracker、Git、CI 或发布环境 |
一次轮询发生什么
- 先核对已有执行。 检查停滞时间,再按 ID 刷新运行任务;同时核对被输入或审批阻塞的任务。
- 校验本轮派发所需配置。 配置或 tracker 读取失败时不派发新任务。已有执行的核对在此之前进行。
- 读取候选。 来源适配器按配置范围读取活跃状态任务;调度器再检查必需字段、来源可路由标记、标签、认领与并发条件。
- 排序并分配槽位。 参考实现先按有效优先级
1..4升序,再按创建时间由早到晚,最后以任务标识排序;没有有效优先级或时间的条目排在相应队列后面。 - 派发前再次按 ID 刷新。 任务已消失、离开活跃状态、变为终态、不再满足路由条件,或刷新失败时,跳过这次派发,避免使用旧候选快照启动。
- 启动 worker 并记入认领。 worker 创建或复用目录、运行 hook、启动 Agent。事件持续回流;退出后进入续跑检查、重试或阻塞处理。
active_states、terminal_states 和 required_labels 必须对应所选来源及项目;不能把 Linear 的状态名、Plane 的委托字段或某项目 Backlog 规则当成所有来源的共同规则。具体准入见任务生命周期。
一个任务可以经历多个会话
Agent 正常完成一轮后,Runner 刷新原生任务。如果它仍活跃且可路由,可以在同一线程、同一目录继续,直到达到 agent.max_turns 或不再需要继续。首轮使用完整任务模板,后续轮次使用续跑提示,沿用线程上下文。
worker 正常退出后,Orchestrator 仍安排短延迟续跑检查。因此 max_turns 限制的是一次 worker 调用中的连续轮数,不是任务总轮数,也不是完成判据。依据见 AgentRunner.run / do_run_codex_turns。
结果怎样回到来源
调度器读取来源状态,并按状态管理执行;评论、状态迁移、提交、合并或发布由 Agent 可用工具及项目工作流负责。官方适配器可以向 Agent 提供来源原生工具,工具操作受宿主凭据权限约束;配置中的读取范围不能直接当作原生工具的写入权限边界。
团队的 Plane CAS、审核桥、GitLab 合并 guard 等属于配置与扩展边界。源码已提交、CI 已通过、站点已部署和用户已验收要分别取证,不能从一次正常退出推导完整交付成功。
继续阅读:任务生命周期 → 工作空间与 Agent → 失败与恢复。