Pre-alpha 文档
组合可恢复子图与有界循环。
通过显式返回端口、隔离的节点身份、可恢复的循环和派发前上限检查,复用共享状态子图。
从可执行注册表示例开始
示例构建审核子图、最多三轮的上限、明确的成功与耗尽出口、Schema、Reducer,以及八个 可执行节点绑定。示例不调用数据库或模型服务。实际执行使用 DurableAgentLoop 与 PostgreSQL;数据库测试独立验证恢复。
cargo run -p stateknot-runtime --example durable_graph_composition --locked
初始状态使用 {"count":0}。下方片段依赖
完整示例
中的父图和子图定义,请先阅读完整代码。
let call = GraphSubgraphCall::bounded_loop(
NodeId::new("review")?,
SharedStateSubgraph::new(body)?,
NodeId::new("again")?,
3,
)?;
let composition = GraphComposition::compile(parent, [call])?; 明确返回与耗尽路径
无环模板中的纯 Terminal 节点是符号返回端口,不执行代码。父图调用位置为每个端口 声明一条对应路线。工作节点通过强类型 State Update 传递结果,不能产生随后被丢弃的 子图 Terminal Output。
选择 again 进入下一轮;最后一轮则执行必需的父图耗尽出口。 其他端口提前退出。GraphSubgraphCall::once 只执行一份子图。 多个调用位置复用同一模板时,父图 Route ID 必须全局唯一,使用
with_return_routes 显式绑定。
状态在每个 Barrier 后可见。子图 Wait 暂停整个所在 Run;等待解除并持久化后,从映射后的后继继续。 父子图共享精确的 Input/State/Update/Output Schema 和 Reducer 引用。 原有 BSP 排序及 Ready Set 去重规则继续适用,不新增异步跨步 Join。
保留真实的持久执行身份
只注册 composition.graph()。通过 node_source(node_id)
选择源执行角色,但绑定组合后的图引用和生成节点 ID。局部决策通过
source.route_id(&local_route_id) 解析路线。Reducer 同样收到组合后
的节点 ID,其逻辑应与角色名无关,或显式使用不可变 Source Map。
向可恢复调用代码原样传递实际 GraphNodeContext,不要伪造子
Checkpoint 或替换 Activation。SHA-256
作用域身份固定父图/模板版本、调用位置、轮次、上限和返回
绑定;规范序号保留同一实例内的源排序。在途运行排空前,必须保留旧可执行版本。
在派发前执行上限检查
完整展开最多 1,024 个可执行节点、二 MiB 规范定义,并遵守既有路线与 Ready Set 上限。 分配前计算所有循环副本。模板必须无环并符合自身步数上限;父图并行上限不能高于任何 模板的上限。超限不会退回无界执行。
全局 maximum_supersteps 预算在新节点 Start 前生效,重启后位于上限时
也适用。只有可信累计用量可用时,Lifecycle 才记录
runtime.graph.superstep_limit_reached。证据缺失不能变成猜测的零用量。 已提交的失败 Handoff 可以安全重试。
无需修改 Checkpoint Wire,也没有新的数据库 Migration。PostgreSQL 测试覆盖 Pending Result 复用、提前返回、耗尽、孤立 Attempt 接管、版本漂移拒绝与 Wait/Resume。 阅读完整契约与升级指南, 或继续查看可恢复 Runtime 指南。