research
docs://contents>
docs/step-typesdoc 08

Step Types

The action_type determines how a step executes and what the engine guarantees for it. The engine pipeline is uniform across types; the types diverge at the executor.

At a glance

Action type Executes Parks on human Output Ledger events
HUMAN Nothing — parks before planning Yes, by definition Intake artifact hitl_escalation, hitl_park
REASONING Planner produces structured output Only via Hitl block Planner output artifact step_start, step_complete
EXECUTION Tool call in the MCP sandbox On policy DENY Tool output artifact policy_eval, tool_call, step_complete
SUB_SOP Nested workflow Inherits the child's gates Child terminal artifacts Full child event trail

HUMAN

The engine parks before planning and waits for explicit intake. The intake schema is declared in metadata; the resume signal provides the data. The response is consumed exactly once and triggers a fresh planning iteration with the intake injected into context. There is no path around the gate: downstream steps see the dependency unsatisfied until the gate resolves.

REASONING

The planner produces the step's structured output proposal against the output contract implied by step_description and metadata limits. The proposal is not workflow state until verification passes. Iterations within an attempt are bounded; a failed verdict's critique feeds the next iteration. A REASONING step never touches an external system — side effects belong to EXECUTION.

EXECUTION

The only action class with external side effects, and the most gated:

Gate Order On failure
Tool-input schema validation Before execution Failure — no call is made
Cedar policy evaluation Before execution DENY halts the step and parks the workflow
Sandbox provisioning At execution Provisioning failure is retryable within budget
Output schema validation Before commit Deviation is failure — never best-effort pass-through

The side-effect class recorded for the step determines whether the step is compensatable.

SUB_SOP

The step invokes another SOP as a nested sub-workflow. The child is isolated: own identity, own checkpoint trail, own budget envelope. The parent consumes only the child's terminal artifacts, made available to downstream steps by hydration. A failed child is retried by bounded regeneration — never by re-running the child in place.

Failure handling by type

Type Terminal failure mode Recovery path
HUMAN Intake rejected by schema Re-prompt within escalation budget, then park
REASONING Iterations exhausted without a passing verdict Escalation ladder, then park
EXECUTION Policy DENY, schema deviation, sandbox failure beyond budget DENY parks; structural failures route to Saga compensations
SUB_SOP Child fails terminally or circuit breaker trips Regeneration up to cap, then parent-side escalation, then park