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, plus session and deadline_at when the execution
has them. execution.started also carries parent_execution_id when the
execution continues an earlier one in its session.
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, and the
policy_hash of the bundle that decided, a SHA-256 of its YAML). 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}.
Resource events
Resource payloads carrykey.
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.