Step bindings

Every agent step in a workflow declares which capabilities it runs with, per step — not per agent, not globally. Two lists and a flag on each step:

Field What it does
tools Tool slugs the step's agent may/should use.
skills Loadable skill slugs whose full bodies are injected into the step's brief.
tools_exclusive When true, the agent gets only the listed tools for the duration of the dispatch — no baseline toolset.

Bindings make pipeline behaviour reproducible: the step's capability surface is part of the immutable workflow version, so a phase re-run months later dispatches with the same tools and the same injected skills.

The ≥1 rule

Every kind: agent step must declare at least one tool or skill binding — unconditionally. A workflow with a bindings-less agent step is rejected at write time. Steps of kind: action and kind: gate are exempt (actions already bind execution via their action_slug; gates execute no agent).

Resolution checks

Bindings are validated before any row is created, at three choke points:

  1. POST /v1/workflows — registering a workflow.
  2. PATCH /v1/workflows/{slug} with a spec — minting a new version.
  3. POST /v1/projects (and the runtime's pipeline_start_project tool) — expanding a workflow into a project.

Each declared slug must actually resolve:

  • Tools must exist in the runtime's tool registry (built-ins and DB-loaded custom tools) or the tools table.
  • Skills must resolve to a loadable, active skill node in the graph memory store.

Failures come back as a single 400 with every unresolvable binding listed:

400 template has unresolvable step bindings:
phase 'research' subtask 'gather': kind=agent step declares no `tools` or `skills` binding — every agent step needs at least one;
phase 'render' subtask 'export': unknown tool 'ffmpeg-v2'

This means a typo'd tool slug fails the workflow write (or project create) immediately — not the third phase of a two-hour pipeline.

Where bindings surface

  • Template detail page (Dashboard → Templates → slug) lists each step's tools and skills.
  • Subtask rows (GET …/subtasks) carry the resolved tools, skills, and tools_exclusive copied from the workflow at expansion.

Next