Skip to main content
This page exists because a word you cannot define is a wall. Each entry is one sentence and a pointer to the page that owns the idea β€” the definition lives there, this is only the door.

The file

Envelope β€” the top-level keys a workflow file may carry, and only those: nika Β· model Β· inputs Β· const Β· secrets Β· permits Β· run Β· tasks Β· outputs. Nine keys, closed. Anything else is refused by name. β†’ Workflows nika: β€” the first line of every Nika file. The key says this is a Nika file; the value is the file’s name, kebab-case. It is not a version, and there is no nika: v2. β†’ YAML syntax Workflow vs project file β€” a document with a tasks: key is a workflow; a document without one is a project file (nika.yaml, which carries settings like a spend ceiling). The rule is the presence of tasks:, never the filename β€” so it still holds for a file pasted into a chat or piped on stdin, where the .nika.yaml suffix is gone. β†’ YAML syntax Task β€” one named unit of work, declaring exactly one of the four verbs (infer Β· exec Β· invoke Β· agent). β†’ Verbs

The graph

DAG β€” directed acyclic graph: the shape your tasks form once their dependencies are drawn. Acyclic means no task may wait, however indirectly, on itself. β†’ Workflows Wave β€” a scheduling layer. Every task whose dependencies are already satisfied runs in the same wave, in parallel. nika check prints the wave plan before anything runs, so 3 waves Β· 5 tasks means five tasks arranged into three rounds. β†’ Workflows with: and after: β€” the two edge kinds. with: is a data edge (a task reads another’s output); after: is a control edge (a task waits, without reading). β†’ Bindings unwind β€” a cleanup edge. A task on an unwind edge runs whatever happened upstream, success or failure, so teardown is an ordinary task the graph can see rather than a special block hidden from it. β†’ Workflows

The expressions

CEL β€” Common Expression Language, the small expression language ${{ … }} speaks, and the language of a when: condition. It is not a template engine and not shell: it evaluates an expression and gives back a value. β†’ Bindings jq β€” the query language used to pull a field out of a result or reshape one, in outputs: and in extraction. Same jq as the command-line tool. β†’ Bindings

Safety and cost

permits: β€” the declared boundary of what a run may touch: which paths it may read or write, which hosts it may reach, whether it may execute. An absent permits: block is zero authority, never a default allowance. β†’ Security Blast radius β€” everything a run could touch if it went wrong, read off the declared permits: before the run starts rather than discovered after. β†’ Security Lethal trifecta β€” three grants that are each ordinary alone and dangerous together: access to private data, an untrusted input, and a way out to the network. When a workflow has all three and the untrusted content can actually reach the way out, nika check refuses it (NIKA-SEC-009) unless a human gate stands in the path. β†’ Security mock/echo β€” the test model. It needs no provider, no API key and no network, and it costs nothing, so a workflow can be rehearsed end to end before any real model is named. β†’ Providers

Records and process

Trace β€” the record a run leaves: one NDJSON file (one JSON object per line) holding what ran, in what order, and at what cost, hash-chained so a later edit is visible. β†’ Traces Hint β€” advisory output from nika check, named like native-first/002. A hint never fails your check on its own; --native-strict is the flag that promotes the native-first family to a failure. β†’ Machine surfaces NEP β€” Nika Enhancement Proposal, the numbered process by which the language changes. A NEP-00NN reference in output points at the proposal that introduced the rule you just met.

Coming from somewhere else

If your reflexes are GitHub Actions or Kubernetes, the mapping is short: β†’ How Nika compares