Run events

GET /v1/runs/{runID}/events, client.runs.events(), and helmr run events expose finite pages ordered by an opaque cursor. The public SDK record is:

interface RunEventRecord {
  id: string
  runId: string
  attemptNumber?: number
  category: string
  severity: "debug" | "info" | "warn" | "error"
  source: string
  kind: string
  message: string
  attributes: JsonValue
  occurredAt: string
  at: string
}

The REST wire uses snake case (run_id, attempt_number, occurred_at). Its page shape is { "events": [...], "next_cursor"?: string }. An event that is not tied to an execution attempt may omit attempt_number.

Only these event-kind identifiers are exported as checked-in terminal contracts:

Kind Terminal Run status
run.completed succeeded
run.failed failed or system_failed, according to the Run resource
run.cancelled cancelled
run.expired expired

Other category, source, and kind strings are observational values, not a closed public enum. Use the Run resource as status and output authority; do not infer a complete lifecycle from event names.