Leaf of #13015 (Fleet Manager MVP). The MVP loop define → start → observe has both halves built but no middle: the Brain services (FleetRegistryService / FleetManager — self-wiring singletons) and the Body pane (apps/agentos) exist, but the transport between the Body app and the Node fleet backend was never built. FleetManager is instantiated nowhere (grep = 0 instantiations), and the pane fails closed on a missing injected bridge.defineAgent() / bridge.manageConnection() (Accounts.mjs:262/285). This leaf builds that middle so @tobiu starts one agent from the UI, not a terminal — the epic's PoC criterion.
Approach: Option B (a dev-server app↔fleet transport, finishable now). The Electron shell #13377 in-process inject (Option A) stays the product target, not a blocker.
Acceptance Criteria
FleetControlBridge — a single capability-allowlist surface composing the registry (define / list / get) + manager (start / stop / restart / remove / status) singletons, deliberately omitting the Brain-internal secret paths (resolveCredential / mintBridgeToken / getSigningKey). Unit-tested (per-method delegation + the allowlist guard). ✅ landed
- Dev-server app↔fleet transport — serves ONLY the
FleetControlBridge surface to the pane, so a forged request can reach no secret path. The PAT rides in via defineAgent and never comes back out.
- Pane wired — the agentos pane's fail-closed
bridge.* calls reach the transport → define an agent + start it from the UI. The PoC demo.
Non-goals
- The Electron shell #13377 in-process transport (Option A, the product target).
- PAT store / crypto (already in
FleetRegistryService).
- Window management, cockpit nav / keeper-views (#13448 / #13521 — coordinated with @neo-fable / @neo-opus-vega, not owned here).
Delivery
One lane, ≤2 PRs (backend bridge+transport; pane-wire+demo). AC-1 landed first.
Authored by Ada (Claude Opus 4.8, Claude Code).
Leaf of #13015 (Fleet Manager MVP). The MVP loop define → start → observe has both halves built but no middle: the Brain services (
FleetRegistryService/FleetManager— self-wiring singletons) and the Body pane (apps/agentos) exist, but the transport between the Body app and the Node fleet backend was never built.FleetManageris instantiated nowhere (grep= 0 instantiations), and the pane fails closed on a missing injectedbridge.defineAgent()/bridge.manageConnection()(Accounts.mjs:262/285). This leaf builds that middle so @tobiu starts one agent from the UI, not a terminal — the epic's PoC criterion.Approach: Option B (a dev-server app↔fleet transport, finishable now). The Electron shell #13377 in-process inject (Option A) stays the product target, not a blocker.
Acceptance Criteria
FleetControlBridge— a single capability-allowlist surface composing the registry (define/list/get) + manager (start/stop/restart/remove/status) singletons, deliberately omitting the Brain-internal secret paths (resolveCredential/mintBridgeToken/getSigningKey). Unit-tested (per-method delegation + the allowlist guard). ✅ landedFleetControlBridgesurface to the pane, so a forged request can reach no secret path. The PAT rides in viadefineAgentand never comes back out.bridge.*calls reach the transport → define an agent + start it from the UI. The PoC demo.Non-goals
FleetRegistryService).Delivery
One lane, ≤2 PRs (backend bridge+transport; pane-wire+demo). AC-1 landed first.
Authored by Ada (Claude Opus 4.8, Claude Code).