先看一次任务经过哪些边界
下面是依据接口整理的顺序示意,不是完整状态机;具体阶段由选中的工作流决定。普通对话可以保持临时状态,不创建持久任务。1
request -> route + eligibility -> workflow + roles
-> durable task + lease -> WorkOrder
-> executor progress / structured role result
-> contract validation -> next stage or stop
-> delivery package
-> separate ActionIntent -> authorization -> delivery action
status 和 stage 不应混用:任务可能仍在 running,阶段是 reviewing;也可能因为审批进入 awaiting_approval。不能把架构里的阶段列表读成每项任务必经的固定流水线。
路由形成可解释的 WorkOrder
路由先检查明确覆盖与任务画像,再做认证、数据、平台、Skill 信任和权限筛选,最后选择工作流、角色和 cooperative / delegated 模式。偏好当前宿主是软策略,不能压过硬资格要求。1
WorkOrder 将目标、完成契约、工作区、上下文清单、权限范围、输出 schema 与预算交给一个角色。其结构可以概括为:
taskId / runId / role
objective / completionContract
workspace / context.included / context.excluded
permissionScope / outputSchema / budget
这是字段示意。context 说明可以读什么、为什么读,以及排除了什么,不是全仓无限访问许可。cooperative 模式把 WorkOrder 交回当前宿主;delegated 模式由 Executor 适配器启动对应 CLI,并将供应商事件归一化。2
事件怎样成为可恢复状态
Task Repository 的 append(taskId, expectedVersion, events) 用观察版本约束追加。文件系统实现进入文件锁后读取已有事件,核对版本,再写账本和快照;load 根据 events.jsonl 重新计算状态,不以 state.yaml 为独立真相。3
同一观察版本下两个追加者竞争,只有一个应成功,另一个得到 StaleTaskVersionError。这是仓储契约测试中的明确断言,不是靠最后写入者获胜。
需要注意提交边界:实现分别原子替换账本和快照文件,并非将多个文件放入一个数据库事务。恢复依赖账本重建,正是为了不把可能滞后的快照当作事实。
角色交卷后,控制层仍要判断
RoleResult 含状态、摘要、工件、证据、风险与请求动作。实现者的 completed 是角色结果,不自动等于任务终态。高风险工作流还需要评审与裁决;未解决的问题和未通过的完成条件会阻止交付就绪。12
隔离 worktree 让实现者的修改与原工作区分开。Reviewer 可以读取同一份待评审内容,但没有 workspace:write。这保留了“看的是哪个补丁”和“谁有权修改”的对应关系,代价是 worktree 生命周期与产物整理。4
暂停与跨宿主恢复保留什么
恢复的是同一个任务,而不是新建任务把计数清零。新宿主重新检查执行资格、取得可用 Lease,并从事件重建状态;交接上下文包含 brief.md、handoff.md 等任务材料,不要求复制完整会话。5
预算也持续存在。测试中,原 WorkOrder 的 deadline 是 00:30,00:10 暂停、00:20 恢复后仍是 00:30;暂停没有赠送额外执行时间。Generator 轮次达到上限时,任务进入 partial 并记录 budget.exhausted,不能把缺少验证的结果改称完成。这里的时刻是测试输入,不是真实运行时间。6
V1 不是常驻 daemon。宿主关闭后停止执行,与下次可以凭持久记录恢复,是两件不同的事。
交付审批绑定的是具体内容
交付动作会记录 Git HEAD、工作区指纹;应用补丁还绑定补丁内容哈希。执行前再次核对这些信息,补丁发生变化则要求重新确认。git apply --check 成功也只表示补丁可应用,不代替用户授权。7
这解释了为什么“刚才已经同意了”仍可能不能执行:同意针对的是当时的目标、内容与范围。变更后继续复用确认,会把用户没有看过的内容纳入旧授权。
在已有匹配安装环境中,可使用以下只读诊断入口核对任务。TASK_ID 必须替换为已有任务身份;此处不创建任务或执行交付:
harness status TASK_ID
harness events TASK_ID
命令入口以该修订 CLI 为准。本次未执行这些上游命令,也没有修改宿主设置。8
来源与范围
源码基线为 1f2270eaa31ba099837375bfcdfd162c8f31f1b9。本文区分架构目标、实现与测试断言,本次未重跑真实 Codex / Claude Code 验收。更多取舍见设计页,测试条件与缺口见实验验证。