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 fromnika 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