Pre-alpha 文档
执行一个可恢复 Agent 的调度单元。
绑定 Graph Driver、原子 Lifecycle Coordination、可信 Evidence 与 Tenant-scoped Scheduling,同时保持 Fencing 与 Lost-ACK Recovery。
组装一份不可变 Worker Deployment
Claim 工作前必须安装 Driver、Lifecycle、Cancellation 三份标准审计 Schema
与全部应用绑定。DurableTenantScheduler 会在内部构造 DurableAgentLoop,因此 Driver 与 Lifecycle Coordination 一定共享同一个 Store 和冻结的
Executable Registry。
let mut schemas = JsonSchemaRegistryBuilder::with_default_limits();
register_standard_graph_driver_event_schema(&mut schemas)?;
register_standard_graph_lifecycle_event_schema(&mut schemas)?;
register_standard_agent_cancellation_event_schema(&mut schemas)?;
register_application_schemas(&mut schemas)?;
let mut executables = ExecutableGraphRegistryBuilder::new(schemas.build()?);
register_release_graphs_reducers_and_nodes(&mut executables)?;
let scheduler = DurableTenantScheduler::new(
store,
executables.build()?,
Arc::new(application_lifecycle_evidence),
DurableGraphDriverOptions::default(),
DurableGraphLifecycleOptions::default(),
DurableTenantSchedulerOptions::default(),
)?;
Lifecycle 审计 Schema 发布在https://stknot.com/schemas/runtime/graph-lifecycle-event/1.0.0。必须通过 Runtime Helper 注册,不能手工写死 Digest。
Cancellation Confirmation 还需要位于https://stknot.com/schemas/runtime/agent-cancellation-event/1.0.0 的 Public-safe Schema;缺失时 Lifecycle Startup 会 Fail Closed。
恢复可信 Evidence,禁止虚构
成功 Terminal Barrier 不拥有已 Admission 的 Agent
Descriptor、Request、Resolved Budget、最终 Artifact 与累计 Usage。GraphLifecycleEvidenceProvider 必须通过有界、确定性、只读调用恢复这些已经持久化的事实;不能重复 Model/Tool
工作、推测 Request 或用零替代缺失 Usage。
Lifecycle Coordinator 会离线验证 Input/Output Schema,构造最终 Agent Result,再检查 Provenance、Request、Descriptor、Budget、Artifact 与 Usage。Evidence Error 会释放精确 Fence,或让它进入可回收状态,而不会部分 Finalize Run。
把每条生命周期边作为一个原子单元提交
-
Wait
Node 返回完整且不含 Registration Timestamp 的
NodeWaits。同一 Transaction 提交 Journal Event、消费 Result、写 Successor Checkpoint、使用数据库时间注册 Interrupt/Timer、转为 Waiting 并释放 Lease。 -
成功 Terminal
可信 Evidence 与 Schema 校验先完成,再由一个 Transaction 保存 Terminal Checkpoint 与 Agent Result、推进 Run 状态并清除所有权。
-
Blocked Failure
Same-fence In-flight 工作先释放所有权,交给 Higher-fence Crash Recovery。只有不含 In-flight 工作的 Plan 才能进入 Terminal Failure Supervision。
-
已确认 Cancellation
Driver 停止新 Dispatch 并返回精确 Cancellation Handoff。Lifecycle 重建累计 Usage,再用数据库时间原子确认 Cancellation;Evidence 不可用时,Run 保持 Cancellation-requested。
Driver 为每个 Handoff 只分配一次稳定 Lifecycle Event Identity。Success、Failure 或 Cancellation 的 Lost-ACK Retry 只接受同一 Event、Revision 加一、预期 Terminal Status 与已清除 Lease 的快照,并直接恢复已提交 Result/Failure/Cancellation Usage,不再次读取外部 Evidence;其他 Terminal 变化一律按 Stale Fail Closed。
Wait 使用 Event-first Replay:Provider 会验证原始 Event、Projection、Checkpoint、 Result Consumption 与不可变 Registration。因此即使 Resolver、Timer 或 Cancellation 已推进 Run,精确 Retry 仍可返回原 Idempotent Commit,且不会回滚后续状态。
保持 Tenant Scheduling 有界
一次 Tick 按 Durable Queue Order 扫描固定 Cutoff Keyset Page,为每个 Candidate 分配 稳定 Claim Attempt ID,把普通竞争视为 Skip,并且最多执行一个 Run。Page、Decoded Candidate、Contention 与 Retry 均有上限和 Report。
-
Executed - 一个 Run 已被 Claim,并通过有界 Agent Loop 到达 Waiting、Succeeded、Failed、RecoveryReleased、Deferred、Yielded 或 Cancelled。
-
ExecutionFailed - 发生 Run-local Driver 或 Lifecycle Error;系统已尝试清理精确 Fence,Worker 仍可执行后续 Tick。
-
Idle - 完整固定 Cutoff Tenant Snapshot 中不存在可 Claim 的 Run。
-
ScanLimitReached - 配置的 Page Ceiling 在 Stable Snapshot 结束前终止本次 Tick;应调度下一次有界 Tick,而不是静默扩大内存。
-
Cancelled - 进程拥有的单调 Shutdown Signal 在 Claim 前生效。
在 Global Fairness 下保持 Tenant Isolation
当前 Worker 仍刻意保持 Tenant-scoped。通过DurableFairScheduler 包装后获得 Replica-global Smooth Weighted Selection 与精确 Reservation-count
Starvation Bound。数据库凭据必须保持 Tenant-scoped;不能通过扩大 Worker Queue
Visibility 伪造 Fairness。
让 Worker 独立于 HTTP 接入运行
AgentWorkerBinding::tenant 与 AgentWorkerBinding::fair
独占一个具体调度器。AgentWorker::start 校验实际数据库 Schema、
冻结注册表和已持久化的公平策略,并通过强制提供的
AgentWorkerReadiness 检查真实宿主依赖。固定槽位限制并发, 证据过期或检查失败则暂停新
Tick;周期检查不会重叠。HTTP 提交不会自动启动 Worker。
默认 4 个槽位,单次 Tick 期限 5 分钟,优雅排空期限 30 秒。
worker.begin_shutdown() 关闭接纳;
worker.shutdown().await 回收 Tick 及内部 Graph 节点 Future, 优雅期限耗尽后强制中止并等待退出。取消
worker.wait()
不会丢失任务所有权。Drop 只能发起回收,不让出执行权的回调仍须由操作系统管理器设置强杀期限。
停机不是持久 Run 取消,也不代表事务回滚。
worker.health() 提供不含请求内容的本地状态与计数,不是匿名入口或持久计费。
Timer、Deadline、子 Run 和失败收敛维护任务仍须独立运行。PostgreSQL 16/17 测试覆盖
故障恢复、固定并发、停机回收、新进程不重复节点的终态重放,以及公平调度序号连续性。
参阅组装与运维指南
和Draft RFC-0013。 这不等于完整多角色生产部署验证或稳定版本发布。
独立管理维护任务
AgentMaintenanceBinding::new 绑定 1–128 个明确授权且不重复的租户、
实际 Store 和四份冻结的审计 Schema。AgentMaintenance::start 强制要求
AgentMaintenanceReadiness。单个有界循环依次驱动截止时间取消、
子 Run 取消传播与结算、Join 发布、失败收敛,不在维护角色内执行模型或工具。
每个租户和任务独立保留游标,单条失败后继续扫描,整页坏数据不会堵住尾部。 扫描耗尽或新进程启动后重访失败工作;多个副本依赖既有事务和幂等机制。 默认正常间隔 250 ms、条目错误后 1 s、单 Tick 时限 30 s、排空时限 10 s。 就绪证据过期暂停新任务;候选发现错误、Panic 和 Tick 超时会停止并排空。
role.health() 只提供脱敏计数:Ready 不表示条目全部成功, 即使依赖就绪,条目错误增加也应告警。role.shutdown().await
等待内部任务退出;强制取消不代表事务回滚。Drop 仅发起清理,不关闭共享连接池,
不自动启动历史数据删除或 Timer 业务策略。
阅读维护角色运维指南 与 Draft RFC-0014。 PostgreSQL 16/17 验证覆盖真实持久化效果、失败页续扫和 SIGKILL 恢复。 完整多角色部署及容量实测仍单独验收,API 仍为 Pre-alpha。
验证证据
CI 在 PostgreSQL 16 与 17 上分别运行 Runtime 和 Provider 资格测试。 Runtime 覆盖 Lifecycle 原子性与精确 Lost-ACK Replay、数据库时间 Wait Materialization、Agent Loop 成功与 Evidence Failure、Tenant 与加权 Cross-tenant Scheduling、可恢复 Model/Tool Attempt 与 Streaming、Provider-native 多轮 Recovery、Noninitial Replay、Lease Renewal、 重复抑制、Quarantine、Higher-fence Takeover、精确 Cancellation 与持久化 Run/Result Read。部署该 Pre-alpha Surface 前请阅读完整集成与运维契约。
原子 Admission、公开 Run/Result Read 与 Provider-native Lifecycle Evidence 已实现。 真实 Price Table 与可信 Artifact Evidence 仍由嵌入应用拥有;Runtime 只重校验已提交 事实,不会推测缺失 Evidence。