Frontend console
One frontend: apps/console/ — the operator / production surface. It is hand-coded React (Vite +
TypeScript), contract-aligned to vela/contracts.py, RBAC-gated, wired to the live API, and tested
with vitest + Playwright. There is no separate demo app.
Information architecture — the Casefile
A persistent app shell (top bar + left nav) hosts URL-addressable surfaces via HashRouter (which
keeps it static-host / air-gap safe — no server rewrites). Everything reaches data through a single
VelaProvider.
| Route | Surface |
|---|---|
/cases |
Home — KPI strip, a proactive Watchlist hero, case lanes, subsystem/confidence mix |
/investigations |
The investigations table |
/watchlist |
Proactive watchlist — ranked triage queue, per-subsystem rollup, suppression visible |
/approvals |
The approval queue (release gate) |
/launch |
Launch an investigation on a scenario |
/ingest |
Telemetry ingest — XTCE dictionary preview + CCSDS Space Packet decode |
/integrations |
The connector inventory (every source/store/identity/export, read-only) |
/system, /management |
Deployment posture, benchmarks, directory & SSO, plan & usage |
/settings |
Connection + data-source settings |
/cases/:id/{verdict,evidence,procedure} |
The case workspace — split surfaces + a persistent release gate |
/about, /legal/* |
Company + the mandatory legal/compliance pages |
The case workspace
A case splits into three surfaces around a persistent Release Gate:
- Verdict — the severity hero, ranked hypotheses, cited rule-outs, onboard corroboration, knowledge gaps, precedents, and Ask this case (a citation-gated Q&A over the grounded record).
- Evidence — real replay telemetry with limit bands, out-of-limit points, and telecommand marks; the reasoning-pipeline DAG; the forensic audit replay.
- Procedure — the drafted recovery, each step cited or flagged
UNGROUNDED.
The Release Gate is the safety primitive: release is un-armable while any integrity gate fails, and releasing is the single mutating action — it releases the draft to operators, it never commands the spacecraft.
Contracts, mirrored by hand
apps/console/src/api/types.ts mirrors vela/contracts.py. apps/console/src/api/client.ts is the
typed HTTP client; apps/console/src/data/fixtures.ts is a deterministic offline demo client that
seeds varied cases and decodes real uploads in-browser (XTCE and CCSDS) — no fabricated previews.
Design system
A dark mission-control aesthetic: a space-ink ground (#06090f), one restrained telemetry-signal
teal accent (var(--console-accent)), and a severity ramp (var(--color-sev-*)) mapped to
Severity. Mono for labels/codes, self-hosted fonts (airgap-safe — no font CDN). Shared primitives
(Panel, Spinner, Badge, LoadingCard) live in components/ui.tsx.
Commands
cd apps/console && npm cinpm run dev | build | lint | test # lint = eslint + tsc --noEmit; test = vitest runnpx vitest run src/api/client.test.tsThe console is eval-gated by its own tests, not line-gated — see the app’s test suite for the release-gate, readiness, and ingest coverage.
