Context
First leaf of the Fleet Manager sub-epic #13015 (pillar 1 of the Agent Harness #13012). Operator direction (2026-06-13): "agent harness biggest ROI." #13015 has no leaves linked yet — this is the foundation every other FM leaf (lifecycle, provisioning, settings-pane) consumes, and it is the one slice not gated by the #12984 session-id canonicalization, so it can land first. Self-selected via [lane-intent] (no competing claim).
The Problem
#13015's recorded operator pain, verbatim: "if i start 5 claude desktop instances plus codex via terminal and manage 6 agent repos... brittle." Today there is no agent registry — identity env is hand-maintained per instance, harness type lives only in the operator's head, and credentials are ad-hoc. The whole MVP loop (define agents → start/stop → repos managed under the hood) starts at define — and there is nowhere to define one. This leaf creates that surface: a durable, Node-side registry of agent definitions + their credentials.
The Architectural Reality
- New Brain-side domain
ai/services/fleet/ — sibling-consistent with the existing ai/services/<domain>/ layout (memory-core, knowledge-base, github-workflow, neural-link, …). Placement settled via structural-pre-flight Stage-1 fast-path (matched sibling pattern; #13015 already converged "fleet services in ai/, UI in apps/").
- Two-hemisphere security boundary (the design rule graduated from Discussion #10119 + #13012): the PAT is a Node-side secret — stored encrypted-at-rest / OS-keychain and never transits the browser. The registry is the Brain-side owner of that secret; the Body-side settings-pane (separate leaf) only ever sends a PAT in (write) and never reads it back.
The Fix
A FleetRegistryService (singleton) under ai/services/fleet/:
- Define / list / get / remove an agent, where an agent =
{ id, githubUsername, harnessType, ... } + an associated credential (PAT).
harnessType ∈ Claude Desktop / Codex / Antigravity / native-Neo (later).
- Credential storage: Node-side, encrypted-at-rest (mechanism — libsecret/keychain vs encrypted file — decided at implementation under the security-boundary AC).
get-agent returns the definition without the raw PAT; a separate Brain-internal accessor resolves the secret for the spawner only.
Contract Ledger
| Field |
Value |
| Target Surface |
ai/services/fleet/FleetRegistryService.mjs (NEW) — defineAgent / listAgents / getAgent / removeAgent + Brain-internal credential resolve |
| Source of Authority |
#13015 (FM MVP design rule: PAT Node-side, never browser); #13012 / Discussion #10119 (two-hemisphere boundary) |
| Proposed Behavior |
Durable agent-definition registry + encrypted credential store; reads never surface the raw PAT past the Brain boundary |
| Fallback |
Absent/locked credential store → define/list still work; credential-resolve fails closed (no plaintext leak) |
| Docs |
Service JSDoc (Anchor & Echo) + a short ai/services/fleet/ README if the domain warrants it |
| Evidence |
Unit tests: CRUD round-trip + the credential-boundary assertion (raw PAT never returned from getAgent) |
Decision Record impact
aligned-with #13012 (Electron + two-hemisphere security decisions). ai/services/fleet/ placement via structural-pre-flight Stage-1 fast-path. ADR 0020 (#13020, in-flight, @neo-fable) is the harness concept anchor — not a design-gate for this leaf; downstream refresh only if it reshapes the fleet-service naming.
Acceptance Criteria
Out of Scope
- Instance lifecycle (start/stop/restart/health) — separate FM leaf.
- Identity-env + wake-subscription provisioning — blocked on the #12984 session-id canonicalization (Discussion, @neo-opus-vega); a separate provisioning leaf gains the
blocked_by once #12984 graduates to a ticket.
- Repo provisioning (clone/worktree management) — separate FM leaf.
- The settings-pane UI (Body-side,
apps/) — separate leaf, theme-dependent on #13024 (visual system).
- The Electron build root — parent-epic leaf.
Avoided Traps
- Credentials in the browser — rejected by the two-hemisphere design rule (Brain-side only).
- Native-Neo-agents-first — rejected: the operator's fleet is external harnesses today; registering those first keeps the MVP dogfoodable.
- Big-bang fleet daemon — rejected: registry lands independently (define/store is useful before lifecycle exists).
Related
Parent: #13015 (Fleet Manager MVP). Epic: #13012 (Neo Agent Harness). #12984 (session-id canonicalization — gates the provisioning leaf, not this registry). Source archaeology: Discussion #10119.
Release classification: post-release (FM MVP product line; nothing v13.x-blocking, per #13015). Boardless per ticket-create §4.
Live latest-open sweep: checked latest 20 open issues at 2026-06-13T00:47Z (#13030/#13028/#13026/#13025/#13023/#13020 …) — no equivalent registry leaf. A2A claim sweep: only my own [lane-intent] (MESSAGE:e9df62e7); no competing claim. #13015 trackedIssues empty at file time.
Origin Session ID: 9eb75c03-9185-4e69-8064-1decc76c6771
Retrieval Hint: "fleet manager agent registry credential store PAT node-side encrypted define agent ai/services/fleet"
Authored by Claude Opus 4.8 (Claude Code, @neo-opus-grace / Grace).
Context
First leaf of the Fleet Manager sub-epic #13015 (pillar 1 of the Agent Harness #13012). Operator direction (2026-06-13): "agent harness biggest ROI." #13015 has no leaves linked yet — this is the foundation every other FM leaf (lifecycle, provisioning, settings-pane) consumes, and it is the one slice not gated by the #12984 session-id canonicalization, so it can land first. Self-selected via
[lane-intent](no competing claim).The Problem
#13015's recorded operator pain, verbatim: "if i start 5 claude desktop instances plus codex via terminal and manage 6 agent repos... brittle." Today there is no agent registry — identity env is hand-maintained per instance, harness type lives only in the operator's head, and credentials are ad-hoc. The whole MVP loop (define agents → start/stop → repos managed under the hood) starts at define — and there is nowhere to define one. This leaf creates that surface: a durable, Node-side registry of agent definitions + their credentials.
The Architectural Reality
ai/services/fleet/— sibling-consistent with the existingai/services/<domain>/layout (memory-core,knowledge-base,github-workflow,neural-link, …). Placement settled via structural-pre-flight Stage-1 fast-path (matched sibling pattern; #13015 already converged "fleet services inai/, UI inapps/").The Fix
A
FleetRegistryService(singleton) underai/services/fleet/:{ id, githubUsername, harnessType, ... }+ an associated credential (PAT).harnessType∈ Claude Desktop / Codex / Antigravity / native-Neo (later).get-agent returns the definition without the raw PAT; a separate Brain-internal accessor resolves the secret for the spawner only.Contract Ledger
ai/services/fleet/FleetRegistryService.mjs(NEW) —defineAgent/listAgents/getAgent/removeAgent+ Brain-internal credential resolveai/services/fleet/README if the domain warrants itgetAgent)Decision Record impact
aligned-with#13012 (Electron + two-hemisphere security decisions).ai/services/fleet/placement via structural-pre-flight Stage-1 fast-path. ADR 0020 (#13020, in-flight, @neo-fable) is the harness concept anchor — not a design-gate for this leaf; downstream refresh only if it reshapes the fleet-service naming.Acceptance Criteria
FleetRegistryServiceinai/services/fleet/withdefineAgent/listAgents/getAgent/removeAgent.githubUsername+harnessType+ a stored credential (PAT).getAgent/listAgents(a dedicated Brain-internal resolver serves the spawner only) — asserted by a unit test.unit-test.md.)Out of Scope
blocked_byonce #12984 graduates to a ticket.apps/) — separate leaf, theme-dependent on #13024 (visual system).Avoided Traps
Related
Parent: #13015 (Fleet Manager MVP). Epic: #13012 (Neo Agent Harness). #12984 (session-id canonicalization — gates the provisioning leaf, not this registry). Source archaeology: Discussion #10119.
Release classification: post-release (FM MVP product line; nothing v13.x-blocking, per #13015). Boardless per
ticket-create§4.Live latest-open sweep: checked latest 20 open issues at 2026-06-13T00:47Z (#13030/#13028/#13026/#13025/#13023/#13020 …) — no equivalent registry leaf. A2A claim sweep: only my own
[lane-intent](MESSAGE:e9df62e7); no competing claim. #13015trackedIssuesempty at file time.Origin Session ID: 9eb75c03-9185-4e69-8064-1decc76c6771 Retrieval Hint: "fleet manager agent registry credential store PAT node-side encrypted define agent ai/services/fleet"
Authored by Claude Opus 4.8 (Claude Code, @neo-opus-grace / Grace).