0002 — SendMessage is the agent-to-agent channel; tmux is hosting only

The rule

  1. Agent-to-agent communication is SendMessage (or the msg CLI, which parks into a session's inbox). Typing into another session's pane with tmux send-keys — the pre-SendMessage coordination mechanism — is retired.
  2. tmux is a hosting substrate. A session may act on its own pane (respawning itself after a rotation; wedge-heal respawning the pane it runs in) because that is process management, not communication.
  3. A prompt for a restarted session rides the launch, never the terminal. claude --resume <sid> "<prompt>" auto-submits (verified live 2026-08-29). Nothing in the fleet simulates a human typing into a terminal any more.
  4. A human driving panes by hand (/tmux drive) is out of scope. That is Gera operating his own sessions — the rule governs agents.

Why

Legacy inventory (supersession is not done until this list is)

Surface Disposition
~/.claude/skills/tmux/drive-send.sh used for agent-to-agent sends Retired for agents. Survives only under /tmux drive (human-invoked).
Memory feedback_tmux_send_keys_authorized Done 2026-08-29 — marked superseded for coordination, own-pane gotchas retained.
wedge-heal's send-keys resubmit Done 2026-08-29 — ccswitch#40 replaced poll+send-keys with the primed --resume form.
Any future agent send-keys into a non-self pane Enforcement candidate for guard-bash.sh (a rule in the style of rule 13); not yet implemented — until then this ADR is the authority.

Consequences

Amendment — 2026-09-24: why SendMessage "didn't work", and the one carve-out

Gera, 2026-09-24: sessions "are having a hard time messaging each other… There's already a native send message command, which I was expecting they'd use… they could just do the tmux send message."

Rule 1 stands, and now it actually works. The native channel never reached peers because of our own launcher, not because of the tool. Claude Code finds peers by reading $CLAUDE_CONFIG_DIR/sessions/. ccswitch gives every session its own config dir, and until ccswitch#144 that dir's sessions/ was private. In all 168 dirs on the mini, each session could see only itself. The drivers' ListAgents said "No reachable agents" while about 60 sessions were running, and their peer sends failed. Proven with a pair of throwaway sessions: with a private registry the peer is unreachable; with the registry linked, the message is delivered mid-turn. Sessions launched after #144 share the registry. Older ones join when they respawn.

The one carve-out: a slash command the peer must RUN. A SendMessage payload arrives as prose. Claude Code never executes /compact or /driver from a message, by design. So for that case, and only that case, an agent may type into another session's pane, through wake-session <sid8> "/cmd". That path resolves the pane by pid and verifies the submit. It must never be raw tmux send-keys. Any future guard-bash.sh rule enforcing the inventory row above must allow this path.

Fallback order (manual: ~/.claude/skills/fleet/ops/reach-another-agent.md):

  1. SendMessage by name.
  2. msg <sid8> for text. Address it by sid, because by name the daemon picks a same-name fork first.
  3. wake-session <sid8> for commands.

A message is held, not delivered, when the two sessions are in different permission-mode classes (bypass vs prompting) and crossSessionInbound is unset. Whether to set it is Gera's decision; it is not made here.

Amendment — 2026-10-29: the rule reaches daemons, and the enforcement row is filled

ADR-0076, after 110 wakes were typed into Gera's main pane in one night by the review-webhook listener. Rule 1 applies to daemons as well as agents: a launchd process delivering a message to a model is communication, not hosting. The listener's send-keys path — reused by ADR-0039 and never on the legacy inventory above — is added to it and deleted; the inventory's open row ("any future agent send-keys into a non-self pane") becomes guard-bash rule 20 widened to any agent process. Own-pane process management (rule 2) is untouched. crossSessionInbound: Gera's answer on 2026-10-29 was accept fleet-wide, if the socket probe shows delivery works (ADR-0076 §5).