The mark
nika: <name>, the first line of every workflow. The key nika declares
“this is a Nika document”, the value is the workflow’s own kebab-case
identifier — there is no version to pin and no separate schema: or
apiVersion: field (the engine’s internal canonical URI stays
https://nika.sh/spec/v1 for RDF / conformance tooling, but the author
never types a URL). A tasks: key makes the document a workflow; the
project file nika.yaml (no tasks:) names the project
(nika: my-project), not a schema tag.
Point your editor
Add the LSP modeline at the top of any.nika so your editor’s YAML
language server consumes the JSON Schema directly:
the modeline · paste at the top of any workflow
Local validation
Versioning policy
- The envelope carries no version marker — the mark is the name.
- Minor additions (a new optional field, a new builtin) are additive.
- A grammar change before 1.0 ships with its migration (
nika check --fix) and a refusal that names the move (the pre-1.0 stability contract); after engine 1.0.0 the grammar is additive only. - Anti-pattern:
nika: v1+workflow: { id }— the previous envelope (through 0.108);nika check --fixmoves the id ontonika:.