Context
#14562's cockpit DTO (PR #14571, APPROVED) models per-agent runtime process truth as an explicit not-wired capability, deferring to "the Fleet runtime-status wire method" (mine, per the PR's Deltas + Euclid's A2A). fleetStatus on the wire is repo-provisioning state; FleetLifecycleService.listRunning() holds the runtime truth but is not on FLEET_WIRE_METHODS. So the cockpit's fleet-grid state-dots — the §01 "state reads at a glance" primitive, the single most-read signal an operator sees — have no live runtime source.
The Problem
The cockpit renders roster (listAgents) + repo-status (fleetStatus) live, but whether an agent's process is up / idle / wedged has no Body-reachable path. listRunning() exists Node-side; it must surface through the fail-closed bridge so the browser cockpit reads runtime state without importing the Node lifecycle chain.
The Architectural Reality
Neo.ai.services.fleet.FleetLifecycleService#listRunning() — the runtime truth (running processes); #13015 notes watchdog signals exist for idle/wedged.
FleetControlBridge — the Body-reachable capability allowlist (composes registry + manager); the secret-omission boundary.
src/ai/fleet/fleetWireMethods.mjs — the FLEET_WIRE_METHODS frozen SSOT (both ends bind it); dispatchFleetRequest — the fail-closed {ok,result}/{ok:false,error} envelope; createFleetRegistryBridge — the browser end.
- Consumer:
src/ai/fleet/fleetCockpitStatus.mjs (#14562) — its capabilities.runtime + per-row sources.runtime flip not-wired → wired once this lands.
The Fix
- Add
FleetControlBridge#fleetRuntimeStatus() → resolves listRunning() (+ available watchdog signals) → returns a cockpit-shaped, redacted [{agentId, state, confidence, source}] where state ∈ {running, idle, wedged, stopped} (+ rate-limited where the harness reports it). Honest derivation: running/stopped come from listRunning directly; idle/wedged/rate-limited come from the watchdog signals #13015 names — where a signal is absent, confidence lowers and the state degrades to running/unknown, never invented (the same not-faked-state discipline PR #14571 established).
- Add
'fleetRuntimeStatus' to FLEET_WIRE_METHODS + confirm createFleetRegistryBridge generates it; dispatched fail-closed.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
FleetControlBridge#fleetRuntimeStatus (new) |
this leaf |
per-agent runtime {agentId,state,confidence,source} from listRunning + watchdog |
absent signal → lowered confidence, never invented |
JSDoc + class doc |
mirrors fleetStatus shape |
FLEET_WIRE_METHODS += 'fleetRuntimeStatus' |
this leaf |
pane-reachable via dispatchFleetRequest, fail-closed |
off-allowlist → {ok:false} |
fleetWireMethods JSDoc |
existing allowlist pattern |
Acceptance Criteria
Out of Scope
- The DTO consuming it (#14562 / PR #14571 — the adapter flips when this lands).
- The A2A/PR/lane activity stream (memory-core + github sourced, not fleet-wire — a separate C1 adapter).
- New watchdog probes for richer state semantics (follow-up if the taxonomy needs signals that don't yet exist).
Related
Parent: #13015 (FM MVP). Consumer: #14562 / PR #14571 (fleetCockpitStatus, models this not-wired). Lane: #14561 (L2). Substrate: src/ai/fleet/fleetWireMethods.mjs, ai/services/fleet/FleetControlBridge.mjs, FleetLifecycleService.mjs, dispatchFleetRequest.mjs.
Structure-map: modifies existing src/ai/fleet/ + ai/services/fleet/ (no new file) → structural-pre-flight N/A.
Live latest-open sweep: latest 15 open issues checked 2026-07-04T02:04Z; no runtime-status-wire-method equivalent (#14562/#14571 model it not-wired + defer to this leaf per the PR body).
Origin Session ID: a5ffd401-b3ed-4aa2-aedd-6ca8ea0d6867
Retrieval Hint: "fleet runtime-status wire method listRunning running idle wedged FLEET_WIRE_METHODS fleetRuntimeStatus cockpit not-wired"
Context
#14562's cockpit DTO (PR #14571, APPROVED) models per-agent runtime process truth as an explicit
not-wiredcapability, deferring to "the Fleet runtime-status wire method" (mine, per the PR's Deltas + Euclid's A2A).fleetStatuson the wire is repo-provisioning state;FleetLifecycleService.listRunning()holds the runtime truth but is not onFLEET_WIRE_METHODS. So the cockpit's fleet-grid state-dots — the §01 "state reads at a glance" primitive, the single most-read signal an operator sees — have no live runtime source.The Problem
The cockpit renders roster (
listAgents) + repo-status (fleetStatus) live, but whether an agent's process is up / idle / wedged has no Body-reachable path.listRunning()exists Node-side; it must surface through the fail-closed bridge so the browser cockpit reads runtime state without importing the Node lifecycle chain.The Architectural Reality
Neo.ai.services.fleet.FleetLifecycleService#listRunning()— the runtime truth (running processes); #13015 notes watchdog signals exist for idle/wedged.FleetControlBridge— the Body-reachable capability allowlist (composes registry + manager); the secret-omission boundary.src/ai/fleet/fleetWireMethods.mjs— theFLEET_WIRE_METHODSfrozen SSOT (both ends bind it);dispatchFleetRequest— the fail-closed{ok,result}/{ok:false,error}envelope;createFleetRegistryBridge— the browser end.src/ai/fleet/fleetCockpitStatus.mjs(#14562) — itscapabilities.runtime+ per-rowsources.runtimeflipnot-wired → wiredonce this lands.The Fix
FleetControlBridge#fleetRuntimeStatus()→ resolveslistRunning()(+ available watchdog signals) → returns a cockpit-shaped, redacted[{agentId, state, confidence, source}]wherestate ∈ {running, idle, wedged, stopped}(+rate-limitedwhere the harness reports it). Honest derivation:running/stoppedcome fromlistRunningdirectly;idle/wedged/rate-limitedcome from the watchdog signals #13015 names — where a signal is absent,confidencelowers and the state degrades torunning/unknown, never invented (the same not-faked-state discipline PR #14571 established).'fleetRuntimeStatus'toFLEET_WIRE_METHODS+ confirmcreateFleetRegistryBridgegenerates it; dispatched fail-closed.Contract Ledger
FleetControlBridge#fleetRuntimeStatus(new){agentId,state,confidence,source}fromlistRunning+ watchdogconfidence, never inventedfleetStatusshapeFLEET_WIRE_METHODS += 'fleetRuntimeStatus'dispatchFleetRequest, fail-closed{ok:false}Acceptance Criteria
fleetRuntimeStatus()returns per-agent runtime state derived fromlistRunning()(+ watchdog signals where present); no invented state — absent signals lowerconfidence.'fleetRuntimeStatus'is onFLEET_WIRE_METHODS+ generated by the browser bridge; off-allowlist / failed → fail-closed{ok:false,error}(no raw error/stack).FleetControlBridge's two-hemisphere boundary).runtimecapability + per-rowsources.runtimeflipnot-wired → wiredagainst this method.Out of Scope
Related
Parent: #13015 (FM MVP). Consumer: #14562 / PR #14571 (
fleetCockpitStatus, models thisnot-wired). Lane: #14561 (L2). Substrate:src/ai/fleet/fleetWireMethods.mjs,ai/services/fleet/FleetControlBridge.mjs,FleetLifecycleService.mjs,dispatchFleetRequest.mjs.Structure-map: modifies existing
src/ai/fleet/+ai/services/fleet/(no new file) → structural-pre-flight N/A. Live latest-open sweep: latest 15 open issues checked 2026-07-04T02:04Z; no runtime-status-wire-method equivalent (#14562/#14571 model itnot-wired+ defer to this leaf per the PR body).Origin Session ID: a5ffd401-b3ed-4aa2-aedd-6ca8ea0d6867 Retrieval Hint: "fleet runtime-status wire method listRunning running idle wedged FLEET_WIRE_METHODS fleetRuntimeStatus cockpit not-wired"