The durable runtime
Supernova buys infrastructure for solved distributed-systems problems and builds the rules that make the platform itself distinctive.
| Substrate | Responsibility |
|---|---|
| Kafka | Durable events, correlation trail, and pub/sub |
| Temporal | Multi-step execution that survives process failure |
| Postgres | Authoritative relational state |
| OpenTelemetry + Prometheus + Grafana | Telemetry, field evidence, and alerting |
| Rust | Typed system logic, clients, services, and the sun command surface |
The stack is self-hosted on owned infrastructure. “Local” means control of the machine and software stack without per-run billing; it does not require every service to run on the same physical box. Model providers are the deliberate remote, metered exception.
One event language
Every significant event uses a fixed four-part topic grammar and a mandatory envelope. The envelope separates a unique message identity from the causal correlation identity, records the initiating principal where one exists, and carries severity and time.
Delivery is at least once. Consumers are required to be idempotent rather than relying on an “exactly once” story that breaks at system boundaries.
State and events cannot silently diverge
For load-bearing database transitions, the state change and its event enter a transactional outbox together. A relay publishes the event to Kafka and retries safely after broker recovery. Advisory or reconstructible notifications may publish directly and reconcile from their owner.
The dividing question is practical: if this event disappears, can the system become permanently wrong? If yes, it belongs in the transaction.
The bus is also the trail
Actions, results, failures, approvals, evidence, and operational signals all ride the same correlated event substrate. Audit history is not reconstructed later from unrelated text logs. Monitoring reads the trail as a lens; it does not create a competing source of event truth.
Reactors connect facts to typed actions
The bus includes a small dispatch layer. A reactor binds fixed trigger topics and a side-effect-free predicate to a closed catalog of typed actions: start or signal a workflow, wake an agent, update an owned field, call a client library, or request an external link action.
Arbitrary callbacks are not accepted. Domain policy remains in the system that owns the action. The reactor only performs the declared handoff.
Park instead of blindly retrying
Temporal owns durable execution. Supernova classifies failures before deciding what “retry” means:
- Transient dependency failure: park at zero compute and resume on a recovery signal.
- Deterministic product failure: preserve the full context, surface a finding, and wait for investigation or changed inputs.
- Permission denial: take the designed denial branch; do not relabel it as an outage.
- Severe failure: roll back where policy allows and alert through an independent path.
This keeps retries from becoming an infinite loop that repeats a broken assumption.
The broker cannot report its own death
The platform permits one explicit exception to “everything rides the bus”: an out-of-band broker and monitor watchdog. When the normal event path is unavailable, the watchdog can still report failure. On recovery it emits the event that wakes parked work.
What is working now
The Rust bus, envelope, registry, outboxes, reactor, Kafka integration, Temporal SDK exercises, owned Compose stack, and multiple producer/consumer paths have real tests and working slices. Some local file-backed interim paths and mirrored control surfaces are still being replaced by their final Postgres, Kafka, Temporal, and provider-backed forms. See project state.