Context
FM-week Lane C (observability) under the #14560 lane map — the operator's original idea list names "Agent OS logs views (orchestrator container, wake delivery)" explicitly. Wake delivery is the fleet's nervous system, and every fault in it today is diagnosed by an agent running hand-forensics: the 2026-08-02 busy-hang diagnosis (#16386 era), Ada's cold-boot forensics filed this morning (#16429, #16430), and the recurring [daemon-health] staleness broadcasts (D#16304 arc). The operator — whom the FM exists to serve — sees none of it.
Live latest-open sweep: checked latest 20 open issues at 2026-08-03T10:22Z (re-checked latest 10 at 10:26Z); no equivalent found. A2A 30-message claim sweep at 10:22Z: no overlapping [lane-claim]/[lane-intent].
The Problem
The wake substrate is now three shipped layers deep, and none of them has an operator surface:
- Subscription state lives in the MC graph (
WAKE_SUBSCRIPTION nodes) and is readable over authenticated MCP (#16347 shipped the fleet-side read path).
- Seat-side route arming shipped in
#16410 (63149823e2): a seat arms its own wake route at session start via ai/daemons/wake/armSeatWakeRoute.mjs + readSubscriptionsOverMcp.mjs.
- Delivery liveness + terminal failures shipped in
#16347: ai/services/fleet/fleetWakeStateAdapter.mjs carries injectable axis-level resolvers (resolveDeliveryLiveness, resolveTerminalDeliveryFailures) bound to the containerized plane at the devFleetServer entry.
The cockpit can render an agent's memories (#16398) but cannot answer the operator's most basic fleet question: "can this seat be woken right now, and if not, where does the route break?"
The Architectural Reality
- Pane vocabulary:
apps/agentos/view/fleet/ already speaks vital-signs — spineBanner.mjs (the single honesty line), telltale.mjs, HealthSwatch.mjs, StateDot.mjs. MemoriesPane.mjs (#16398 → d9677cecf2) is the freshest sibling precedent for a plane-fed pane.
- Wire seam: the cockpit consumes Brain-side truth via
src/ai/fleet/fleetWireMethods.mjs / fleetCockpitStatus.mjs over the existing authenticated fleet request path — the #13015-owned bridge. No new transport.
- Data path mandate: data-carrying cockpit UI binds a
data.Store of data.Model records (operator directive 2026-07-08; the memories view is the shipped precedent). No hand-mapped arrays; state.Provider stays at the view root.
- Status-idiom entity trap (Ada, 2026-08-02): the COALESCE status idiom spans THREE node labels —
WAKE_SUBSCRIPTION, HARNESS_PRESENCE, AGENT_TURN_PRESENCE. Every status read in this leaf must be label-classified, never grep-and-converted.
The Fix
One PR, sibling-lifted from the memories-view shape:
- Brain-side read composition — extend the existing fleet cockpit wire surface (sibling method beside the
fleetCockpitStatus.mjs pattern) that composes, per registered seat: subscription status, route-armed state, delivery liveness, last terminal delivery failure, and turn-presence freshness — all from the shipped sources above, read live from the plane (no mirror files, no second truth).
WakeRoutePane — a MemoriesPane sibling under apps/agentos/view/fleet/, Store/Model-bound, one row per seat with the five axes; degraded axes render their typed reason.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
| Fleet wire read method (wake-route composition) |
src/ai/fleet/fleetWireMethods.mjs + fleetCockpitStatus.mjs pattern (#13015 bridge) |
New sibling read composing the five per-seat axes |
Typed unreachable payload; never fabricated rows |
JSDoc + @summary |
Pattern shipped; consumed by FleetCockpit today |
resolveDeliveryLiveness / resolveTerminalDeliveryFailures |
ai/services/fleet/fleetWakeStateAdapter.mjs (shipped #16347) |
Consumed as-is; axis contract unchanged |
Out-of-contract → typed unknown with source-naming reason (existing behavior) |
Existing module doc |
#16347 closed; adapter merged |
| Subscription + arming read |
ai/daemons/wake/readSubscriptionsOverMcp.mjs + armSeatWakeRoute.mjs (shipped #16410) |
Read-only reuse over authenticated MCP |
Absent subscription renders as unarmed, never as fault |
Existing module docs |
63149823e2 merged |
WakeRoutePane (new cockpit surface) |
apps/agentos/view/fleet/MemoriesPane.mjs sibling precedent |
Store/Model-bound per-seat rows; five axes + typed degrade |
Plane unreachable → pane-level honest-degrade consistent with spineBanner discipline |
Anchor & Echo JSDoc |
#16398 → d9677cecf2 precedent |
Acceptance Criteria
Out of Scope
- Per-event historical wake ledger (armed→attempt→receipt timeline) — requires service-side event accretion that does not exist yet; future #13015-side leaf.
- Container log surfaces and the orchestrator scheduling view (separate Lane C leaves, claimant-authored).
- Any daemon-internal behavior change — @neo-opus-vega's starvation-diagnosis arc (#16382, PR #16416) is untouched.
- Tray/native-shell surfaces (#14793 territory).
Avoided Traps
- Second-truth cache: the pane binds plane reads; it never mirrors wake state into files or duplicated stores (Diamond-1-B trap from the lane map).
- Absence-as-health: defaulting any axis to healthy asserts fitness on the strength of never having asked — the same unearned-certification shape #16051/
#16037 rejected.
- Status-idiom grep-and-convert: three node labels share the status idiom; every read is label-classified (entity trap above).
- New MCP tool: none added; tool-bloat discipline (
#16217) — existing wire + existing MCP reads only.
Decision Record impact
None — aligned-with ADR 0018 (two-hemisphere split: Brain-side composition on the #13015 bridge, Body-side pane under #14560). Consumes shipped contracts; supersedes nothing.
Related
- Parent epic: #14560 (cockpit UI/UX; native-linked on creation)
- Service spine + bridge: #13015
- Shipped substrate consumed:
#16347, #16410
- Motivating forensics: #16429, #16430, D
#16304
- Sibling vitals leaf: #16051 (daemonState wiring into
spineBanner)
Origin Session ID: 65e414e1-48a4-49a0-a430-70a81911f9fc
Retrieval Hint: "fleet wake plane migration injectable resolvers" · "wake-route panel Lane C" · commit range 63149823e2..d9677cecf2
Context
FM-week Lane C (observability) under the #14560 lane map — the operator's original idea list names "Agent OS logs views (orchestrator container, wake delivery)" explicitly. Wake delivery is the fleet's nervous system, and every fault in it today is diagnosed by an agent running hand-forensics: the 2026-08-02 busy-hang diagnosis (
#16386era), Ada's cold-boot forensics filed this morning (#16429, #16430), and the recurring[daemon-health]staleness broadcasts (D#16304arc). The operator — whom the FM exists to serve — sees none of it.Live latest-open sweep: checked latest 20 open issues at 2026-08-03T10:22Z (re-checked latest 10 at 10:26Z); no equivalent found. A2A 30-message claim sweep at 10:22Z: no overlapping
[lane-claim]/[lane-intent].The Problem
The wake substrate is now three shipped layers deep, and none of them has an operator surface:
WAKE_SUBSCRIPTIONnodes) and is readable over authenticated MCP (#16347shipped the fleet-side read path).#16410(63149823e2): a seat arms its own wake route at session start viaai/daemons/wake/armSeatWakeRoute.mjs+readSubscriptionsOverMcp.mjs.#16347:ai/services/fleet/fleetWakeStateAdapter.mjscarries injectable axis-level resolvers (resolveDeliveryLiveness,resolveTerminalDeliveryFailures) bound to the containerized plane at thedevFleetServerentry.The cockpit can render an agent's memories (#16398) but cannot answer the operator's most basic fleet question: "can this seat be woken right now, and if not, where does the route break?"
The Architectural Reality
apps/agentos/view/fleet/already speaks vital-signs —spineBanner.mjs(the single honesty line),telltale.mjs,HealthSwatch.mjs,StateDot.mjs.MemoriesPane.mjs(#16398 → d9677cecf2) is the freshest sibling precedent for a plane-fed pane.src/ai/fleet/fleetWireMethods.mjs/fleetCockpitStatus.mjsover the existing authenticated fleet request path — the #13015-owned bridge. No new transport.data.Storeofdata.Modelrecords (operator directive 2026-07-08; the memories view is the shipped precedent). No hand-mapped arrays;state.Providerstays at the view root.WAKE_SUBSCRIPTION,HARNESS_PRESENCE,AGENT_TURN_PRESENCE. Every status read in this leaf must be label-classified, never grep-and-converted.The Fix
One PR, sibling-lifted from the memories-view shape:
fleetCockpitStatus.mjspattern) that composes, per registered seat: subscription status, route-armed state, delivery liveness, last terminal delivery failure, and turn-presence freshness — all from the shipped sources above, read live from the plane (no mirror files, no second truth).WakeRoutePane— aMemoriesPanesibling underapps/agentos/view/fleet/, Store/Model-bound, one row per seat with the five axes; degraded axes render their typed reason.Contract Ledger
src/ai/fleet/fleetWireMethods.mjs+fleetCockpitStatus.mjspattern (#13015 bridge)unreachablepayload; never fabricated rows@summaryresolveDeliveryLiveness/resolveTerminalDeliveryFailuresai/services/fleet/fleetWakeStateAdapter.mjs(shipped#16347)unknownwith source-naming reason (existing behavior)#16347closed; adapter mergedai/daemons/wake/readSubscriptionsOverMcp.mjs+armSeatWakeRoute.mjs(shipped#16410)unarmed, never as faultWakeRoutePane(new cockpit surface)apps/agentos/view/fleet/MemoriesPane.mjssibling precedentspineBannerdisciplineAcceptance Criteria
#16051null-claims-nothing law, asserted with a control pair).data.Storeofdata.Modelrecords end-to-end; no hand-mapped arrays.npx playwright test).Out of Scope
Avoided Traps
#16037rejected.#16217) — existing wire + existing MCP reads only.Decision Record impact
None — aligned-with ADR 0018 (two-hemisphere split: Brain-side composition on the #13015 bridge, Body-side pane under #14560). Consumes shipped contracts; supersedes nothing.
Related
#16347,#16410#16304spineBanner)Origin Session ID: 65e414e1-48a4-49a0-a430-70a81911f9fc Retrieval Hint: "fleet wake plane migration injectable resolvers" · "wake-route panel Lane C" · commit range 63149823e2..d9677cecf2