# Fleet agent-home delegation parity report

Date: 2026-08-09  
Scope: `expandAgentHomes()` items (`owner: "remote-seat-provision"`) vs what `modules/workstation/claude/lib/remote-seat-provision.mjs` deploys today.

## Counts (measured from this repo)

| Set | Count |
|-----|------:|
| Fleet `agent-home:*` items on `debian1` (`expandNode`) | 61 |
| Workstation manifest entries (`modules/workstation/manifest/*.json`) | 61 |
| Claude-only manifest entries (`loadClaudeManifest()`) | 29 |

Fleet expansion is a 1:1 projection of every workstation manifest entry into a `DesiredItem`. IDs match exactly (`agent-home:<agent>:<path>`); there are zero fleet-only or manifest-only entries.

Agents represented in the fleet delegated set:

| Agent | Manifest entries |
|-------|-----------------:|
| claude | 29 |
| codex | 9 |
| cursor-agent | 5 |
| gemini | 5 |
| pi | 3 |
| bin | 4 |
| kiro | 2 |
| opencode | 2 |
| antigravity | 1 |
| shell | 1 |

## What `remote-seat-provision.mjs` actually owns

`provisionHost` / `auditHostSeat` operate on the **claude** manifest only (`CLAUDE_MANIFEST_PATH` → `modules/workstation/manifest/claude.json`). The provision plan is:

1. OS packages (`buildPackageInstallScript`)
2. Claude CLI install (`buildClaudeInstallScript`)
3. Runtime rsync of claude manifest entries to a revision-staged tree (`rsyncEntries` + `buildRuntimeLinkScript` + `buildRuntimeFinalizeScript`)
4. Claude Code Proxy rsync (`rsyncCcp`)
5. Seat proxy prerequisites, gh auth, gh git auth, headless guard, seat guard, agent-seat slice

`auditHostSeat` probes SSH reachability, then runs `buildSeatDoctorScript` remotely. On success it emits PASS lines for claude parity, ccp parity, tmux, gh auth, runtime revision, **each claude manifest entry path/strategy**, headless guard, seat guard, proxy prerequisites, and seat contract dry-run.

It does **not** read, deploy, or audit the other nine agent manifests (codex, cursor-agent, gemini, pi, bin, kiro, opencode, antigravity, shell).

## Overlap and gaps

| Concern | Fleet delegated item | `remote-seat-provision` today |
|---------|---------------------|------------------------------|
| Claude manifest paths (29) | Declared as per-entry `DesiredItem`s with repo/deploy source + digest | Deployed via staged runtime rsync + atomic link finalize; audited in seat doctor |
| Non-claude agent homes (32) | Declared as `DesiredItem`s | **Not referenced** |
| Claude CLI / CCP / packages | Not modeled as fleet items | Installed by provision scripts |
| gh auth / git auth | Not modeled | Provision + audit |
| Seat guards / proxy / slice | Not modeled | Provision + audit |
| Runtime revision fingerprint | `content_digest` per file/tree | `runtimeRevision()` + `manifestRuntimeFingerprint()` |

## Finding

Delegation is **not** a thin pass-through.

- **Partial overlap:** the 29 claude manifest entries are semantically related, but the fleet items describe static repo/deploy paths and digests, while `remote-seat-provision` deploys a revision-staged runtime tree with separate install/auth/guard phases and a different audit surface (`auditHostSeat` doctor script vs per-field fleet drift).
- **Fleet-only surface:** 32 non-claude agent-home items exist in the fleet declaration with no counterpart in `remote-seat-provision`.
- **Provision-only surface:** packages, claude/ccp binaries, gh auth, guards, and proxy prerequisites are outside the fleet `agent-home:*` item set.

**Recommendation (recorded, not implemented here):** keep delegation for SSH buildbox nodes at the `auditHostSeat` / `provisionHost` seam; absorb-and-delete `remote-seat-provision.mjs` only after a follow-up plan closes the non-claude agent-home gap and reconciles the claude runtime staging model with fleet `DesiredItem` semantics.
