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:
- Define a serializable fleet cockpit status/activity DTO with source labels.
- Compose v1 from
listAgents() + fleetStatus() first.
- Add bounded event classes for lifecycle request/success/failure and bridge unavailable/gated.
- Reserve explicit adapter slots for later A2A, PR, and lane/participation sources; missing adapters must render as
provisional / not wired, never invented activity.
- 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
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"
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/#14510already 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.FleetSettingsPanelrenders a minimal roster and per-call status text.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/agentossurface the operator called out.The Architectural Reality
ai/services/fleet/FleetControlBridge.mjsis the Body-reachable allowlist. It composes registry reads with lifecycle operations and preserves the no-secret boundary.src/ai/fleet/fleetWireMethods.mjsis the app↔fleet method SSOT. Any bridge-visible verb must live there; no parallel method vocabulary.ai/services/fleet/dispatchFleetRequest.mjsis the fail-closed server choke point.src/ai/fleet/createFleetRegistryBridge.mjsis the dependency-light browser/App-Worker client factory.apps/agentos/view/FleetSettingsPanel.mjsis the current minimal Body consumer.MailboxServiceowns A2A message state;ai/services/graph/issueFocusSections.mjsowns PR/participation/stall derivations.npm run --silent ai:structure-map -- --files --loc; relevant owning folders areai/services/fleet,src/ai/fleet,apps/agentos,ai/services/memory-core, andai/services/graph.The Fix
Add a small Lane 2/C source contract and first adapter seam for cockpit consumption:
listAgents()+fleetStatus()first.provisional/not wired, never invented activity.Contract Ledger Matrix
FleetControlBridge.listAgents()+fleetStatus(){source, confidence, payload}not wiredcapability stateFLEET_WIRE_METHODSdispatchFleetRequestFleetRegistryService.toPublic()andFleetControlBridgeDecision 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
listAgents()+fleetStatus()into cockpit rows.FLEET_WIRE_METHODS.Out of Scope
#14560).#14509/#14510.setWakeEnabled(#14537), which remains blocked on control-plane authority.Avoided Traps
FLEET_WIRE_METHODS.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/#14510and#13080as 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"