Skip to main content
Every state change in the kernel produces an immutable event. The event log is the system of record. Executions, steps, and approvals are projections of it.

Event structure

  • event_seq is 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 carries step_id and step_type (tool_call, llm_call, or local), so any event is self-describing in isolation.

Execution events

The execution.* types cover the lifecycle of the run itself. Payloads carry execution_id and status.

Step events

The step.* 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

The approval.* types cover the lifecycle of each human-in-the-loop approval. Payloads carry approval_id, step_id, execution_id, and status.

Dispatch events

The dispatch.* 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.