Run 是 Huoban 的一次锁版印刷:它锁定某次计划使用的 Flow、动态输入、Profile、Policy 和实现 binding,并承载工具观察到的状态。Run 可以表示 explain、dryRun 或 execute 计划;当前仓库不提供 execute runtime。
设计背景见 Run 模型,Preflight 状态见 Preflight。
Spec 字段
这五个名称是当前 schema 的完整 snapshot 字段集,并统一使用
sha256:<64 位小写十六进制>。
Huoban canonical JSON v1 的算法固定为:递归按 UTF-16 code unit 升序排列对象 key,保持数组顺序,使用 ECMAScript JSON.stringify 语义序列化,再对 UTF-8 bytes 做 SHA-256。不同实现必须使用相同算法;不能直接哈希 YAML、未排序 JSON 或平台相关文本。
Input binding
每个spec.inputBindings.<name> 必须匹配 Flow 的同名入口与类型:
Run schema 只验证 binding 形状。
print 负责验证 Flow 契约并物化绑定;Preflight 负责验证 required、未知、类型、内容引用与 hash。
Implementation binding
每个spec.bindings.<role> 的主目标必须且只能选择一种:
主目标或 fallback 同时写两类 ref 会因
oneOf 失败。fallback 只存在于 Run binding;Adapter schema 没有 spec.fallback。
Status 字段
Run 在通用 status 之外增加:status.phase、status.observedGeneration 和 status.conditions 来自通用状态。除 lifecycle invocation 的 phase 外,schema 不为 Run phase 定义枚举。
合法示例
examples/runs/idea-to-spec-review-run.yaml。
当前 CLI 行为
生成 dry-run
--input 可重复,格式为 name=file:path|text:value|object:json|artifactRef:name[@generation]#sha256:digest。当前 parser 还支持可重复的 --profile <name> 与 --policy <name>。--fallback 只有在同一 role 已有 --bind 时才合法。
生成器将 Flow spec、Profile refs、Policy refs、implementation bindings 和 input bindings 分别锁定到五个 snapshot 字段。文件 binding 自身使用 raw-byte SHA-256。输出 phase 为 Planned,conditions 包含 RunPlanned=True 和 FlowSnapshotCreated=True。此命令只生成计划。
Preflight
Preflight 会解析flowRef 及 generation,将 Flow 默认 Profile/Policy refs 与 Run refs 按名称合并,并检查 role binding、capability、fallback 和可达依赖。fallback 是锁入 Run 的执行候选:它与主 binding 使用相同 requiredness,必须能力匹配并通过同一次 Preflight;reference CLI 不提供自动切换 runtime。
Preflight 的 snapshotHash 与五个 spec.snapshot.* 字段不同:它直接哈希完整 Run.spec。详见 Preflight。
mode: execute 只有在 Run scope 的 required resolution/readiness 都为 True 时才通过当前 Preflight gate,并产生 PreflightReady=True。stage scope 的 StagePreflightReady=True 不能授权整次 Run。
验证边界
validate检查 binding 的严格二选一,但不解析目标对象或 capability。- Preflight 解析当前实现收集的 refs 与 bindings,但不执行 Flow、Policy 或 Checkpoint。
- Run-scope 与 stage-scope Preflight 都会按当前解析结果重算并比对五个
spec.snapshot.*字段;缺失或不匹配会产生 requiredFalse。 - Preflight 检查 input binding 的声明、必填性、类型和本地可取得内容;URL 等不可取得 Artifact 内容保持
Unknown。 - 报告的
snapshotHash另行哈希完整Run.spec,用于把证据绑定到本次 Run 声明。 - Profile/Policy refs 在当前 Preflight 中按名称覆盖 Flow 默认引用;这不是通用 Profile merge DSL。
status.artifacts只检查引用形状;当前 Preflight 不验证它们与 stage 的归属关系。PreflightReady=True不是 Policy 或 Trust 授权。
相邻概念边界
常见错误
- 使用不存在的
profileSpecHash、skillBindingHash或其他 snapshot 字段,或漏掉inputBindingHash。 - 在同一 binding 同时写
skillRef与adapterRef。 - 把 fallback 写进 Adapter,而不是 Run binding。
- 写入 Flow 未声明的 input binding,或只记录文件 path 而不记录 hash。
- 认为 dry-run 已经执行 stage 或做过 Preflight。
- 用 stage scope 结果满足 execute 的 Run scope 门槛。
- 把
status.artifacts当作产物正文容器。