the language
after
The CONTROL boundary · {producer-task: predicate}. Each entry is one control edge (spec/03-dag.md §after). State, never data — observe outcomes through with:. One of 59 words the served contract declares, projected from workflow.schema.json, the same file your editor validates against.
- 1surfacetask
- optionaleverywherea choice, never a miss
- objecttypethe declared shape
- 2skeletonscarry this key
the contract
1 declarationDescriptions are the schema's own; the deeper invariants (value languages and regexes) ride the same projection. A miss is a nika check finding before anything runs.
- task
objectThe CONTROL boundary · {producer-task: predicate}. Each entry is one control edge (spec/03-dag.md §after). State, never data — observe outcomes through with:.one step of the plan
in a real file
from the etl-state skeleton delta: with: # the bindings ARE the edges · previous + fresh → delta previous: ${{ tasks.previous.output }} fresh: ${{ tasks.fresh.output }} invoke: tool: "nika:json_diff" # RFC 6902 · empty patch = nothing new args: before: "${{ with.previous }}" after: "${{ with.fresh }}"a verbatim slice, real line numbers from etl-state.nika.yaml, conformance-gated upstream on every spec push. open the full skeleton →
cross-references
skeletons that carry it
the check gates that name it
from the blog
defined by
the block it lives in
The whole grammar in one place: the four verbs · the standard library · the spec. Try it in the playground. Read the reference →