Skip to main content
Every error Nika emits is a typed structure with a stable code, a category, and a transient flag the retry machinery reads. The format is NIKA-<NAMESPACE>-<NNN>. An optional sub-namespace self-documents builtin errors (NIKA-BUILTIN-WAIT-001). The full grammar:
Canonical source: spec/05-errors.md owns the taxonomy: engines derive from it, never the reverse. The machine-readable registry lives in the spec’s canon.yaml and is also served as JSON at nika.sh/errors/catalog.json. The tables below are generated from that registry.

The error shape

transient: true means a retry might succeed. retry: only fires on transient errors (unless on_codes: widens it). on_error: catches the final error either way, and on_error.on_codes routes recovery by exact code.

Categories

The registered codes (v0.1 normative floor)

A conformant engine emits exactly these codes for these failures. Engines may add codes within a namespace’s 001-099 range. Never repurpose one.

Retired codes (never reuse)

Two allocation holes in the table above are deliberate — a retired code is never repurposed:
  • NIKA-PARSE-016 — the jq-binding-contains-template class folded into NIKA-VAR-005.
  • NIKA-DAG-003 — « a tasks.X reference with no declared edge » became inexpressible in W2 « the flow »: the with: binding IS the edge (derived, never restated), and a reference outside the boundary is NIKA-VAR-021.

Namespaces

Builtin errors use a per-builtin sub-namespace: each builtin owns its own 001-099 (NIKA-BUILTIN-FETCH-001 is the fetch tool’s network/extraction failure). Underscore-named builtins encode naturally: NIKA-BUILTIN-JSON_MERGE_PATCH-001.

Routing on codes

on_error.skip preserves the original error at tasks.X.error: a downstream task can branch on ${{ tasks.X.error.code }} while the status reads skipped.

The full error model

Retry policies, backoff strategies, recovery semantics, and the gate-based failure propagation rules. See spec/05-errors.md.