Root cause of a spawned agent's failed first send: fleet agents are born not knowing how to reach their peers. This injects a # Fleet Comms block 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 + peers from its first turn. No-op for non-fleet launches.
Acceptance criteria (Mos) — all met + tested
#
Criterion
Where
1
Address-aware boot: own [host:session] + agent-send path + peer roster
intro line + peer table
2
Cross-host: local → -s <session> (no -H); remote → -H <ssh> -s <session>
No-regression: default socket (no -L); matches live tooling
default render path
Implementation
src/fleet/comms-onboarding.ts (standalone — no fleet.ts coupling): parseRosterAgents (name/class/host/ssh/socket), renderPeerReach (data-driven command), buildFleetCommsBlock, readFleetCommsBlock ('' when not a fleet member).
launch.tscomposeContract appends the block only when MOSAIC_AGENT_NAME is set + the agent is in the roster.
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 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
Edit artifact from the host/ssh addition left a third workingDirectory block in
the agent-items properties (duplicate JSON keys are last-wins, so prettier/CI did
not flag it). Keep exactly one workingDirectory + one working_directory.
Refs #620
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fleet onboarding-injection — comms cheat-sheet + peer roster (closes #620)
Root cause of a spawned agent's failed first send: fleet agents are born not knowing how to reach their peers. This injects a
# Fleet Commsblock into each fleet agent's system prompt viacomposeContract— the runtime-agnostic path everymosaic yolo <runtime>agent hits — so it can reach the orchestrator + peers from its first turn. No-op for non-fleet launches.Acceptance criteria (Mos) — all met + tested
[host:session]+ agent-send path + peer roster-s <session>(no-H); remote →-H <ssh> -s <session>renderPeerReach; concretecoder0-0@dragon-lin=-H [email protected] -s coder0-0-L <socket>; default/unset → no-L(matches LIVE socket, not roster-pinnedmosaic-factory)renderPeerReachsocket branchagent send --verify= ACCEPTED (not injected)-L); matches live toolingImplementation
src/fleet/comms-onboarding.ts(standalone — nofleet.tscoupling):parseRosterAgents(name/class/host/ssh/socket),renderPeerReach(data-driven command),buildFleetCommsBlock,readFleetCommsBlock(''when not a fleet member).launch.tscomposeContractappends the block only whenMOSAIC_AGENT_NAMEis set + the agent is in the roster.roster.schema.json: optional per-agenthost/ssh/socket(cross-host + socket addressing; manual cross-host listing is a documented pre-federation stopgap — W1 auto-discovers later).Verification
composeContracttests: parse (incl. socket); render local/remote/ssh-fallback/equal-host/socket-none/named/combined-L+-H; build (self excluded, orchestrator flagged); situationalreadFleetCommsBlock; and the end-to-endcomposeContractinjection (correct cross-host + socket addresses; no-op whenMOSAIC_AGENT_NAMEunset). tsc/eslint/prettier/sanitize clean.coder0-0@dragon-linand a local peer.Cheap under #619 gating (
packages/mosaic+ docs only → 0 image builds).🤖 Generated with Claude Code