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:
POST /v1/workflows— registering a workflow.PATCH /v1/workflows/{slug}with aspec— minting a new version.POST /v1/projects(and the runtime'spipeline_start_projecttool) — 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
toolstable. - 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 resolvedtools,skills, andtools_exclusivecopied from the workflow at expansion.
Next
- Workflows — where bindings are declared.
- API → Tools and API → Skills — the registries bindings resolve against.