Files
stack/docs/scratchpads/fleet-comms-onboarding.md
Jason Woltje 30ef9ed66b
Some checks failed
ci/woodpecker/push/ci Pipeline was canceled
ci/woodpecker/pr/ci Pipeline was canceled
feat(fleet): onboarding-injection — comms cheat-sheet + peer roster per agent (#620)
Root cause of a spawned agent's failed first send: fleet agents are born not
knowing how to reach their peers. Inject a comms cheat-sheet + peer roster into
each fleet agent's system prompt via composeContract (the runtime-agnostic path
every `mosaic yolo <runtime>` agent hits), so it can reach the orchestrator and
peers from its first turn.

- src/fleet/comms-onboarding.ts (standalone, no fleet.ts coupling):
  parseRosterAgents (name/class/host/ssh/socket), renderPeerReach (data-driven
  agent-send command), buildFleetCommsBlock (own [host:session] identity +
  agent-send path + peer table + FLIP-to-reply + `agent send --verify`=ACCEPTED),
  readFleetCommsBlock (reads roster.yaml; '' when not a member).
- launch.ts composeContract appends it only when MOSAIC_AGENT_NAME is set + the
  agent is in the roster (no-op for non-fleet launches).
- roster.schema.json: optional per-agent host/ssh/socket (cross-host + socket
  addressing; manual cross-host listing is a pre-federation stopgap).

Address rendering is fully data-driven per Mos's acceptance criteria:
- cross-host: local → `-s <session>` (no -H); remote → `-H <ssh> -s <session>`.
- socket: named → `-L <socket>`; unset → default socket (no -L) — matches the
  LIVE socket, never blindly inherits the roster's tmux.socket_name.

Verified: 14 onboarding + 9 composeContract tests (parse, render local/remote/
fallback/equal-host/socket-none/named/combined, build, situational read +
composeContract injection w/ correct cross-host+socket addrs, no-op when
MOSAIC_AGENT_NAME unset). tsc/eslint/prettier/sanitize clean.

Refs #620

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
2026-06-22 12:02:50 -05:00

32 lines
1.8 KiB
Markdown

# Fleet onboarding-injection — comms cheat-sheet + peer roster (#620)
- **Issue:** #620 · **Branch:** `feat/fleet-comms-onboarding` (off main). Root cause of Mos's failed first send.
## What
Inject a `# Fleet Comms` block into each spawned fleet agent's system prompt (via composeContract — the
runtime-agnostic path every `mosaic yolo <runtime>` agent hits), so it boots knowing how to reach peers.
- `src/fleet/comms-onboarding.ts` (standalone, no fleet.ts coupling):
- `parseRosterAgents` (name/class/host/ssh, lenient), `renderPeerReach` (same-host `-s` vs cross-host
`-H <ssh> -s`), `buildFleetCommsBlock` (self [host:session] identity + agent-send path + peer table +
FLIP-to-reply + `agent send --verify`=ACCEPTED), `readFleetCommsBlock` (reads roster.yaml; '' if not a member).
- `composeContract` appends it only when MOSAIC_AGENT_NAME is set + the agent is in the roster.
- `roster.schema.json`: optional per-agent `host` + `ssh` (cross-host addresses; manual = pre-federation
stopgap, federation/W1 auto-discovers later).
## Acceptance criteria (Mos) — all covered
1. own [host:session] + agent-send path + peer roster ✓
2. cross-host correctness: local→`-s` (no -H); remote→`-H <ssh> -s` ✓ (concrete coder0-0@dragon-lin)
3. FLIP-the-preamble reply rule ✓
4. `agent send --verify` = ACCEPTED ✓
5. no `-L` (default socket); matches live tooling ✓
## Verification
- 10 onboarding unit tests (parse, render local/remote/fallback/equal-host, build, situational read) +
2 composeContract situational tests (injects for fleet agent w/ correct cross-host addr; no-op when
MOSAIC_AGENT_NAME unset). tsc/eslint/prettier/sanitize clean.
- Post-merge validation: Mos spawns a real w-jarvis agent → first-try reach to coder0-0@dragon-lin + a local peer.