|
|
@@ -3,8 +3,8 @@
|
|
|
> 文档定位:通用 Agent 框架演进方案,不属于任何具体业务项目的技术方案
|
|
|
> 适用范围:当前仓库 `agent/agent` 框架内核
|
|
|
> 分析日期:2026-07-18
|
|
|
-> 实施状态:Framework V1 已在当前仓库 `cyber-agent 0.4.0` 版本基线落地,本文以当前代码和测试为准
|
|
|
-> 写作原则:说清 V1 已实现什么、还有哪些边界、V2/V3 如何演进;不展开业务表结构和具体业务字段
|
|
|
+> 实施状态:Framework V1 闭环和 V2 第一阶段通用观测、后台 Operation、恢复与验证策略能力已在当前仓库落地,本文以当前代码和测试为准
|
|
|
+> 写作原则:说清当前已实现什么、组装边界和后续 V2/V3 如何演进;不展开业务表结构和具体业务字段
|
|
|
|
|
|
## 一、结论
|
|
|
|
|
|
@@ -52,7 +52,8 @@ Decision:主 Agent 对评估结果做出的最终决定
|
|
|
- 控制 Planner、Worker、Validator 的工具权限;
|
|
|
- 管理 Agent 会话生命周期和上下文隔离;
|
|
|
- 保存 Task、Attempt、Validation、Decision 和 Trace;
|
|
|
-- V1 提供 Python 内核、规划工具、文件存储和通用事件;公开 Task HTTP API、跨进程恢复和分布式观测属于 V2/V3。
|
|
|
+- 提供 Python 内核、规划工具、文件存储、durable Event journal、通用 V2 HTTP 适配器和异步 Python SDK;路由由 Host 显式挂载,不由根 `api_server.py` 自动开启;
|
|
|
+- 支持持久化 Background Operation 状态、stop/resume 和显式恢复,但 Agent 运行仍由当前进程的 `asyncio.Task` 执行,不是分布式队列。
|
|
|
|
|
|
### 2.2 框架不负责什么
|
|
|
|
|
|
@@ -115,19 +116,21 @@ Host 传入的 context 会先合并,但 role、task_id、attempt_id、validati
|
|
|
|
|
|
`agent/agent/orchestration/models.py` 已定义 Task、TaskSpec、Attempt、ArtifactSnapshot、ValidationReport 和 PlannerDecision。`TaskCoordinator` 是唯一 Ledger 写入入口。
|
|
|
|
|
|
+`TaskLedger.root_objective` 是只读派生属性:有 Root Task 时始终读取其当前 `TaskSpec.objective`,只有无 Root Task 的旧 Ledger 才回退到历史 `mission` 字段。Ledger 正常提交时会将兼容 JSON 字段 `mission` 归一为当前 `root_objective`,不另建第二套 Root 状态。`root_completion()` 是正式读取入口,`mission_completion()` 仅作兼容代理;Runner 优先调用新接口,对只有旧方法的 Coordinator stub 回退兼容。GoalTree 缺失后的重建同样使用 `root_objective`,因此 Root revise 后不会恢复旧目标。
|
|
|
+
|
|
|
GoalTree 仍保留任务树展示和焦点能力,但 explicit 模式不向 Planner 暴露旧 `goal` 写入工具。Coordinator 先更新 Ledger,再以 best-effort 方式投影 Goal 状态;Ledger 仍是唯一状态真相。所有自动投影失败都只记录警告,不会把已提交的命令表现成失败;后续可用严格执行的 `reconcile_goal_tree()` 修复不一致。
|
|
|
|
|
|
### 3.4 Worker 和 Validator 通过 LocalAgentExecutor 运行
|
|
|
|
|
|
-`agent/agent/orchestration/executor.py` 为两种角色创建本地 Sub-Trace:
|
|
|
+`agent/agent/orchestration/executor.py` 的 `LocalAgentExecutor` 为 Agent-mode 执行创建本地 Sub-Trace:
|
|
|
|
|
|
- 新 Worker Attempt 默认新 Trace;仅 repair 可经 Coordinator 校验后续用原 Worker Trace;
|
|
|
-- 每次 Validation 都创建新 Validator Trace;
|
|
|
+- 每次 Agent-mode Validation 都创建新 Validator Trace;deterministic mode 只有独立 Validation record 和执行身份,不调用模型、不创建实际 Trace;
|
|
|
- Worker 必须以 `submit_attempt` 结束;
|
|
|
- Validator 必须以 `submit_validation` 结束;
|
|
|
- 两个提交工具都是 terminal tool,成功提交一次后立即结束当前 Agent Loop。
|
|
|
|
|
|
-V1 explicit 只支持本地 Sub-Trace,`remote_*` Worker 或 Validator 会被拒绝;远程 Agent 仍走 legacy 路径。
|
|
|
+explicit 闭环只支持本地 Sub-Trace,`remote_*` Worker 或 Validator 会被拒绝;远程 Agent 仍走 legacy 路径。`LocalAgentExecutor` 和 `OperationRuntime` 都是进程内实现:Ledger 中的 Operation 可持久化,但正在运行的模型调用不能跨进程接管。
|
|
|
|
|
|
### 3.5 独立 Task 批量调度已实现
|
|
|
|
|
|
@@ -137,9 +140,11 @@ TaskConflict、单个 Task 预留异常和单个执行周期内的 Artifact/框
|
|
|
|
|
|
### 3.6 端口、默认适配器和兼容边界已明确
|
|
|
|
|
|
-V1 已定义 TaskStore、ArtifactStore、AgentExecutor、ToolPolicy 和 EventSink Protocol,并提供文件存储、本地执行、默认权限和 JSONL 事件实现。
|
|
|
+当前已定义 TaskStore、ArtifactStore、AgentExecutor、ToolPolicy、EventSink、ValidationPolicy、DeterministicValidator 和 EvidenceProvider 等通用端口,并提供文件存储、本地执行、默认权限、默认完整 Validator 策略及规则型确定性 Validator。
|
|
|
+
|
|
|
+Orchestration Event 的默认真源是 `FileSystemTaskStore` 在 Ledger 提交中原子写入的 durable journal。`wire_orchestration(..., event_sink=None)` 默认不生成重复 `events.jsonl`;`TraceEventSink` 仅是 Host 显式注入时启用的 best-effort 兼容镜像。
|
|
|
|
|
|
-`RunConfig.completion_policy` 默认仍是 `legacy_auto`。新闭环必须显式使用 planner preset、`explicit_validation` 并调用 `wire_orchestration()`。旧 `agent`、`evaluate`、`goal`、Trace 读取和 project_name 入口保持兼容。
|
|
|
+`RunConfig.completion_policy` 默认仍是 `legacy_auto`。新闭环必须显式使用 planner preset、`explicit_validation` 并完成 Coordinator、Executor 与 Runner 的等价装配;`wire_orchestration()` 是标准便利路径,自定义验证策略时也可由可信 composition root 直接构造并绑定。旧 `agent`、`evaluate`、`goal`、Trace 读取和 project_name 入口保持兼容。
|
|
|
|
|
|
## 四、V1 已解决的原始问题
|
|
|
|
|
|
@@ -161,7 +166,7 @@ Worker Trace completed
|
|
|
|
|
|
### 4.2 正式 Validator 与旧 evaluate 已分开
|
|
|
|
|
|
-V1 已增加 validator preset、独立 Validator Trace、固定 Snapshot 输入和 `submit_validation` 结构化协议。运行状态 error/stopped/expired 与评审结论 failed/inconclusive 分开保存。
|
|
|
+V1 已增加 validator preset、独立 Validation record、固定 Snapshot 输入和 `submit_validation` 结构化协议。Agent mode 使用独立 Validator Trace;deterministic mode 使用独立执行身份但不创建模型 Trace。运行状态 error/stopped/expired 与评审结论 failed/inconclusive 分开保存。
|
|
|
|
|
|
旧 `evaluate()` 仅在 `legacy_auto` 中保留原语义,不参与 explicit 闭环。
|
|
|
|
|
|
@@ -173,7 +178,7 @@ legacy 模式仍保留原 tools/tool_groups 并集行为,避免旧业务立即
|
|
|
|
|
|
### 4.4 父任务自动完成已关闭
|
|
|
|
|
|
-GoalTree 的旧级联行为保留为 legacy 默认。Coordinator 投影 Goal 时始终传入 `cascade_completion=False`。子 Task 全部 completed 后,父 Task 只从 `waiting_children` 进入 `needs_replan`,不会自动 completed。
|
|
|
+GoalTree 的旧级联行为保留为 legacy 默认。Coordinator 投影 Goal 时始终传入 `cascade_completion=False`。直接子 Task 全部进入 terminal 状态(completed/cancelled/superseded)后,父 Task 只从 `waiting_children` 进入 `needs_replan`,不会自动 completed。
|
|
|
|
|
|
### 4.5 repair 续用已进行身份校验
|
|
|
|
|
|
@@ -187,7 +192,7 @@ Ledger commit 成功后不会因观测失败而回滚,因此 Ledger 始终是
|
|
|
|
|
|
### 4.7 核心回归测试已建立
|
|
|
|
|
|
-当前 `agent/tests` 共有 49 个测试用例,覆盖状态机、Ledger/Snapshot、terminal tool、角色权限、Worker→Validator→Decision 闭环、repair/retry/revise/split/revalidate、并行异常隔离、Goal 投影、批次结果持久化故障、幂等请求绑定与并发重放、legacy 真实执行和 Host 解耦。
|
|
|
+当前 `agent/tests` 已覆盖状态机、Ledger/Snapshot、terminal tool、角色权限、Worker→Validator→Decision 闭环、repair/retry/revise/split/revalidate、并行异常隔离、Goal 投影、Root revise、子 Decision 冻结绑定、Background Operation、V2 API/SDK、Event/Trace 关联、幂等并发重放、ValidationPolicy/Evidence Port、legacy 真实执行和 Host 解耦。
|
|
|
|
|
|
## 五、目标架构
|
|
|
|
|
|
@@ -204,7 +209,7 @@ flowchart TD
|
|
|
Executor --> Worker[Worker Sub-Trace]
|
|
|
Worker --> Submission[submit_attempt]
|
|
|
Submission --> Snapshot[ArtifactSnapshot Manifest]
|
|
|
- Snapshot --> Validator[Validator Sub-Trace]
|
|
|
+ Snapshot --> Validator[Agent-mode Validator Sub-Trace / deterministic rule execution]
|
|
|
Validator --> Report[ValidationReport]
|
|
|
|
|
|
Report --> Runner
|
|
|
@@ -212,10 +217,11 @@ flowchart TD
|
|
|
Decision --> Ledger
|
|
|
|
|
|
Coordinator --> TraceStore[TraceStore]
|
|
|
- Coordinator --> EventSink[TraceEventSink]
|
|
|
+ Coordinator --> Journal[TaskStore Durable Event Journal]
|
|
|
|
|
|
Host -.注入.-> Tools[Business Tools]
|
|
|
Host -.注入.-> ArtifactStore[ArtifactStore]
|
|
|
+ Host -.可选注入.-> EventSink[External / Trace Event Sink]
|
|
|
Tools -.read capability.-> Validator
|
|
|
```
|
|
|
|
|
|
@@ -303,7 +309,8 @@ Coordinator 不是 Agent,而是一层确定性程序。
|
|
|
- 绑定 Task 版本和固定输出快照;
|
|
|
- 在 Worker、Validator 和主 Agent 之间传递正确上下文;
|
|
|
- 防止重复请求产生重复执行;
|
|
|
-- V1 归一化 executor 返回的 failed、error、stopped 和 expired 状态;主动超时、后台 stop/resume 和进程重启恢复属于 V2;
|
|
|
+- 归一化 executor 返回的 failed、error、stopped 和 expired 状态,并管理可持久化 Background Operation 的 dispatch/revalidate、deadline、stop/resume 和显式恢复;
|
|
|
+- 恢复时不猜测旧模型调用是否产生了外部副作用,也不自动重跑模型;Agent 执行仍受制于当前进程的 `OperationRuntime`;
|
|
|
- 保证只有主 Agent Decision 能完成 Task。
|
|
|
|
|
|
Agent 负责判断,Coordinator 负责守规则。
|
|
|
@@ -347,7 +354,7 @@ Worker 负责执行一次 Task Attempt。
|
|
|
|
|
|
### 7.5 Validator
|
|
|
|
|
|
-Validator 使用独立 Trace 和独立上下文进行评估。
|
|
|
+Agent-mode Validator 使用独立 Trace 和独立上下文进行评估;deterministic Validator 不调用 AgentRunner,但仍有独立 Validation record、冻结计划和执行身份。
|
|
|
|
|
|
代码上它与主 Agent 共用完整 AgentRunner,因此可以在一次 Validation 内自主安排核验步骤、多轮推理并多次调用已授权只读工具。但它不是业务 Planner,不能规划任务树、派发 Worker/Validator、创建 SubAgent 或作出 Task Decision。
|
|
|
|
|
|
@@ -371,7 +378,7 @@ Validator 使用独立 Trace 和独立上下文进行评估。
|
|
|
- 发布输出;
|
|
|
- 完成 Task。
|
|
|
|
|
|
-每次 Validation 都使用新 Trace,一轮内只能成功调用一次 `submit_validation`,提交后立即结束本轮 Agent Loop。Validator 不能自己发起第二轮验证。
|
|
|
+每次 Agent-mode Validation 都使用新 Trace,一轮内只能成功调用一次 `submit_validation`,提交后立即结束本轮 Agent Loop。Validator 不能自己发起第二轮验证。deterministic mode 由 Coordinator 调规则引擎并直接提交结构化结果,没有聊天轮次。
|
|
|
|
|
|
## 八、核心对象
|
|
|
|
|
|
@@ -401,7 +408,15 @@ Attempt 表示一个 Worker 对某个 Task 版本做过的一次执行。
|
|
|
- 使用不同模型重做;
|
|
|
- 使用不同工具组合重做。
|
|
|
|
|
|
-每个 Attempt 都绑定自己的 Worker Trace。只有成功调用 `submit_attempt` 的 Attempt 才会绑定新提交清单快照;failed、stopped 或 expired Attempt 只保留状态、错误和 Trace,不生成 Snapshot。V1 ArtifactSnapshot 冻结的是 summary、artifact_refs 和 evidence_refs 的规范化 manifest 及 SHA-256,不复制外部产物字节。
|
|
|
+每个 Attempt 都绑定自己的 Worker Trace。只有成功调用 `submit_attempt` 并提交 Ledger 的 Attempt 才会绑定 `snapshot_id`;failed、stopped 或 expired Attempt 不绑定 Snapshot。由于 freeze 先于 Ledger commit,后续所有权/CAS 失败可能在 ArtifactStore 留下可清理的孤儿 Snapshot,不能将其自动挂到其他 Attempt。V1 ArtifactSnapshot 冻结的是 summary、artifact_refs 和 evidence_refs 的规范化 manifest 及 SHA-256,不复制外部产物字节。
|
|
|
+
|
|
|
+Attempt 创建时还会冻结 `accepted_child_decision_ids`,作为父 Worker 输入的因果绑定:
|
|
|
+
|
|
|
+- `None`:升级前的旧 Attempt 没有记录,历史输入未知;
|
|
|
+- `()`:新 Attempt 明确没有直接子任务输入;
|
|
|
+- 非空 tuple:按直接子 Task 的 `display_path` 顺序保存已 completed 子 Task 的有效 ACCEPT Decision ID;cancelled/superseded 子 Task 不提供 Decision 输入。
|
|
|
+
|
|
|
+Worker 只能从该冻结列表解析子结果,不扫描“当前最新子任务状态”。Coordinator 会校验 ID 唯一、顺序正确、属于直接子 Task、action=ACCEPT,且能闭合到该子 Task 的 Decision→Attempt→Validation→ArtifactSnapshot。遗留 RUNNING Attempt 若该字段为 `None`,不猜测输入,而是以 `PROTOCOL_VIOLATION` 失败并进入正常重新规划;新 Attempt 会记录完整绑定。
|
|
|
|
|
|
### 8.3 Validation
|
|
|
|
|
|
@@ -451,6 +466,12 @@ V1 不定义独立 EvidenceRef 类,evidence_refs 复用 ArtifactRef 结构。
|
|
|
- Trace;
|
|
|
- 人工复核。
|
|
|
|
|
|
+### 8.7 Background Operation
|
|
|
+
|
|
|
+BackgroundOperation 表示一次可异步控制的 dispatch 或 revalidate 命令,是持久化控制面对象,不是 Task/Attempt/Validation 的第二份状态。它记录 Operation kind/status、关联 task/attempt/validation IDs、result reference、deadline、execution epoch、错误和时间戳。
|
|
|
+
|
|
|
+request 和 request fingerprint 用于持久幂等和恢复校验,但不在 `OperationView` 和 Mission Snapshot 的 wire 响应中公开。`execution_epoch` 使 stop/resume 后的旧运行任务无法越过所有权边界提交迟到结果。
|
|
|
+
|
|
|
## 九、状态模型
|
|
|
|
|
|
### 9.1 Task 状态
|
|
|
@@ -514,7 +535,7 @@ inconclusive 无法判断或证据不足
|
|
|
4. Validation Run Status=completed 后,无论 Verdict 是什么,都进入 awaiting_decision;
|
|
|
5. 普通 accept 只允许绑定当前 Task Version、当前 Attempt Snapshot,以及 Run Status=completed 且 Verdict=passed 的 Validation;
|
|
|
6. 只有主 Agent 的有效 accept Decision 能把 Task 写成 completed;
|
|
|
-7. 子 Task 全部 completed 后,父 Task 从 waiting_children 进入 needs_replan,绝不自动 completed;
|
|
|
+7. 直接子 Task 全部 terminal(completed/cancelled/superseded)后,父 Task 从 waiting_children 进入 needs_replan,绝不自动 completed;父 Attempt 的冻结输入只包含 completed 子 Task 的有效 ACCEPT Decision;
|
|
|
8. 旧 Task 版本的 Validation 不能用于新版本;
|
|
|
9. 执行失败和评估异常不能伪装成业务不通过;
|
|
|
10. 重复请求不能重复创建 Attempt 或重复接受输出。
|
|
|
@@ -570,11 +591,13 @@ sequenceDiagram
|
|
|
|
|
|
## 十一、Validator 设计
|
|
|
|
|
|
-### 11.1 V1 的验证方式与后续分层
|
|
|
+### 11.1 已实现的验证分层
|
|
|
+
|
|
|
+Coordinator 现在会通过 `ValidationPolicy` 为每次 Validation 冻结可序列化 `ValidationPlan`。默认 `DefaultValidationPolicy` 仍选择完整 Validator Agent,因此不改变 V1 的默认行为;Host 也可注入 `RuleBasedDeterministicValidator` 及其规则,运行确定性验证。
|
|
|
|
|
|
-V1 每次都运行完整 Validator Agent。Validator 可通过 Host 注入的 read capability 工具执行格式、文件、哈希、接口和测试结果检查;Coordinator 只校验结构化报告是否覆盖验收条件,以及总体 passed 是否与硬性条件冲突。
|
|
|
+Agent Validator 可通过 Host 注入的 read capability 工具执行格式、文件、哈希、接口和测试结果检查;Coordinator 校验结构化报告是否覆盖验收条件,以及总体 passed 是否与硬性条件冲突。第二模型、人工复核和更完整的风险分层治理仍是后续能力。
|
|
|
|
|
|
-独立 DeterministicCheck 引擎、按风险选择轻量检查/完整 Validator、第二模型和人工复核策略属于 V2/V3,不是 V1 已实现组件。
|
|
|
+组装边界必须单独说明:`TaskCoordinator.__init__()` 已支持传入 `validation_policy`、`deterministic_validator` 和 `evidence_provider`,但当前便利函数 `wire_orchestration()` 尚未暴露这三个参数。需要自定义策略的 Host 必须在 composition root 直接构造 Coordinator 或完成对 wiring 的通用扩展,不能只写配置就假设已生效。
|
|
|
|
|
|
### 11.2 Validator 必须评估固定快照
|
|
|
|
|
|
@@ -632,7 +655,7 @@ Validator 可以在 `criterion_results.reason` 和 `summary` 里说明失败位
|
|
|
|
|
|
Coordinator 必须检查 Decision 是否适用于当前状态。例如已经 superseded 的 Task 不能再次 accept,已经修改验收条件的 Task 不能继续使用旧 Validation。
|
|
|
|
|
|
-`revalidate` 不通过 `task_decide` 执行,而是 Planner 调用独立 `validate_attempt` 工具。它只允许在上一次 Validator 为 error、stopped 或 expired,且 Task 处于 needs_replan 时,对未变化 Snapshot 创建新 Validator Trace。failed/inconclusive 是有效评审结论,不能使用 revalidate 绕过主 Agent 重规划。
|
|
|
+`revalidate` 不通过 `task_decide` 执行,而是 Planner 调用独立 `validate_attempt` 工具。它只允许在上一次 Validator 为 error、stopped 或 expired,且 Task 处于 needs_replan 时,对未变化 Snapshot 创建新 Validation;Agent mode 创建新 Validator Trace,deterministic mode 不创建模型 Trace。failed/inconclusive 是有效评审结论,不能使用 revalidate 绕过主 Agent 重规划。
|
|
|
|
|
|
“补证据”不是 V1 的独立 DecisionAction。主 Agent 应通过 `task_plan` 创建补证据 Task,或使用 split、revise、block 组合表达。
|
|
|
|
|
|
@@ -697,7 +720,7 @@ New Attempt → New Worker Sub-Trace
|
|
|
|
|
|
### 13.4 Validator 默认每次新建上下文
|
|
|
|
|
|
-每次 Validation 默认使用新 Trace,避免上一轮结论影响新一轮证据判断。
|
|
|
+每次 Agent-mode Validation 默认使用新 Trace,避免上一轮结论影响新一轮证据判断。deterministic mode 不创建模型 Trace。
|
|
|
|
|
|
框架可以复用 Validator Preset,但不复用其评估聊天历史。
|
|
|
|
|
|
@@ -781,13 +804,13 @@ V1 已提供 TaskStore Protocol 和 FileSystemTaskStore。V2 可替换为关系
|
|
|
|
|
|
框架只认识 Artifact Reference,不认识具体内容结构。
|
|
|
|
|
|
-### 15.3 Evidence Port(V2 扩展)
|
|
|
+### 15.3 Evidence Port
|
|
|
|
|
|
-负责向 Validator 提供业务证据查询能力。V1 不定义独立证据读取端口;证据使用 `evidence_refs` 字段中的 ArtifactRef 和经 capability 授权的只读工具提供。
|
|
|
+EvidenceProvider/EvidencePort 及 `EvidenceQuery`/`EvidenceResponse` 已实现,Coordinator 会校验 root、task、attempt、validation、snapshot 和 Validator 执行身份归属,并执行每次 Validation 的查询次数、单次数量和超时限制。查询结果会按 Validation 持久化和幂等复用。
|
|
|
|
|
|
-实际实现可以是 ToolRegistry 中注册的只读工具,也可以是业务提供的适配器。
|
|
|
+当前缺口是 Agent 工具集尚未暴露通用 `query_evidence` terminal/non-terminal 工具,`wire_orchestration()` 也尚未接收 EvidenceProvider。因此 Host 可直接调用 Coordinator 端口或继续使用 capability 授权的只读业务工具,但不应宣称 Validator Agent 已能自动调用该通用 Evidence Port。
|
|
|
|
|
|
-### 15.4 Validation Policy(V2 扩展)
|
|
|
+### 15.4 Validation Policy
|
|
|
|
|
|
用于定义:
|
|
|
|
|
|
@@ -797,7 +820,7 @@ V1 已提供 TaskStore Protocol 和 FileSystemTaskStore。V2 可替换为关系
|
|
|
- 哪些 Task 需要人工复核;
|
|
|
- 最大验证次数和成本。
|
|
|
|
|
|
-V1 没有 ValidationPolicy 类或策略引擎,每次都启动完整 Validator。以上风险分层属于 V2/V3。
|
|
|
+当前已有 `ValidationPolicy`、冻结 `ValidationPlan`、默认 Agent 验证和规则型确定性验证。第二模型、人工复核、自动风险分层和总验证成本上限仍属于 V2/V3 后续治理。
|
|
|
|
|
|
### 15.5 Tool Policy
|
|
|
|
|
|
@@ -807,7 +830,7 @@ Tool Policy 负责角色到工具权限的映射,并在工具执行前进行
|
|
|
|
|
|
### 15.6 Event Sink
|
|
|
|
|
|
-当前 TraceEventSink 输出的主要事件包括:
|
|
|
+当前 Orchestration Event 已使用 schema v2,旧 v1 事件仍可读,sequence/cursor 语义不变。主要事件包括:
|
|
|
|
|
|
```text
|
|
|
ledger_created
|
|
|
@@ -824,9 +847,12 @@ validation_error
|
|
|
task_cycle_failed
|
|
|
dispatch_completed
|
|
|
goal_projection_linked
|
|
|
+execution_stats_recorded
|
|
|
```
|
|
|
|
|
|
-`planner_decision` 的 action/payload 表达 accept、block、split 等具体动作,V1 不为每个动作另造事件名。当前实现为本地 `events.jsonl`;稳定的对外订阅协议属于 V2。
|
|
|
+Event 只是变化通知和实体引用,不复制 Task、Decision 或 Validation 对象:Attempt 事件带 `task_id + attempt_id`,Validation 带 `task_id + attempt_id + validation_id`,Decision 带 `task_id + decision_id`,Task 创建带 `parent_task_id + task_ids`,Operation 复用 envelope 顶层 `operation_id`。`validation_restarted` 和 `execution_stats_recorded` 也会补齐实体关联;没有实际状态变化时不产生重复事件。
|
|
|
+
|
|
|
+`planner_decision` 通过 Decision 实体表达 accept、block、split 等具体动作,不为每个动作另造事件名。`FileSystemTaskStore` 内的 durable journal 是默认唯一真源;`TraceEventSink` 保留为显式兼容适配器或外部 Sink 示例,不再默认写重复 `orchestration/events.jsonl`。
|
|
|
|
|
|
## 十六、存储、恢复和可观测性
|
|
|
|
|
|
@@ -846,22 +872,23 @@ goal_projection_linked
|
|
|
|
|
|
V1 Ledger 不保存完整 resolved tool policy 快照;可审计的策略快照属于 V2。
|
|
|
|
|
|
-### 16.2 V1 已实现文件存储
|
|
|
+### 16.2 已实现的文件存储
|
|
|
|
|
|
-V1 已定义 TaskStore/ArtifactStore/EventSink 端口,并提供 FileSystemTaskStore、FileSystemArtifactStore 和 TraceEventSink。默认目录为:
|
|
|
+当前已定义 TaskStore/ArtifactStore/EventSink 端口,并提供 FileSystemTaskStore、FileSystemArtifactStore 和可选 TraceEventSink。默认持久目录为:
|
|
|
|
|
|
```text
|
|
|
.trace/{root_trace_id}/orchestration/
|
|
|
├── ledger.json
|
|
|
-├── artifacts/{snapshot_id}.json
|
|
|
-└── events.jsonl
|
|
|
+└── artifacts/{snapshot_id}.json
|
|
|
```
|
|
|
|
|
|
-`ledger.json` 使用临时文件加 `os.replace`、每 root trace 的 `asyncio.Lock` 和 revision 乐观锁。这些保证仅针对单进程 V1。
|
|
|
+durable Event journal 作为 `ledger.json` 内部数据与相同 Ledger revision 原子提交,不需要默认平行 JSONL 文件。`ledger.json` 使用跨进程文件锁、revision CAS、临时文件、`fsync` 和 `os.replace`;Artifact 也有独立文件锁和 first-write-wins 约束。因此该实现支持同一主机的多进程安全读写,但不提供跨机共享语义。
|
|
|
|
|
|
-### 16.3 生产化使用共享存储
|
|
|
+### 16.3 部署边界
|
|
|
|
|
|
-多进程、多实例或跨机器运行时,需要共享持久化能力,否则会出现:
|
|
|
+对于单机、持久磁盘、单活 Host 的长期部署,当前 FileSystemTaskStore/FileSystemArtifactStore 是有效选择,不必为了“生产”标签强制换成数据库。Host 必须保证相同持久目录、备份、权限及单活运行约束。
|
|
|
+
|
|
|
+如果将来要求多主机、水平多实例或远程 Worker,则需要共享持久化、分布式协调和运行时所有权机制,否则会出现:
|
|
|
|
|
|
- 一个实例看不到另一个实例创建的 Task;
|
|
|
- 进程重启后无法恢复运行状态;
|
|
|
@@ -869,7 +896,23 @@ V1 已定义 TaskStore/ArtifactStore/EventSink 端口,并提供 FileSystemTask
|
|
|
- 重复调度同一个 Attempt;
|
|
|
- 多个主 Agent同时接受同一个输出。
|
|
|
|
|
|
-### 16.4 每一步必须可追踪
|
|
|
+### 16.4 原子 Mission 读取和关联 Trace
|
|
|
+
|
|
|
+当前已提供可选 FastAPI V2 适配器和 `OrchestrationClient`,包括:
|
|
|
+
|
|
|
+- `GET /api/v2/capabilities`;
|
|
|
+- `GET /api/v2/roots/{root_trace_id}/snapshot`:单次 `TaskStore.load()` 返回同一 revision 的 Task、Attempt、Validation、Decision 和 Operation;
|
|
|
+- `GET /api/v2/roots/{root_trace_id}/completion`:返回 Root objective、status、blocked reason 和已接受结果摘要;
|
|
|
+- `GET /api/v2/roots/{root_trace_id}/snapshots/{snapshot_id}`:返回 Artifact manifest 的 hash 和引用,不公开重复 `normalized_content`;
|
|
|
+- Task/Attempt/Validation 查询、Operation start/poll/stop/resume 和 cursor Event 读取。
|
|
|
+
|
|
|
+`MissionSnapshotView` 的集合按 `created_at + id` 稳定排序,`AttemptView` 公开 `accepted_child_decision_ids`,`PlannerDecisionView` 提供 Decision 关联。SDK 已提供 `get_mission_snapshot()`、`get_root_completion()`、`get_artifact_snapshot()`、Event watch 和关联 Trace 查询。
|
|
|
+
|
|
|
+通用 TraceStore/API 已支持 `agent_role`、`parent_trace_id`、`root_trace_id`、`task_id`、`attempt_id`、`validation_id` 和 `operation_id` 过滤。文件 TraceStore 在扫描 meta 时先过滤、再排序和应用 `limit`,Trace detail/WebSocket 也通过带过滤条件的 Store 查询获取子 Trace,不先截断一批无关 Trace 再过滤。
|
|
|
+
|
|
|
+该路由是可选适配器:业务 Host 需要对已组装的 Coordinator 调用 `create_orchestration_router()` 并显式 `include_router()`。当前根 `agent/api_server.py` 不会自动挂载 Orchestration V2 路由,Trace API 也需由 Host 保证与 SDK 使用同一服务基址。
|
|
|
+
|
|
|
+### 16.5 每一步必须可追踪
|
|
|
|
|
|
一次完整闭环应能追踪:
|
|
|
|
|
|
@@ -879,14 +922,14 @@ Task
|
|
|
→ Worker Trace
|
|
|
→ Output Snapshot
|
|
|
→ Validation
|
|
|
-→ Validator Trace
|
|
|
+→ Agent mode: Validator Trace / deterministic mode: Validation execution identity
|
|
|
→ Planner Decision
|
|
|
→ 下一 Task 状态
|
|
|
```
|
|
|
|
|
|
## 十七、并行和异步边界
|
|
|
|
|
|
-### 17.1 V1 使用现有同步闭环
|
|
|
+### 17.1 前台闭环和并行边界
|
|
|
|
|
|
同一个 Task 的顺序固定为:
|
|
|
|
|
|
@@ -894,19 +937,22 @@ Task
|
|
|
Worker → Validator → Planner Decision
|
|
|
```
|
|
|
|
|
|
-V1 当前使用 `await` 模式跑完工具内的同步闭环,没有引入分布式队列。
|
|
|
+前台 `dispatch_tasks` 使用 `await` 模式跑完工具内闭环,没有引入分布式队列。
|
|
|
|
|
|
多个互不依赖的 Task 由 Coordinator 使用 Semaphore 并发调用 LocalAgentExecutor,不复用 legacy `agent()` 的多分支聚合语义。Task 预留和执行周期中的分支异常会逐 Task 隔离,其他 Task 继续执行,成功返回时顺序与输入一致。批次级 `dispatch_completed` 幂等缓存写入失败时返回已完成的逐 Task 结果;相同幂等请求重试会复用原 Attempt/Validation 并重新保存整批结果,不重复运行 Agent。
|
|
|
|
|
|
-### 17.2 后续增加后台任务接口
|
|
|
+### 17.2 Background Operation 已实现
|
|
|
+
|
|
|
+当前 `BackgroundOperation` 和 `OperationController` 已提供:
|
|
|
|
|
|
-当主 Agent需要在 Worker 或 Validator 运行期间继续规划其他 Task 时,再提供:
|
|
|
+- start:启动 dispatch 或 revalidate Operation;
|
|
|
+- poll/wait:查询持久状态和结果引用;
|
|
|
+- event:通过 durable Event journal 通知 Operation 状态变化;
|
|
|
+- stop:先持久化 stop intent 和 execution epoch,再通知当前进程的 Agent Task;
|
|
|
+- recover:只把 durable Operation 与丢失的进程内 Task 对齐为 pending/stopped/failed 等安全状态,不调用模型;
|
|
|
+- resume:只接续框架判定为尚未安全启动的 stage,跳过已持久化阶段;已经启动后停止的模型 stage 返回 `resume_not_safe`,交由 Planner retry/replan。
|
|
|
|
|
|
-- start:启动后台 Attempt 或 Validation;
|
|
|
-- poll:查询状态;
|
|
|
-- event:完成后通知主 Agent;
|
|
|
-- stop:停止运行;
|
|
|
-- resume:恢复允许继续的运行。
|
|
|
+Operation 记录、幂等命令和 execution epoch 在 Ledger 中可持久化;`OperationRuntime` 中的 `asyncio.Task` 不可持久化。崩溃恢复不猜测未提交模型调用的外部副作用,也不会在无 Host/Planner 决策时自动重跑模型。
|
|
|
|
|
|
### 17.3 分布式调度放在 V3
|
|
|
|
|
|
@@ -924,9 +970,9 @@ explicit_validation
|
|
|
使用 Task、Attempt、Validation、Decision 的显式完成协议
|
|
|
```
|
|
|
|
|
|
-框架 `RunConfig` 默认仍使用 `legacy_auto`。采用 V1 的新 Host 必须显式选择 planner preset 和 `explicit_validation`,并先调用 `wire_orchestration()`;缺少 Coordinator 时启动失败,不会静默退回 legacy。
|
|
|
+框架 `RunConfig` 默认仍使用 `legacy_auto`。采用 V1 的新 Host 必须显式选择 planner preset 和 `explicit_validation`,并先完成 Coordinator/Executor/Runner 等价装配;标准路径是 `wire_orchestration()`。缺少 Coordinator 时启动失败,不会静默退回 legacy。
|
|
|
|
|
|
-旧 evaluate 暂时保留,新 Validator 使用独立工具名、独立 Trace 类型和独立结构化结果。等旧调用完成迁移后,再决定是否废弃 evaluate。
|
|
|
+旧 evaluate 暂时保留,新 Validator 使用独立工具名和独立结构化结果;Agent mode 使用独立 Trace 类型,deterministic mode 只有 Validation execution identity。等旧调用完成迁移后,再决定是否废弃 evaluate。
|
|
|
|
|
|
## 十九、V1 实际代码落点
|
|
|
|
|
|
@@ -938,7 +984,14 @@ agent/agent/orchestration/
|
|
|
├── protocols.py # TaskStore/ArtifactStore/AgentExecutor/ToolPolicy/EventSink
|
|
|
├── config.py # 并行度、repair 次数和默认 preset
|
|
|
├── state_machine.py # 法定 Task 状态转换
|
|
|
-├── store.py # 文件 Store 和 JSONL EventSink
|
|
|
+├── store.py # 文件 Store、durable journal 和可选 JSONL 兼容 Sink
|
|
|
+├── operations.py # 持久化 Background Operation 状态与恢复控制
|
|
|
+├── runtime.py # 进程内 asyncio Operation 执行注册表
|
|
|
+├── validation_policy.py # ValidationPolicy 和确定性 Validator
|
|
|
+├── evidence.py # EvidenceProvider/EvidencePort 数据合同
|
|
|
+├── api_v2.py # 可选 FastAPI V2 路由
|
|
|
+├── client_v2.py # 异步 Python SDK
|
|
|
+├── wire.py # 严格对外 View/Request 模型
|
|
|
├── policy.py # capability 权限解析
|
|
|
├── executor.py # 本地 Worker/Validator Sub-Trace
|
|
|
├── coordinator.py # 唯一 Ledger 状态写入入口
|
|
|
@@ -974,23 +1027,23 @@ agent/agent/orchestration/
|
|
|
- Worker 不能创建孙 Agent;
|
|
|
- Task、Attempt、Validation、Decision 分离;
|
|
|
- Worker 成功调用 `submit_attempt` 后进入 awaiting_validation;未提交、异常、停止或过期则进入 needs_replan;
|
|
|
-- 独立 Validator Trace;
|
|
|
+- 独立 Validation record;Agent mode 另有独立 Validator Trace,deterministic mode 无模型 Trace;
|
|
|
- 结构化 Validation Report;
|
|
|
- `task_decide` 支持 accept、repair、retry、revise、split、block、unblock、cancel、supersede;
|
|
|
- `validate_attempt` 支持 Validator error/stopped/expired 后对未变 Snapshot 重新评估;
|
|
|
- 父 Task 不自动完成;
|
|
|
- Worker 默认新 Trace;
|
|
|
-- Validator 默认新 Trace;
|
|
|
+- Agent-mode Validator 默认新 Trace;
|
|
|
- Planner、Worker、Validator 工具权限隔离;
|
|
|
- 定义最小 TaskStore Protocol,并提供文件系统默认实现;
|
|
|
- 定义最小 ArtifactStore、AgentExecutor、ToolPolicy 和 EventSink 协议及默认实现;
|
|
|
- 使用不可变 AttemptSubmission manifest Snapshot,外部产物通过 version/digest 保证不可变;
|
|
|
-- 提供单进程幂等键,防止同一请求重复创建 Attempt、Validation 或 Decision;
|
|
|
+- 提供 Ledger 持久化 CommandRecord、请求 fingerprint 和 revision CAS,防止同一请求重复创建 Attempt、Validation、Decision 或 Operation;
|
|
|
- orchestration 内核不再动态 import examples 或业务包;
|
|
|
- `legacy_auto` 与 `explicit_validation` 双模式;
|
|
|
-- 建立 49 个当前回归用例;
|
|
|
+- 建立覆盖 V1 闭环及 V2 第一阶段能力的回归用例;
|
|
|
- 批量 Task 在预留和执行周期内按分支隔离异常,正常返回时顺序与输入一致;批次幂等缓存写入失败时仍返回结果,重试不重复执行 Agent;
|
|
|
-- 明确 V1 限制:仅本地 Sub-Trace、同步工具调用、单进程文件存储、无新 Task HTTP API。
|
|
|
+- 明确 V1 执行边界:仅本地 Sub-Trace,不支持远程 Worker/Validator 或分布式队列。`FileSystemTaskStore` 与 `FileSystemArtifactStore` 已具备同机锁/CAS或 first-write-wins 保护;`FileSystemTraceStore` 不具备同等级的跨进程锁与原子替换保证,因此完整 Agent 运行仍要求 Host 单活。V2 HTTP/SDK 已作为可选 Host 适配器落地。
|
|
|
|
|
|
### 20.2 Framework V2:通用扩展接口与可靠恢复
|
|
|
|
|
|
@@ -1000,17 +1053,21 @@ agent/agent/orchestration/
|
|
|
|
|
|
当前 FileSystemTaskStore 是单机 Host 参考实现,通过文件锁、CAS revision 和原子替换保证同一主机多进程安全;恢复不会猜测已经启动的模型调用是否产生过外部副作用,也不会自动重跑模型,必须由 Host 显式 resume 或由 Planner 重新规划。共享数据库、后台队列、Lease/心跳、多实例协调、多租户和人工复核仍属于后续 V2 适配器或 V3 治理范围。
|
|
|
|
|
|
-包括:
|
|
|
+已落地内容:
|
|
|
|
|
|
-- TaskStore、Artifact、Evidence 和 ToolPolicy 的生产级可插拔实现与业务适配器;
|
|
|
-- Validation Policy;
|
|
|
-- 通用 API 和 Python SDK;
|
|
|
-- 把 V1 本地 EventSink/JSONL 升级为稳定对外事件协议;
|
|
|
-- 跨进程、可持久化的幂等和防重复执行;
|
|
|
-- 超时和重试限制;
|
|
|
-- 进程重启后的状态恢复;
|
|
|
-- start、poll、event、stop、resume;
|
|
|
-- 统一成本、耗时、模型和失败原因统计。
|
|
|
+- 通用 API、严格 wire view 和异步 Python SDK;
|
|
|
+- Mission Snapshot、Root Completion、Artifact detail、Capabilities 和关联 Trace 查询;
|
|
|
+- Event schema v2、稳定 cursor 和 Ledger durable journal;
|
|
|
+- 持久化 CommandRecord、Background Operation、deadline、start/poll/stop/resume 和显式恢复;
|
|
|
+- 冻结 ValidationPlan、ValidationPolicy、确定性 Validator 和受归属/预算约束的 Evidence Port;
|
|
|
+- Attempt/Validation 的模型、Token、成本、耗时和失败分类。
|
|
|
+
|
|
|
+仍需由 Host 完成或后续扩展的内容:
|
|
|
+
|
|
|
+- 显式挂载 V2 路由并与 Trace API 组装为同一服务;
|
|
|
+- 将 ValidationPolicy、DeterministicValidator 和 EvidenceProvider 暴露到便利 wiring,并为 Validator 提供通用 Evidence 工具;
|
|
|
+- 业务适配器、风险分层策略、总预算和完整监控告警;
|
|
|
+- 需要跨机扩展时的共享 Store、队列、Lease 和心跳。
|
|
|
|
|
|
### 20.3 Framework V3:分布式生产治理
|
|
|
|
|
|
@@ -1031,7 +1088,7 @@ agent/agent/orchestration/
|
|
|
- 人工复核扩展点;
|
|
|
- 完整监控和告警。
|
|
|
|
|
|
-## 二十一、V1 验收用例
|
|
|
+## 二十一、当前验收用例
|
|
|
|
|
|
### 21.1 完成语义
|
|
|
|
|
|
@@ -1048,7 +1105,7 @@ agent/agent/orchestration/
|
|
|
- 同一个 Task 换 Worker 后产生新 Attempt;
|
|
|
- 修改目标或验收条件后形成新 Task Version;
|
|
|
- Task 被拆分后,子 Task分别执行和验证;
|
|
|
-- 子 Task全部完成后,父 Task 不自动完成;
|
|
|
+- 直接子 Task 全部 terminal 后,父 Task 不自动完成;
|
|
|
- 被 superseded 的 Task 不能再次 accept。
|
|
|
|
|
|
### 21.3 上下文隔离
|
|
|
@@ -1057,7 +1114,7 @@ agent/agent/orchestration/
|
|
|
- 同 Task、同版本的局部 repair 可以续用 Worker Trace,但必须创建新 Attempt,且只有成功提交才创建新 Snapshot;
|
|
|
- revise、split 和 retry 默认创建新 Trace;
|
|
|
- 改题后继续旧 Trace 必须被拒绝;
|
|
|
-- Validator 每次使用干净 Trace。
|
|
|
+- Agent-mode Validator 每次使用干净 Trace;deterministic mode 不创建模型 Trace。
|
|
|
|
|
|
### 21.4 权限
|
|
|
|
|
|
@@ -1093,6 +1150,21 @@ agent/agent/orchestration/
|
|
|
- 业务存储通过 Protocol 或 Port 注入;
|
|
|
- 框架在没有任何具体业务项目代码时可以独立运行测试。
|
|
|
|
|
|
+### 21.8 Root 和因果绑定
|
|
|
+
|
|
|
+- Root revise 后 `root_objective`、兼容 `mission` 字段和 GoalTree 重建都使用新目标;
|
|
|
+- `accepted_child_decision_ids=None`、空 tuple 和多个子 Decision 都有明确兼容语义;
|
|
|
+- 重复、乱序、跨 Task、非 ACCEPT 和无法闭合到 Attempt/Validation/Snapshot 的绑定必须拒绝;
|
|
|
+- 升级前 RUNNING Attempt 不从当前子任务状态猜测输入。
|
|
|
+
|
|
|
+### 21.9 API、Event 和 Trace
|
|
|
+
|
|
|
+- Mission Snapshot 只加载一次 Ledger,所有集合共享 revision,稳定排序且 wire schema 拒绝多余字段;
|
|
|
+- Root Completion 返回当前 Root objective,Artifact Snapshot 不存在时稳定返回 404;
|
|
|
+- Event v1/v2 混合数据保持 sequence/cursor 连续,无状态变化不追加新事件;
|
|
|
+- `event_sink=None` 时不生成重复 JSONL 镜像,显式 TraceEventSink 失败不回滚 Ledger;
|
|
|
+- Trace 关联过滤在 `limit` 前生效,即使有超过 1000 个无关 Trace 仍能找到目标。
|
|
|
+
|
|
|
## 二十二、主要风险和控制方式
|
|
|
|
|
|
### 22.1 状态模型变复杂
|
|
|
@@ -1101,11 +1173,11 @@ agent/agent/orchestration/
|
|
|
|
|
|
### 22.2 Validator 与 Worker 可能有共同偏差
|
|
|
|
|
|
-当前控制:Validator 使用独立 Trace、固定 Snapshot 和只读工具,框架保留评估历史。独立确定性检查引擎、第二模型和人工复核策略属于 V2/V3。
|
|
|
+当前控制:Agent-mode Validator 使用独立 Trace、固定 Snapshot 和只读工具;deterministic mode 使用独立 Validation record/execution identity;框架保留评估历史,并可通过 ValidationPolicy 选择规则型确定性验证。第二模型和人工复核策略属于 V2/V3 后续治理。
|
|
|
|
|
|
### 22.3 Validator 增加成本和延迟
|
|
|
|
|
|
-当前控制:Host 可通过 validator preset 选择模型、轮次和工具。按风险自动选择规则检查、完整 Validator 或高级复核的 ValidationPolicy 属于 V2。
|
|
|
+当前控制:Host 可通过 validator preset 选择模型、轮次和工具,也可通过 ValidationPolicy 选择 Agent 或确定性验证。自动风险分级、第二模型、人工复核和总成本预算仍属于后续治理。
|
|
|
|
|
|
### 22.4 主 Agent上下文越来越长
|
|
|
|
|
|
@@ -1162,4 +1234,4 @@ Main Agent Planning
|
|
|
→ Replan or Complete
|
|
|
```
|
|
|
|
|
|
-下一阶段不是重做 V1,而是二选一或并行推进:Host 业务接入这个协议,或进入 V2 的公开 API、共享存储、恢复和策略化验证。框架只负责保证通用协议正确;业务项目负责告诉框架“做什么、用什么工具、如何验收、输出保存在哪里”。
|
|
|
+下一阶段不是重做 V1 或重复开发已有 V2 API,而是由 Host 业务接入当前协议,显式组装路由和策略端口,并在确有跨机需求时再演进共享存储和分布式执行。框架只负责保证通用协议正确;业务项目负责告诉框架“做什么、用什么工具、如何验收、输出保存在哪里”。
|