LearnNewsExamplesServices
Frontmatter
id14562
titleFleet cockpit status/activity source contract
stateClosed
labels
enhancementaiarchitecture
assigneesneo-gpt
createdAt2:49 AM
updatedAt4:10 AM
githubUrlhttps://github.com/neomjs/neo/issues/14562
authorneo-gpt
commentsCount0
parentIssue13015
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt4:10 AM

Fleet cockpit status/activity source contract

Closed Backlog/active-chunk-2 enhancementaiarchitecture
neo-gpt
neo-gpt commented on 2:49 AM

Context

Lane 2/C of the post-v13.1 goal-scope now has an accepted owner split: Ada holds Fleet Manager Lane 2 overall, while GPT owns the NL/MCP live wiring sublane under #14561. The public contract is in Discussion #14561: the cockpit must read real fleet state/activity and never fake the operator surface.

This ticket exists because #14509/#14510 already shipped the dev-server pane↔fleet transport and basic bridge surface, but the next product bar is higher than "a request can cross the wire." Lane 2/C needs a cockpit-consumable status/activity contract that composes the existing source surfaces into one honest feed for Lane 1's UI.

The Problem

The current Fleet Manager surfaces are useful but not yet a cockpit feed:

  • FleetControlBridge.listAgents() returns the redacted registry roster.
  • FleetControlBridge.fleetStatus() returns repo/provisioning state.
  • FleetSettingsPanel renders a minimal roster and per-call status text.
  • A2A activity, PR state, and lane/participation state live in separate substrates.

Without a formal DTO and adapter boundary, Lane 1 can accidentally hardcode sample agents, infer activity from UI text, or couple to implementation-specific payloads. That would recreate the brittle apps/agentos surface the operator called out.

The Architectural Reality

  • ai/services/fleet/FleetControlBridge.mjs is the Body-reachable allowlist. It composes registry reads with lifecycle operations and preserves the no-secret boundary.
  • src/ai/fleet/fleetWireMethods.mjs is the app↔fleet method SSOT. Any bridge-visible verb must live there; no parallel method vocabulary.
  • ai/services/fleet/dispatchFleetRequest.mjs is the fail-closed server choke point.
  • src/ai/fleet/createFleetRegistryBridge.mjs is the dependency-light browser/App-Worker client factory.
  • apps/agentos/view/FleetSettingsPanel.mjs is the current minimal Body consumer.
  • Memory Core MailboxService owns A2A message state; ai/services/graph/issueFocusSections.mjs owns PR/participation/stall derivations.
  • Structure-map gate: ran npm run --silent ai:structure-map -- --files --loc; relevant owning folders are ai/services/fleet, src/ai/fleet, apps/agentos, ai/services/memory-core, and ai/services/graph.

The Fix

Add a small Lane 2/C source contract and first adapter seam for cockpit consumption:

  1. Define a serializable fleet cockpit status/activity DTO with source labels.
  2. Compose v1 from listAgents() + fleetStatus() first.
  3. Add bounded event classes for lifecycle request/success/failure and bridge unavailable/gated.
  4. Reserve explicit adapter slots for later A2A, PR, and lane/participation sources; missing adapters must render as provisional / not wired, never invented activity.
  5. Add focused unit coverage proving no secret fields cross the DTO and every event class names its source.

Contract Ledger Matrix

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
Fleet roster/status DTO FleetControlBridge.listAgents() + fleetStatus() one row per public agent with definition/provisioning/lifecycle/gated/error state row marks source missing or gated; no fake state issue body + follow-up source JSDoc unit test with redacted agent + fleetStatus payload
Activity event DTO fleet lifecycle result envelope first; A2A/PR/lane adapters later bounded event classes with {source, confidence, payload} missing adapter emits not wired capability state source JSDoc unit test rejects source-less events
Body bridge methods FLEET_WIRE_METHODS no new verb unless the shared SSOT is extended off-list method rejected by dispatchFleetRequest existing wire docs existing dispatch tests + new adapter tests
Secret boundary FleetRegistryService.toPublic() and FleetControlBridge PAT/credential material never appears in DTO/activity payloads fail closed / omit source payload issue body test scans DTO serialization for secret-shaped fields

Decision Record impact

Aligned with ADR-0020 Agent Harness and the Fleet Manager MVP shape in #13015. No ADR amendment expected; this is an implementation contract inside the existing Body/Brain split.

Acceptance Criteria

  • A fleet cockpit status/activity DTO exists with explicit source labels and no secret fields.
  • The v1 adapter composes listAgents() + fleetStatus() into cockpit rows.
  • Lifecycle event classes cover request, success, failure, and bridge unavailable/gated.
  • A2A/PR/lane-state adapters are represented as explicit future adapter slots or capability states, not faked data.
  • Unit coverage proves DTO redaction, source labels, and fail-closed behavior.
  • The implementation does not add an app↔fleet method outside FLEET_WIRE_METHODS.

Out of Scope

  • Rebuilding the Lane 1 cockpit UI (#14560).
  • The already-shipped dev-server transport from #14509/#14510.
  • setWakeEnabled (#14537), which remains blocked on control-plane authority.
  • Credentials/PAT storage and onboarding flow; Ada holds Lane 2/D until a security-focused peer self-selects.
  • PR/lane/A2A adapter implementation beyond explicit capability slots unless kept small and proven.

Avoided Traps

  • No sample fleet state in production paths.
  • No UI-text scraping as an activity source.
  • No new transport vocabulary beside FLEET_WIRE_METHODS.
  • No secret-bearing payloads crossing into the Body.

Related

#14561 · #13015 · #14509 · #14510 · #14560 · #14537 · #13080

Live latest-open sweep: checked latest 20 open issues immediately before creation; no equivalent found. A2A in-flight sweep: checked recent mailbox claims before creation; Ada accepted GPT's Lane 2/C sublane, no competing claim found. KB/local duplicate sweep: surfaced #14509/#14510 and #13080 as shipped prerequisites, not duplicates of this status/activity feed contract. Origin Session ID: 33403f62-0332-411a-bda3-0f4ab10cd1e6 Retrieval Hint: "Fleet Manager Lane 2/C status activity DTO FleetControlBridge fleetStatus FLEET_WIRE_METHODS"

tobiu closed this issue on 4:10 AM
tobiu referenced in commit b1068b2 - "feat(fleet): add cockpit status DTO (#14562) (#14571) on 4:10 AM