任务生命周期与状态
- 文档状态
- draft
- 文档 Owner
- DOC
- 事实源
- canonical-docs
- 更新
- 2026/10/16
一个任务同时具有来源业务状态、Symphony 编排状态和交付结果。排查时先确定自己在看哪一层,再决定下一步;不要通过修改来源状态来掩盖运行错误。
本页以官方参考实现 be10a1b79df723d6d7612b5651c8522704dafb2e 为依据,见 SPEC §7–8与 Orchestrator。目标部署的版本、有效配置和运行快照仍需另行核对。
三种状态各自回答什么
| 层次 | 例子 | 能证明什么 |
|---|---|---|
| 来源业务状态 | Linear 或 Plane 原生状态、依赖、负责人 | 来源当前记录的业务进度与准入信息;不证明 Agent 正在运行 |
| Symphony 编排状态 | running、retrying、blocked、认领及会话事件 | 该执行服务实例正在处理什么;不证明变更已合并或发布 |
| 交付结果 | commit、PR / MR、CI、部署回执、验收 | 对应交付环节的事实;不能仅以评论或 Done 字样替代 |
同名 In Progress 在来源里是业务字段;运行列表里出现该名称,通常是服务保存的来源快照。它不是第二套业务状态机。
从候选到派发
参考实现只把满足以下条件的任务作为派发候选:
- 身份、标识、标题和状态完整;状态处于配置的活跃集合,且不处于终态集合。
- 适配器给出可派发标记,并满足所有
tracker.required_labels。 - 当前实例没有该任务的 running 或 claimed 记录;全局与相应状态的并发槽位可用。
- 派发前按 ID 刷新的任务仍符合准入要求。
来源适配器负责其专属规则。例如该版本 Linear 适配器会考虑 assignee 路由及 Todo 任务的非终态 blocker;不能据此推导 Plane 或其他来源具有同样的准入算法。任务模型与通用路由判断见 Tracker.Issue,来源差异见任务来源。
认领与执行阶段
| 编排阶段 | 含义 | 后续可能发生什么 |
|---|---|---|
| 未认领 | 没有运行或已安排的重试 | 下轮读取后按条件选入 |
| 已认领并运行 | 当前实例已为任务启动 worker | 准备目录、渲染提示、启动会话、流式执行 |
| 已认领并等待重试 | 当前没有 worker,存在延迟重试记录 | 到期刷新任务,再派发、重排或释放 |
| 等待输入或审批 | 该参考实现将任务留在 blocked 集合并保持认领 | 需要处理阻塞原因,并按实际实现支持的恢复路径操作 |
| 已释放 | 不再占有认领 | 若来源以后重新符合条件,可能再次成为候选 |
blocked 是这个参考实现的运行行为,不能当作所有按 SPEC 实现的版本都具有相同界面或恢复操作。其记录只在内存中,详见失败与恢复。
认领防止的是当前调度器重复派发同一任务。不要对同一范围同时启动多个独立实例,并据此假设获得跨实例的 exactly-once 保证;原生工具写入、Git 操作与业务动作还需要各自的幂等或并发合同。
活跃、终态与停止
运行期间会刷新来源状态:
- 仍活跃且可路由: 更新运行快照,允许继续。
- 进入终态: 停止对应执行并清理任务工作空间。
- 离开活跃范围或不再可路由: 停止执行,保留工作空间。
- 刷新失败: 本次核对不因网络错误强行停止现有 worker,之后再次核对。
任务在刷新结果中缺失时还需结合来源的权限、可见性及删除语义判断,不能把“查询不到”统一解释为“业务完成”。切换来源、项目范围或凭据前,应先确认正在运行的任务及待保留的工作成果。
什么时候可以说完成
正常 turn 完成、worker 成功退出和任务终态是不同事件。活跃任务可能继续跑;终态可以触发目录清理,但不反向证明交付证据齐全。
首次任务应分别确认:原生任务唯一且保存成功、Symphony 确实启动过对应会话、预期修改及验证证据存在、项目要求的 review / merge / deploy / acceptance 分别满足。业务状态由授权工作流处理,不能用一个 Done 代替这些事实。