AGPL-3.0-or-later · forever.

the language

invoke

Use a tool. Fetch a page, write a file, call GitHub. Every tool explicit. One of the four verbs. A verb is a distinct native execution model, and every task speaks exactly one.

its lane28 nika: builtins + mcp:<server>/<tool>; everything callable is a tool

  • 3block keysthe contract
  • 0requiredall optional
  • 6check gatestyped findings
  • 10skeletonsspeak this verb

the shape

a complete workflow

Schema-valid whole: this exact text passes nika check (the on-page YAML gate re-validates it on every test run).

use-a-tool.nika.yaml
nika: v1workflow:  id: use-a-tooltasks:  page:    invoke:      tool: "nika:fetch"      args: { url: "https://nika.sh" }

inside invoke:

3 keys · 0 required

The block's vocabulary comes from the served contract itself (workflow.schema.json). Each key opens its register row.

args
objectArguments passed to the tool · an object whose shape is the TOOL's own schema, not the language's. Each builtin and each MCP tool declares its own (spec/02-verbs.md §invoke) · `${{ }}` may appear in any leaf value.
tool
stringTool reference · nika:<path> (closed v0.1 builtin set) OR mcp:<server>/<tool> (requires the slash). The namespace set is CLOSED at v1 (spec/02-verbs.md) — an x-<vendor>: prefix is RESERVED, not valid (engine-specific tools route through mcp: · spec/06-stdlib-contract.md §Namespace ownership).
workflow
stringCompose another workflow (spec 14) · a STATIC target: a filesystem path OR registry:owner/name@version (pinned). A templated target is refused at check (NIKA-COMP-001). Exactly one of tool: | workflow: (the invoke tagged union · G21).

The verbs are locked forever: four, never five (fetch is a builtin, not a verb; ordering is the DAG's job, not a word's). The grammar lives in spec 02 · verbs; every other key is in the keyword register. Read the spec →