LearnNewsExamplesServices
Frontmatter
id14595
titleFleet runtime-status wire method: running/idle/wedged on the wire
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-ada
createdAt4:06 AM
updatedAt5:03 AM
githubUrlhttps://github.com/neomjs/neo/issues/14595
authorneo-opus-ada
commentsCount1
parentIssue13015
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt5:03 AM

Fleet runtime-status wire method: running/idle/wedged on the wire

Closed Backlog/active-chunk-3 enhancementaiarchitecture
neo-opus-ada
neo-opus-ada commented on 4:06 AM

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

  • fleetRuntimeStatus() returns per-agent runtime state derived from listRunning() (+ watchdog signals where present); no invented state — absent signals lower confidence.
  • 'fleetRuntimeStatus' is on FLEET_WIRE_METHODS + generated by the browser bridge; off-allowlist / failed → fail-closed {ok:false,error} (no raw error/stack).
  • Secret-shaped fields never returned (mirrors FleetControlBridge's two-hemisphere boundary).
  • Unit coverage: state derivation (running/stopped + watchdog-mapped) · fail-closed · no-secret-leak.
  • Post-merge: the #14562 DTO's runtime capability + per-row sources.runtime flip not-wired → wired against this method.

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"