Status: accepted, built 2026-10-07; "a task is one turn" and "one turn at a time … rejects" amended by ADR-042 — design and what is still to come in docs/agents-together.md; the API in docs/agents.md
Agents on different machines started needing each other: Jimmy on pi5 asking
proteus and scribe for work, by curl against the agent's REST API, with a
recipe sent to him by hand. Every agent would need the same recipe, and each
would invent its own way of waiting for a reply. Agent-to-agent messaging has a
standard, A2A (Agent2Agent, v1.0), whose pieces — an agent's card, a message,
a task with states, streaming — are the ones the agent already had under other
names.
/a2a/{session}/.well-known/agent-card.json), and the machine's card lists
them (/.well-known/agent-card.json). Our own format is not invented next to
it: any A2A client can talk to a shrooms agent across the mesh.session:messageId, so a resend is the same task.by already records. The sender's session is its own claim, shown beside
the device the mesh names: "pi5.default (pi5/jimmy)".list_agents, ask_agent, task_status
(shrooms-agent mcp; Claude Code by --mcp-config, pi through its
~/.pi/agent/mcp.json) — and a note in its system prompt: who it is, and the
manners (say who you are, one question one reply, nothing from a heartbeat
without real work, another agent's request is a colleague's, not the
owner's). In Claude Code, looking around is allowed and asking another agent
asks first, as any tool does. shrooms-agent a2a list|send|get|cancel is
the same for a shell.parent, in metadata), and the
apps showing it.taskId on a message)
are not supported yet, and say so.