docker reads, one local model, one kept artifact.
The whole workflow
Checked clean againstnika 0.97.0 (nika check exit 0 Β· permits
declared Β· 0 hints):
Why the exec tasks are arrays
Writecommand: "docker ps | grep Up" and nika check refuses to bless
the boundary:
permits.exec: ["docker"] is a boundary the checker
can actually prove. Transforms that would have lived in | grep | awk
belong in output: bindings and nika:jq instead.
What the audit says before a token is spent
- The two
dockerreads run in parallel (wave 1) β the scheduler proved it fromdepends_on, nobody ordered it. - The cost line practices the honesty rule: a local model is unpriced compute, not Β« free Β» β the report says FLOOR and names why, it never rounds unknown to $0.
Run it
infer is the model, not the engine):
docker-health.md now holds the modelβs prose, and the run left a
hash-chained journal you can prove later:
When the daemon is down
The failure is part of the design. With Docker stopped, the same run fails honestly and early β the model is never called, nothing is spent, and the card hands over:Take it further
- Gate an action on the report β add an
agent:task allowed onlynika:done, or awhen:gate on a structureddiagnoseoutput, and the workflow can act on unhealthy containers, still inside the declared boundary. See patterns. - Schedule it β the file is the artifact: cron or CI runs
nika runand every execution leaves a verifiable trace. - Structured instead of prose β give
diagnoseaschema:and the report becomes typed data downstream tasks can branch on. See testing for pinning it with a golden.
The two
exec tasks carry the repoβs exec ledger (the header
comment): every surviving exec: names why no builtin or MCP tool
covers it yet, and what would remove it. When a Docker MCP server enters
your stack, invoke: replaces both reads and the ledger empties β
that is the native-first law working as intended.