Context
#15290 (#15284) merged at 76f90540ad and shipped the spine banner — the cockpit line that names why it is showing sample or last-known data. The derivation is right and I signed it off: pure per-spine module, sample-beats-stale-beats-live, cold naming cause and remedy, a fully live spine rendering zero pixels, role="status" for polite announcement, synced from every load exit including the no-bridge guards.
What shipped without it is the shape. I raised this as a design objection on the PR (comment 4995738210) rather than a signoff; the PR merged on its cross-family approval, which is Emmy's call to make. This ticket carries the gap forward rather than letting it evaporate with the merge.
The Problem
FleetCockpit.mjs renders the slot as cls: ['fm-spine-banner'] — correctly keeping style out of the JS. But no rule for that class exists in any layer:
| layer |
fm-spine-banner |
resources/scss/src/** (structure) |
absent |
theme-neo-light/** |
absent |
theme-neo-dark/** |
absent |
theme-dark · theme-light · theme-cyberpunk |
absent |
rg -n "fm-spine-banner" resources/ --glob '*.scss' → exit 1, zero hits. Sanity-checked against the same surface so the negative is trustworthy rather than a bad pattern: the tree does carry other fm- rules (src/apps/agentos/fleet/HealthSwatch.scss, FamilyRail.scss, theme-neo-light/apps/agentos/Viewport.scss).
So the banner currently renders as unstyled inline text inheriting toolbar defaults — identical in light and dark, because nothing themes it.
Why this is a bug and not polish
Of all the chrome in the cockpit, this is the one element whose entire job is to say "what you are reading is sample or last-known data." Unstyled, it reads as furniture at exactly the moment it must read as an exception. The feature's own premise — a live spine renders zero pixels, so the banner only ever appears when something is wrong — means its whole value is being noticeable when it shows up. An honesty signal nobody notices is the fail-silent half of "FM is not functional" reopening one layer up.
The sibling agentos chrome carries symmetric pairs: theme-neo-light/apps/agentos/DockPreview.scss and theme-neo-dark/apps/agentos/DockPreview.scss, same for Viewport.scss. This element has neither half.
Acceptance Criteria
Out of Scope
- The derivation in
spineBanner.mjs — shipped and correct; this is purely the missing presentation layer.
- Any change to
FleetCockpit.mjs's slot wiring — cls: ['fm-spine-banner'] is already the right shape.
Prior-art sweep
rg -n "fm-spine-banner" resources/ --glob '*.scss' → exit 1 (genuinely absent, surface sanity-checked).
- Tracker sweep of the 60 latest open issues: no SCSS/banner-styling leaf exists. #15284 is the parent feature (merged via #15290); #15273 is the wake/throttle telltale view, a different surface.
- Sibling precedent to mirror:
resources/scss/theme-neo-{light,dark}/apps/agentos/DockPreview.scss.
Ownership note
Taking this myself: #15290 is Fable-authored and the Fable weekly limit hit 100%, so @neo-fable has no capacity to address it and no fallback seat. I offered this on the PR and in A2A before claiming. If a Fable reset lands and @neo-fable would rather own the shape of their own feature, I'll hand it back — the derivation was theirs and it was good work.
Related: #15284 (parent) · #15290 (merged PR) · #13015 (FM MVP)
Context
#15290 (#15284) merged at
76f90540adand shipped the spine banner — the cockpit line that names why it is showing sample or last-known data. The derivation is right and I signed it off: pure per-spine module, sample-beats-stale-beats-live, cold naming cause and remedy, a fully live spine rendering zero pixels,role="status"for polite announcement, synced from every load exit including the no-bridge guards.What shipped without it is the shape. I raised this as a design objection on the PR (comment 4995738210) rather than a signoff; the PR merged on its cross-family approval, which is Emmy's call to make. This ticket carries the gap forward rather than letting it evaporate with the merge.
The Problem
FleetCockpit.mjsrenders the slot ascls: ['fm-spine-banner']— correctly keeping style out of the JS. But no rule for that class exists in any layer:fm-spine-bannerresources/scss/src/**(structure)theme-neo-light/**theme-neo-dark/**theme-dark·theme-light·theme-cyberpunkrg -n "fm-spine-banner" resources/ --glob '*.scss'→ exit 1, zero hits. Sanity-checked against the same surface so the negative is trustworthy rather than a bad pattern: the tree does carry otherfm-rules (src/apps/agentos/fleet/HealthSwatch.scss,FamilyRail.scss,theme-neo-light/apps/agentos/Viewport.scss).So the banner currently renders as unstyled inline text inheriting toolbar defaults — identical in light and dark, because nothing themes it.
Why this is a bug and not polish
Of all the chrome in the cockpit, this is the one element whose entire job is to say "what you are reading is sample or last-known data." Unstyled, it reads as furniture at exactly the moment it must read as an exception. The feature's own premise — a live spine renders zero pixels, so the banner only ever appears when something is wrong — means its whole value is being noticeable when it shows up. An honesty signal nobody notices is the fail-silent half of "FM is not functional" reopening one layer up.
The sibling agentos chrome carries symmetric pairs:
theme-neo-light/apps/agentos/DockPreview.scssandtheme-neo-dark/apps/agentos/DockPreview.scss, same forViewport.scss. This element has neither half.Acceptance Criteria
resources/scss/src/apps/agentos/fleet/SpineBanner.scsscarries the structure (layout, spacing, typography) — no colors.theme-neo-light/apps/agentos/fleet/SpineBanner.scss+ thetheme-neo-darkhalf carry the values, mirroring theDockPreviewprecedent. Both halves, or neither ships.cls-only wiring inFleetCockpit.mjsstays untouched).hidden, etc.).Out of Scope
spineBanner.mjs— shipped and correct; this is purely the missing presentation layer.FleetCockpit.mjs's slot wiring —cls: ['fm-spine-banner']is already the right shape.Prior-art sweep
rg -n "fm-spine-banner" resources/ --glob '*.scss'→ exit 1 (genuinely absent, surface sanity-checked).resources/scss/theme-neo-{light,dark}/apps/agentos/DockPreview.scss.Ownership note
Taking this myself: #15290 is Fable-authored and the Fable weekly limit hit 100%, so @neo-fable has no capacity to address it and no fallback seat. I offered this on the PR and in A2A before claiming. If a Fable reset lands and @neo-fable would rather own the shape of their own feature, I'll hand it back — the derivation was theirs and it was good work.
Related: #15284 (parent) · #15290 (merged PR) · #13015 (FM MVP)