Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

The supporting cast

Supernova’s headline machinery — the delivery loop, the bus, the agents — only survives because ten quieter systems notice failures, restart services, guard the repo, and keep hostile email from becoming shell commands. Each gets a paragraph here, led by its most opinionated design choice — with one build-state note up front: every system below is at least [built in-repo] (real Rust with code and tests in the workspace), and at best [engineered, not deployed] where an opt-in end-to-end proof runs against a checked-in Docker Compose stack. None is a standing service.

monitor — the loop must close

The predecessor platform had Prometheus and Grafana already [live in automatt] — “barely used,” because nothing consumed the alerts. The rebuild refuses that fate: systems emit to Kafka, an OTel collector feeds Prometheus and Grafana, and alerts flow back onto the bus, where a listener agent named Sentinel consumes and acts — “it’s whole circle of life” (Matt). Sentinel is an agent, not a subsystem (Matt’s ruling, 2026-06-10) — it investigates and escalates but cannot file issues, which is reserved for a judgment principal. Sentinel can’t report its own death over the bus it watches, so an out-of-band watchdog and a synthetic-canary loop are first-class requirements. Audits split (D7, 2026-06-18) into fast mechanical checks that write artifacts and a small agent-led pass that reads them and applies judgment — deliberately not automatt’s expensive swarm of eight ephemeral agents each re-reading the repo. The full stack runs today only as an opt-in test: post an OTLP metric through the collector, watch a real metric-backed Grafana alert land on the monitor bus [engineered, not deployed].

test — heavy E2E on hardware you own

Test earned system status by weight — “if it’s heavy enough to worry about RAM, it’s heavy enough to be its own system” — and by the owned-infrastructure definition of “local” that excludes every hosted, metered CI product: no GitHub runners, no per-run billing. A run stands up a full real stack (Kafka, Temporal, Postgres, mocked externals) once per batch, not per case, because concurrent spin-ups stress a 64GB box; isolation is absolute between batches. The sharpest choice is a deletion — smoke testing, removed from the lifecycle entirely (delivery tells that story); field truth now comes only from monitor’s passive Prometheus assertions. A ~95% coverage gate applies to the batch’s changed code, and a failed run carries the implicated wires so the issue system boots them back to in-progress [built in-repo]; remote offload to the owned Proxmox server is explicitly future work [supernova design].

review — stamps that die when the code changes

Review is “the enforcement MECHANISM, not the rule-store”: each system’s own invariants list is what gets checked against a touching patch, so declaring an invariant is registering it. Merging takes two stamps — primary and architecture/safety, either order — keyed to the reviewed content hash: a post-stamp change silently drops the stamp, so nothing merges stale (a fix for a real automatt bug). A third review type gates feature closure: an independent agent — neither implementer nor closer — confirms real usage at least twice, “separation-of-duties applied to closure, the same way the double-stamp applies it to merge.” Stamps live as fields on the issue record, written in the same transaction — no separate review store — and bypass exists only as a recorded approval-flow elevation, never a silent override [built in-repo].

ops — the motor neurons

Ops is where “restart” lives (Matt, 2026-06-04: “where else does ‘restart’ go? restart, update, status”): start, stop, and upgrade the owned fleet — Kafka, Temporal, Postgres, Prometheus, Grafana, the agent runtime — all Docker Compose and systemd on owned machines, explicitly not cloud IaC. The boundary with monitor is anatomical: “monitor = sensory (afferent)… ops = motor (efferent)” — monitor detects, a bus reactor fires, ops restarts. Ops also holds the sole sanctioned exception to everything-rides-the-bus: a bus-independent Kafka broker health probe, because you cannot ask a dead bus whether the bus is dead. Resource governance is deliberately soft (D6): no hard caps, pressure answered by “reclamation of rebuildable state, not enforced ceilings.” Container bring-up is real today — a primary container plus per-project swarms, source mounted read-only — and a checked-in inventory reports all nineteen systems production-ready only when every service has been started by hand; the default fails closed [engineered, not deployed].

ingest — hostile by default

Ingest’s premise: external input is “hostile by default until a transport-verified sender says otherwise.” Trust tiers derive from the authenticated sender, never the source channel, and taint propagates — a policy can never auto-approve unknown-external input above minimal risk. The most opinionated stage is the capability-stripped reader: classification runs under a permission profile denying network, tools, and external sends, so prompt injection is contained because the reader can do nothing even if the content tells it to. What escapes is a typed, versioned Recommendation record — “the SCHEMA is the security boundary” — then two human gates: intent (“act on this at all?”) and quality (“execute THIS exact produced thing?”). “A denial at either gate is not a failure — it is a designed branch”: gate-two denials park a Temporal workflow that resumes when a revised artifact arrives. The operator path, with a live authenticated Discord-webhook-to-issue proof, works today [engineered, not deployed].

chat — internal only, on purpose

Chat owns channels, DMs, threads, and identity-bound delivery, and does nothing external — all outward transport belongs to the link system. Discord is a link adapter, not a chat backend: inbound messages are re-emitted and restructured into internal chat semantics rather than mirrored 1:1, because third-party message shapes don’t map onto chat’s channel/thread/identity model. Interruption is structural, not textual: an urgency ladder (D55) runs from idle-read to between-turn steering to permission-gated interrupt to compact-then-context-switch, with defaults low and the old !!! bang-markers removed as a cross-system syntax (2026-06-22) — surviving only as a Discord-inbound convention parsed onto the ladder. One invariant exists purely because of an automatt incident — a self-message can never reach interrupt level — and channel-post authority is capability-group membership, “never a hardcoded agent name” [built in-repo].

vcs — git with numbered laws

Vcs “carries the platform’s most dangerous failure modes” — orphan worktrees, half-rebases, a crash in the window between rebase and merge — so its entire reason to exist is a set of numbered, citable invariants review can block on: never cherry-pick, ff-only merges to shared branches, never reset --hard on dev/main, never stash, atomic worktree create/teardown, and a two-step ship (rebase then ff-merge) that is “crash-window-atomic and re-runnable.” The distinctive gate (D58): merge-to-main carries an approval decision on top of the capability check — “the cap-group decides who may drive the merge; the approval decision decides whether this specific merge proceeds” — while ordinary worktree commits stay ungated. A live agent can drive the full ship today: approved record, real rebase, real fast-forward, provenance events replayed to the owned broker [engineered, not deployed].

config — one file, guarded by the OS

Matt’s founding spec (2026-06-04): “GIANT YAML FILE! cli to manage it… each system gets its own top level.” One config.yaml replaces the predecessor’s scatter of env files and per-tool configs, with per-project overlays cascading over global defaults (D51/D62). The unusual choice is who guards writes: an OS-level file permission on the whole file, never a runtime permission call — “config never calls permission, which dissolves the config-permission bootstrap deadlock” (D62). CLI and library are dumb writers that never emit; a single inotify watcher is the sole event emitter (D31), diffing against last-known-good and publishing section-update events that trigger hot reloads. There is no outbox and no audit table: “the file is the durable record” — hand-editing is allowed-but-discouraged, and the watcher keeps last-known-good and screams. Watcher service, schema validation, and rollback run today; the OS/container write gate still awaits proof from a real running container [engineered, not deployed].

auth — one identity object, no vault

Auth is who you are; permission is what you may do — a boundary defended by mirror invariants (“auth MUST NOT make authz decisions; permission MUST NOT own credential material”). Auth is the sole owner of the canonical Principal contract (D4): every other system stores only a principal_id reference, closing the seam where agent, chat, and approval each half-owned an identity. Its contrarian call is the secrets substrate: not HashiCorp Vault (“too heavy for a single owned box”), not AWS Secrets Manager (off-owned-infra) — a sops/age-style encrypted-local file store instead. An AES-GCM store with no-plaintext-at-rest evidence exists today [engineered, not deployed]; the credential-lifecycle contract for external integrations (D49) is [supernova design].

core — the substrate with self-respect

Core is a different kind of system: horizontal, owning framework concerns and never a vertical domain’s rules. It exists because scattered utilities kept accumulating occupants — in Nova’s words, “‘util’ is junk-drawer name; ‘core’ is the same stuff with self-respect” — and it is pointedly not named sun, because “a system named after the CLI that hosts every system’s CLI is circular.” It owns CLI dispatch, system scaffolding with 5-part-shape validation, the stateless client library every surface shares, and the config schema registry (D63). A validator binds contract to implementation: core must implement exactly each system’s declared interface — no orphan commands, no undocumented commands. The frontend is ruled a renderer, not a system (2026-06-20): “CLI = text layer; UI = rendering layer; both stateless, neither owns state,” each view owned by its host system. Framework, dispatch, and scaffolding validation are [built in-repo]; the web renderer is [supernova design] — no shipped UI.

What this costs

Ten systems means ten boundary disputes — monitor-vs-ops (“monitor aggregates, ops probes”), chat-vs-link, auth-vs-permission — each split buying clean invariants at the price of seams that reactors must bridge and reviewers must know. Some of the sharpest choices are admissions of past failure: smoke testing wasn’t refined, it was deleted (D68) after causing real bugs; the audit swarm was replaced, not optimized; Grafana Alloy and bang-markers were superseded; a refactor system was removed outright. And the gap is uniform: the readiness dashboard itself says “the remaining gap is not missing proof machinery; it is production/live-substrate readiness,” and flags that status words “can still conflate” specced, implemented, in-repo-proven, and live — the exact masquerade this page’s tags exist to prevent. Nothing here runs as a standing service: the evidence is real; the deployment is not yet.