AGPL-3.0-or-later · forever.

operations · live

Keep the project clock resident.

Run nika serve on a container, VM or bare server so due arm entries fire through the released engine and its normal proof path.

nika serve is the stable resident firer, not an HTTP API. It watches nika.yaml, computes due beats, calls the one firer and leaves every decision in project state.

Separate calendar preview from a real fire.

--dry says which beats are calendar-due and changes nothing. --once performs one sweep and exits. A real long-lived invocation waits on the wall clock until the next due slot.

nika serve --dry
nika serve --once
nika serve

Keep the last valid registry alive.

The resident loop watches nika.yaml. A valid edit replaces the registry. A broken edit is reported and the last valid registry remains active while the next tick retries the file.

nika.yaml mtime changes
        │
        ├── valid ── swap registry ── continue
        └── refused ─ report fault ── keep last good

Stop cleanly and read the ledger.

Ctrl-C and SIGTERM stop the resident loop at its signal boundaries. Each beat result travels in the stdout line and .nika/arm ledger. A completed once sweep exits clean even when an individual run failed or paused, so operations must read both channels.

  • stdout is one decision line per beat.
  • history.ndjson carries claims, skips and receipts.
  • the run trace carries workflow events and its exit contract.

Design effects for at-least-once delivery.

A crash after the durable claim but before its receipt leaves an unmatched claim. The engine never calls that exactly-once. Make external effects idempotent when a repeated fire must be harmless.

claim appended ── run starts ── receipt appended
       │                 │
       └── crash here ───┴── visible orphan, never silent certainty