id: ADR-008 title: 在持久任务控制平面中锚定目标模式 date: 2026-06-25 status: accepted relates-to:
- https://github.com/zeroclaw-labs/zeroclaw/issues/8303
- https://github.com/zeroclaw-labs/zeroclaw/issues/7929
- https://github.com/zeroclaw-labs/zeroclaw/pull/8217
- crates/zeroclaw-runtime
- crates/zeroclaw-config
- crates/zeroclaw-tools
ADR-008:在持久化任务控制平面中锚定目标模式
上下文
目标模式将代理交互从单次响应转变为针对用户目标的自主工作。一个目标可以在启动它的入站消息结束后继续存在,在等待输入或外部依赖时暂停,在守护进程重启后恢复,并在多次 worker、verifier 或委托调用中消耗模型用量。
这类工作需要一个在其整个生命周期内都持久存在的唯一权威来源。系统必须能够回答哪些工作仍处于活动状态,哪些工作有资格再次运行一轮,哪些工作已暂停,哪些工作已进入终态,以及哪个参与者或路由有权恢复或取消这些工作。提示约定或旁路注册表会使这些答案依赖于重复的状态。
预算核算增加了另一个事实来源约束。Token 和成本是模型提供商调用产生的事实。剩余预算是根据限额和已消耗用量推导出来的;将其作为自身的可变计数器存储,会创建第二套核算系统。
目标模式同样跨越了信任边界。斜杠命令和模型生成的请求都可以表达某个目标应当启动,但两者都不应能够自行授权可信的运行时事实,例如调用方身份、路由、通道或代理资格。
主要考虑的选项包括:带提示词指导的普通多轮聊天、单独的目标子系统,或将目标模式锚定在现有的持久任务控制平面中,并使用目标专用扩展状态。
决策
我们将把目标模式锚定在持久任务控制平面中,而不是构建一套并行的目标任务系统。
任务控制平面是目标生命周期、所有权、路由、主体、父级关系和恢复资格的事实来源。目标特定状态可以扩展任务记录,但不得重复任务记录所拥有的生命周期、身份、路由、时间戳、投递或终止状态事实。
已消耗的模型用量归属于权威用量账本。目标预算是依据用量记录进行解读的限额;剩余预算始终为派生值,而非以第二个可变总量的形式存储。
暂停、恢复、取消、重启恢复和完成都是控制平面的策略决策。提示文本可以解释或请求这些转换,但并不授权这些转换。
所有目标输入路径均使用同一个受信任的 Rust 端准入门控。运行时上下文提供受信任的事实,例如 surface、channel、principal、route 和 agent 资格;模型提供的参数不能声明这些事实。
目标完成需要由目标控制器作出明确的完成决策。沉默、没有进一步的工具调用,或看起来像最终回复的助手消息,都不足以将持久自主工作标记为完成。
后果
目标模式沿用现有的受监督任务生命周期,而不是添加第二个任务注册表。这样可让重启恢复、取消操作以及未来的监督改进都依附于同一个控制平面契约。
控制平面负责区分已暂停但可恢复的目标任务与已终止、已丢失或仍在运行的任务。这提升了精确任务状态转换和重启恢复策略的重要性。
预算强制执行变得可审计,因为已消耗用量是从规范用量记录中派生而来的。这也意味着,只有当每次可能消耗目标额度的模型调用都上报带有目标归因的用量时,目标模式才能保证正确。
委托和后台工作必须遵守相同的生命周期和使用边界。无法向所属目标报告完成情况和使用情况的工作无法安全地参与目标模式。
单一可信的准入门可防止命令和模型发起的进入路径演变成彼此独立的授权系统。代价是,所有受支持的界面都必须通过共享的命令/准入机制处理目标输入。
具体的实现决策,包括命令语法、暂停原因清单、payload 结构、验证器配置和发布阶段安排,留待实施计划和后续 PR 处理。它们必须与此 ADR 的事实来源边界保持一致。
参考文献
- RFC #8303: https://github.com/zeroclaw-labs/zeroclaw/issues/8303
- 共享命令目录 RFC #7929:https://github.com/zeroclaw-labs/zeroclaw/issues/7929
- 持久任务控制平面 PR #8217: https://github.com/zeroclaw-labs/zeroclaw/pull/8217
- Control-plane commit: https://github.com/zeroclaw-labs/zeroclaw/commit/607d69ef44dca07e2605e822db13fb437b462f4a
- Gateway ask-user/free-form 差距 #7776:https://github.com/zeroclaw-labs/zeroclaw/issues/7776
- 缓存 token 和成本核算 #7248: https://github.com/zeroclaw-labs/zeroclaw/issues/7248
- https://github.com/zeroclaw-labs/zeroclaw/issues/6548