the language
prompt
the model job, in words: interpolate ${{ }} references, never paste secrets. One of 59 words the served contract declares, projected from workflow.schema.json, the same file your editor validates against.
- 2surfacesinfer · agent
- 2required ininfer · agent
- stringtypethe declared shape
- 10skeletonscarry this key
the contract
2 declarationsDescriptions 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.
- infer*
stringthe model job, in words: interpolate ${{ }} references, never paste secretsinside infer:- agent*
stringthe model job, in words: interpolate ${{ }} references, never paste secretsinside agent:
in a real file
from the chain skeletonchain.nika.yaml
think: with: gather: ${{ tasks.gather.output }} infer: max_tokens: 800 # SLOT: the spend ceiling · sized for the SEAT, not the answer # The marker below is a VALUE, not a comment. The parser drops # comments, so a `# SLOT:` line could never make `check` refuse — # which is how an unfilled scaffold ran green and left a file that # read like a result (#1066). Replace the line, keep the binding. prompt: | <SLOT: what should the model do with the gathered text?> ${{ with.gather }}a verbatim slice, real line numbers from chain.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
defined by
the block it lives in
infer: inside infer:
agent: inside agent:
The whole grammar in one place: the four verbs · the standard library · the spec. Try it in the playground. Read the reference →