# ADR-0013: Chrome status surfaces derive from /api/system-status; fixture literals forbidden

**Status:** Accepted (P4 of console-v2-fix-build, 2026-05-04).

## Context

Every always-visible chrome surface (Titlebar, StatusBar, StatusPopover,
BottomBay live-pulse, ArtifactStage breadcrumb) shipped with hardcoded
fixture strings: `connected` regardless of SSE state, `127.0.0.1:8431`
regardless of host, `38ms p50` regardless of latency, `$23.84` regardless
of spend, `b5 — Reading the letter` regardless of focus. The reconnect
button had no `onClick`. Cluster 2 of the console-v2-audit identified this
as the canonical Law-4 failure mode: green pill on disconnect.

The Phase 4 spec was explicit that chrome is wired through props from App;
Phases 5-11 fill the breadcrumb from focused. The build executed Phase 4
with placeholder strings expecting later phases to drive them. No phase
was ever scoped to do the wiring.

## Decision

Stand up `GET /api/system-status` returning host, api_version, uptime,
worker counts (synthesized=true today), spend (synthesized=true today),
and `fallback_counts` (a dict of every fallback name with count > 0).
Frontend `useSystemStatus` hook polls every 5s; combined with
`useEventStream` connection status it produces a `connection: "connected"
| "degraded" | "disconnected"` value that drives every chrome status pill.

Breadcrumbs derive from App.tsx's `focused` state via a `useBreadcrumb`
hook. Empty focus produces `"no project selected"` (NOT `"— focus —"`).
ArtifactStage's Tartarus fixture title is deleted entirely.

Stub data carries `*_synthesized: true` flags so the chrome can de-emphasize
worker counts and spend until the underlying source exists.

Reconnect button gets a real onClick wired to `useEventStream`'s
`reconnect()` method.

## Consequences

Disconnect-but-green-pill failure mode (the audit's most-cited Law-4
violation) is closed. The chrome reflects truth. Cost: a 5s polling
interval (cheap) and one new endpoint with a simple Pydantic model
(codegen propagates to TS). When real worker counts and spend land
(CP-N+), the `*_synthesized` flags flip to false and the chrome stops
de-emphasizing those values.

Forbidden going forward: any fixture literal in shell/* components.
Reviewers grep `--pass` / `--fail` / hardcoded $ amounts in chrome PRs
and block.

Cross-references: ADR-0011 (the synthesis fallbacks whose counters
surface here); ADR-0012 (the Python registry whose `_COUNTERS` dict
this endpoint reads).
