Skip to main content
Flow 是 Huoban 的版式:定义一类 AI 工作应该如何被排版。 它不执行任务,不保存结果,也不要求绑定某个具体 agent 工具。它描述的是工作结构:调用者要提供哪些输入,需要哪些 capability,分成哪些 stage,输入和输出如何传递,哪里需要 checkpoint,默认使用哪些 ProfilePolicy,以及哪些有限生命周期事件需要上报或观察。 本页属于核心概念,解释 Flow 的设计边界和编排模型;字段级定义、必填项和 schema 约束见 Flow 规范

版式不是执行

Flow 描述这类 AI 工作如何排版;Run 才记录一次具体执行。

Capability-first

stage 优先声明需要什么能力,而不是先绑定某个具体 skill。

入口先声明

spec.inputs 定义调用契约;具体值只进入一次 RuninputBindings

Stage 是能力边界

stage 描述 capability、输入、输出和校对边界,不是 shell step。

校对点显式

checkpoints 让高判断力或高风险位置在版式中可见。

生命周期显式

lifecycle 用有限事件声明上报、观察与清理,不把任意 hook 命令塞进版式。

Flow 不是 Run

FlowRun 的边界必须前置理解。 一句话:Flow 定义一类 AI 工作的可复用结构;Run 记录一次具体执行。

Flow 的职责

Flow 应回答的问题是结构问题:
  • 这类工作需要哪些 capability?
  • 每次调用必须或可以提供哪些动态输入?
  • 这些 capability 如何分成 stage?
  • 每个 stage 的输入来自哪里?
  • 每个 stage 预期输出什么 artifact 类型?
  • 哪些位置需要 checkpoint?
  • 默认使用哪些 ProfilePolicy
  • 哪些有限生命周期事件需要 handler,以及它们是 required 还是 bestEffort?
当前 Flow schema 不定义 retry、rollback、pause、abort 这类控制流语义。实现可以在 status 中报告状态或等待 checkpoint,但重试、回退和中止策略不属于 v1alpha1 Flow 的承诺。

Capability-first

Flow 的主路径是 capability-first。stage 应优先声明“需要什么能力”,而不是“必须调用哪个 skill”。
这个 Flow 没有说必须使用哪个具体 agent、skill 或 MCP server。它只声明 sharpen-idea 这个 stage 需要 huoban.dev/designReview 能力。一次具体执行中,Run 再把 role 绑定到可用的 SkillAdapter
这样同一个 Flow 可以在不同工具、团队和执行环境中复用。

Shortcut 语法

v1alpha1 schema 允许 uses 作为兼容 shortcut:
uses 不是推荐主路径。没有 Registry、Adapter 或 Skill metadata 时,工具只能保留这个引用或标记为 unresolved,不能保证自动展开成 capability 与 Run binding。当前 Preflight 允许它用于 dry-run 和诊断;execute mode 必须改用 requires.capability 与锁定的 Run binding,否则产生 LegacyUseNotLocked 推荐主路径仍然是:
这里的 requires 是 Flow 的能力需求:它包含 capability 与可选 role,用于选择实现。它不是 SkillProfileAdapter 上的 requirements[];后者描述实现依赖的文件、程序、MCP 能力、凭据或上下文来源。详见 Requirement

入口契约与内部数据流

Flow.spec.inputs 声明调用入口,不保存某次调用的值:
v1alpha1 支持 filetextobjectartifactRef。具体调用值进入 Run.spec.inputBindings。这对结构解决两个不同问题:Flow 回答“这类工作接受什么”,Run 回答“这一次实际给了什么”。 stage 只能使用两种结构化来源:
flowInput 必须已在 Flow 入口声明;stageOutput 必须来自当前 stage 之前的已声明输出。Preflight 会拒绝未声明入口、不存在的输出和未来 stage 引用。任意字符串表达式不属于 v1alpha1。
动态输入不是 Requirement。输入说明这次处理什么;Requirement 说明目标环境需要具备什么。

Stage 是能力边界

Stage 是 Flow 中最小的能力编排单元。 它不是 task step,也不是 shell step。它应该描述一段 AI 工作需要的 capability、输入、输出和校对边界。
不要把 stage 写成:
命令、CLI 参数、模型调用细节和工具私有字段应该进入 Adapter、导入层或实现私有扩展,不应污染 Flow 的核心对象。

Lifecycle Handler

Flow 可以在有限生命周期事件上声明观察性处理器:
handler 和 stage 一样只声明 capability 与 role;具体 provider 由 Run.spec.bindings.stage-reporter 锁定。bestEffortrequired 是对具备 dispatcher 的实现提出的 delivery 语义;当前 reference CLI 只把前者作为 optional、后者作为 required 参与 Preflight,并不实际投递。 Lifecycle Handler 不是任意 hook:
  • 只能使用 v1alpha1 的有限事件枚举。
  • match 当前只按 stage id 过滤。
  • 同一事件上的多个 handler 不保证顺序。
  • handler 不修改 stage 图、不作业务判断,也不会因自身 invocation 再产生 lifecycle event。
  • 需要严格先后关系的工作必须建模为 stage。
  • run.succeededrun.failedrun.cancelled 只允许 bestEffort;required 收尾使用 run.finalizing
当前 reference implementation 支持 schema、Preflight、explain、事件信封示例和 invocation 状态形状,尚未提供实际 dispatcher。详见 Lifecycle Handler

Checkpoint

Flow 可以声明哪里需要校对,但不保存校对结果。
边界是:
  • Flow.spec.checkpoints 声明校对点。
  • Checkpoint 对象承载一次具体校对请求和决策上下文。
  • Run.status.conditions 记录这次执行是否正在等待 checkpoint。
  • Artifact 保存供审查的材料、输出正文或决策记录内容;审批状态和继续/停止决策应进入 Checkpoint / Run 状态。
常见 checkpoint 触发原因包括高风险副作用、方向尚未确认、Profile 冲突、外部 Adapter 未被信任,或某个 stage 的输出需要人工判断。

Artifact

Flow 可以声明预期输出,不直接承载产物内容。
边界是: Flow 声明 stage 预期输出;Artifact 记录一次执行实际产生的产物引用和审查状态。

Profile 与 Policy

Flow 可以声明默认 ProfilePolicy
这些是 Flow 的默认引用,不是一次执行的最终事实。Run 声明本次执行使用的 profileRefs / policyRefs。v1alpha1 snapshot 记录 flowSpecHashprofileRefHashpolicyRefHashbindingHashinputBindingHash;ref hash 只覆盖引用列表,不等于被引用对象完整内容的快照。 这对应活字印刷术里的关系:同一版式可以换墨,也可以按不同印坊规矩印刷。

Context engineering 与 loop engineering

用当前行业语言描述,Huoban 处理的是 context engineering、skill reuse 和 agent loop standardization 的交叉问题。 但 Huoban 不把这些概念堆进一个大对象里: 当前 v1alpha1 的 Flow schema 没有定义完整 loop DSL。Flow 是描述 agent loop 结构的基础对象,不是任意循环控制语言;Lifecycle Handler 也不是隐藏的控制流通道。

参考 Flow

idea-to-spec-review 是 Huoban 的首个参考 Flow。 它验证的不是“Huoban 能跑任意工作流”,而是一个更基础的标准化路径:静态 Flow 可以声明动态文件入口,现有 AI 能力可以被标准化成 Skill / Adapter,带着 Profile 排成 Flow,通过 Checkpoint 暴露判断边界,并在 Run / Artifact 中留下可审查记录。 示例:idea-to-spec-review 开始阅读完整对象链路。