AGPL-3.0-or-later · forever.

the security boundary

Boundary.

The file declares its blast radius: permits: allowlists what runs, reads, writes and calls; absent means the engine floor, present means default-deny. Secrets stay masked references with scoped egress, and the SSRF floor never turns off. Machines read the exact shape at /schema/workflow.json; nika check --infer-permits writes the tightest boundary a file can prove.

Defined by spec/01 · the envelope

  • 4permit familiesexec · fs · net · tools
  • 3secret sourcesvault · env · file
  • 7named refusalsthe NIKA-SEC register
  • always-onthe floornever negotiates

The permit families

4 families

Two laws, the whole model: absent, the engine floor applies · present, the boundary is default-deny and the body must fit it. nika check --infer-permits writes the tightest boundary the file can prove.

  • execwhich commands may run · false kills the family
  • fsread and write globs · the walk root is gated
  • nethttp allowlist · the SSRF floor stays on regardless
  • toolswhich nika tools the file may invoke
permits · the exact shapesource
permits:  exec: ["echo"]  tools: ["nika:assert", "nika:prompt", "nika:notify"]  net: { http: ["hooks.slack.com"] }

The secret sources

3 sources

A secret is a masked reference, never a literal: it resolves from vault, env or file at run time and stays masked in every log and every trace the run leaves behind.

  • vaultthe OS keychain backend · the default posture
  • envread from the environment at run time
  • fileread from a path the boundary allows
a secret · masked, egress-scopedsource
secrets:  webhook:    source: env    key: TEAM_WEBHOOK_URL    egress:      - to: "nika:notify"        host_from_self: true

The always-on floor

never off

Some refusals never negotiate: link-local and metadata endpoints are refused even when net.http allows a host pattern · secret values stay masked in every log and trace a run leaves · an exec allowlist matches argv soundly, never a substring. The floor is the part of the boundary you cannot turn off.

The written law

8 numbered laws

Every rule of the boundary is a numbered proposal (NEP) in the spec’s public governance: written, reviewable, versioned before it binds the engine. The register below states each law’s substance; the number links its full text.

  • NEP-0002private data + untrusted input + egress: a human gate
  • NEP-0003an absent permits: block declares zero authority
  • NEP-0004untrusted values re-gate under permits, at the effect
  • NEP-0005a child’s environment is composed, never inherited
  • NEP-0006a fetch of a code-bearing artifact is never innocent
  • NEP-0007the trace carries a permit witness · check and run agree
  • NEP-0008the egress proxy is the permit’s exact projection
  • NEP-0009a path grant names a path identity, re-judged at dispatch

Permits are checked before anything runs, and the floor keeps refusing while it does: every refusal lands in the error register with a stable code. Break a boundary in the playground, or install and let nika check --infer-permits write yours. Read the spec →