Context
W2 operable-cold UI leaf under #14560, the Fleet Manager cockpit design epic. The Brain-side fleet service spine and bridge remain under #13015; this ticket renders the truth those surfaces expose.
PR #15290's cycle-1 review falsified the original ongoing-liveness premise: loadRoster / loadActivity run at construction (plus roster refreshes after successful lifecycle intents), and failure exits preserve last-known owner state. This ticket is therefore narrowed to the honest initial-cold slice. The required live→loss→recovery owner, retained reason, timer lifecycle, and Neural Link journey move non-optionally to #15293.
The Problem
On a fresh cockpit boot without a reachable fleet transport, the roster and activity surfaces correctly retain their sample data, but the shell does not explain why. The operator sees sample residents and unavailable controls without a cause or an operable remedy.
Intended Solution
- Derive one shell-level banner from the existing owner-held
gridAdapterState / streamAdapterState values. sample (cold) takes precedence over stale (degraded), which takes precedence over live.
- Cold names the cause and the already-shipped remedy:
npm run ai:fleet-server.
- Degraded names the last-known-data condition. Fully live renders nothing: nominal earns zero pixels.
- The banner is a render-only consumer. This leaf adds no probe, poller, transport, or new truth owner.
Acceptance Criteria
Contract Ledger
| Surface |
Truth source |
Behavior |
Fallback |
Docs |
Evidence |
deriveSpineBanner |
owner-held adapter states |
pure precedence map → {hidden, kind, text} |
n/a |
module JSDoc |
3×3 matrix spec |
| Banner slot |
toolbar reference fleet-spine-banner |
writes cls / hidden / html after each current load exit |
missing reference → guarded no-op |
syncSpineBanner JSDoc |
real recording-slot witness |
| Cold remedy |
shipped npm surface |
names npm run ai:fleet-server |
n/a |
copy in the rendered status |
copy spec |
| Live loss/recovery |
#15293 owner |
advances adapter states and retained reason without reload |
fail-closed data preserved |
#15293 |
owner-level unit + NL journey |
Out of Scope
- Ongoing transport-loss/recovery ownership, retained degraded reason, timer lifecycle, and the live→loss→recovery Neural Link journey: #15293 (required successor).
- The boot/composed-launch seam itself: #15283.
- Per-agent wake/throttle truth: #15273.
Related
Parent: #14560 · service-spine sibling: #13015 · implementation: PR #15290 · required successor: #15293 · design record: D#15249.
Origin Session ID: 5bbd6fb6-07d8-4f7e-b3ba-cccb66eddcf3
Retrieval Hint: "cockpit operable-cold banner fleet server offline sample data honest chrome"
Context
W2 operable-cold UI leaf under #14560, the Fleet Manager cockpit design epic. The Brain-side fleet service spine and bridge remain under #13015; this ticket renders the truth those surfaces expose.
PR #15290's cycle-1 review falsified the original ongoing-liveness premise:
loadRoster/loadActivityrun at construction (plus roster refreshes after successful lifecycle intents), and failure exits preserve last-known owner state. This ticket is therefore narrowed to the honest initial-cold slice. The required live→loss→recovery owner, retained reason, timer lifecycle, and Neural Link journey move non-optionally to #15293.The Problem
On a fresh cockpit boot without a reachable fleet transport, the roster and activity surfaces correctly retain their sample data, but the shell does not explain why. The operator sees sample residents and unavailable controls without a cause or an operable remedy.
Intended Solution
gridAdapterState/streamAdapterStatevalues.sample(cold) takes precedence overstale(degraded), which takes precedence overlive.npm run ai:fleet-server.Acceptance Criteria
sample|stale|live×sample|stale|livematrix; onlylive × livehides the banner.role="status"slot renders the initial-cold cause + shipped remedy and the degraded last-known state.cls/hidden/htmlmutation; a missing slot is a guarded no-op.Contract Ledger
deriveSpineBanner{hidden, kind, text}fleet-spine-bannercls/hidden/htmlafter each current load exitsyncSpineBannerJSDocnpm run ai:fleet-serverOut of Scope
Related
Parent: #14560 · service-spine sibling: #13015 · implementation: PR #15290 · required successor: #15293 · design record: D#15249.
Origin Session ID: 5bbd6fb6-07d8-4f7e-b3ba-cccb66eddcf3 Retrieval Hint: "cockpit operable-cold banner fleet server offline sample data honest chrome"