Skip to main content

The questions everyone asks

Yes. Install the latest tagged release with Homebrew or install.sh, then run nika check and nika run locally. The engine is still pre-1.0 and hardening toward the 1.0 launch, but the nika: v1 language envelope is already stable.
Two independent axes. The language envelope nika: v1 is frozen forever — files you write never break. The engine follows real semver toward 1.0 (0.90 release-candidate today, then 1.0.0, 1.1, …). Same model as SQL or GraphQL: the contract is stable, implementations iterate.
No — there are exactly verbs (infer · exec · invoke · agent), locked forever. Fetching a URL is calling a tool: invoke: { tool: "nika:fetch" }. If you see fetch: as a verb anywhere, it’s the pre-spec legacy dialect.
local runtimes (Ollama · LM Studio · llama.cpp · LocalAI · vLLM). Point model: ollama/llama3.1 at your machine and the whole workflow runs with zero cloud. mock/echo runs with nothing at all — that’s what the templates default to.
Always ${{ … }} — what’s inside is CEL. The bare {{ … }} form is legacy and rejected by the validator. Same rule: there are no template filters (| upper, | truncate) — transforms are jq, in output: bindings or nika:jq.
Schema-valid ≠ spec-valid. The validator also enforces the semantic rules: every ${{ tasks.X }} reference needs depends_on: [X], when: must be a CEL boolean, nika:done only inside an agent’s tool list, exactly one verb per task. The error names the exact rule — fix that rule, nothing else, re-check.

Errors you’ll hit, decoded

Every failure is a typed structure with a stable code and a transient flag (error model). The frequent ones:
SymptomCode familyWhat it means · what to do
« parse error » on a file that looks fineNIKA-PARSEUsually the envelope: nika: v1 exactly (not v1.0 · not 1), workflow: kebab-case, tasks: present.
task referenced but never ranNIKA-DAGA ${{ tasks.X }} without depends_on: [X] — every data edge must be a graph edge.
« unknown binding »NIKA-VARFive namespaces only (vars · with · tasks · env · secrets) — typos like tsaks. are caught at validation.
provider call fails once then worksNIKA-PROVIDER (transient: true)The engine retries with backoff per your retry: — declare it instead of wrapping logic.
fetch refuses a URLNIKA-SECSSRF defense: private networks and cloud metadata are blocked by default (security model).
command blocked in execNIKA-SEC-001Shell-mode blocklist hit — pass tainted data via stdin:/args:, never interpolated into command:.
agent never finishesNIKA-AGENTBudgets are mandatory leashes: max_turns + max_tokens_total, and the loop ends with nika:done.

When it breaks, in order

1

Read the code, not the message

NIKA-<NAMESPACE>-<NNN> is stable and greppable — the catalog gives the namespace’s contract.
2

Check transient

transient: true → retry can help (declare retry: with backoff). transient: false → the input or the file is wrong; retrying burns money.
3

Recover structurally

on_error: recover: substitutes a fallback value · on_error: on_codes: scopes recovery to specific codes (recover the not-found, still fail loudly on permission-denied).
4

Ask with context

GitHub issues with the code + the task id + the minimal YAML. Security findings: security@supernovae.studio, never public issues.

See also

Error codes

The namespaces + the typed error shape.

Templates

Skeletons that avoid most of these errors by construction.

Security model

Why fetch/exec block what they block.

Live engine state

What’s admitted today (/ crates).