Event structure
event_seqis monotonic per execution. It gives total order within one execution, not across executions.- Events are append-only. Paging is by
after_seq. - Every
step.*payload carriesstep_idandstep_type(tool_call,llm_call, orlocal), so any event is self-describing in isolation.
Execution events
Theexecution.* types cover the lifecycle of the run itself. Payloads carry
execution_id and status.
Step events
Thestep.* types cover the lifecycle of each effect, whether a tool call, an
LLM call, or a local step.
Payloads stay lean. They identify the step (
step_id, step_type, and target
where it is known) and carry decision context (rule_id, error). Results are
not in the payload. The result of a tool call, and the request and response bodies
of an llm_call, live on the step itself, so fetch them with
GET /v0/executions/{id}/steps/{step_id}.
Approval events
Theapproval.* types cover the lifecycle of each human-in-the-loop approval.
Payloads carry approval_id, step_id, execution_id, and status.
Dispatch events
Thedispatch.* types cover webhook delivery. Payloads carry dispatch_id,
execution_id, status, and attempt, which counts the times the kernel has
claimed this dispatch and handed the execution to an agent. It is 0 until the
first claim.