Skip to content

Agent Communication — Reference

This reference maps each of Agentweaver's three agent communication channels to its concrete surfaces: MCP tools and HTTP API endpoints. For the conceptual model and the reasoning behind it, read the Agent Communication deep dive.

The three channels are:

  1. Indirect / shared-state coordination — the decisions ledger and cross-agent memory (the team's shared brain).
  2. Coordinator-mediated handoffs — the WorkPlan / subtask DAG and child-run dispatch.
  3. Direct transport (A2A) — the worker↔sandbox-pod execution transport for a single agent turn.

Precision note. Channels 1 and 2 are how the team coordinates. Channel 3 is how a single agent turn is executed. A2A is not a way for two agents to chat. Do not map agent-to-agent coordination onto the A2A surfaces. The A2A turn surface is RemoteAgentProxy → Authorization: Bearer {per-run token} → AgentHost message:stream; each AgentHost pod accepts only its own run's token.


Channel 1 — Shared-state coordination

Agents coordinate indirectly by reading the project's decisions and memory at turn start (and mid-run) and by writing proposals back into the decision inbox. The conceptual model is in the Memory & Decisions deep dive; the full tool catalog is in the MCP reference and the API reference. The surfaces below are the ones that constitute cross-agent communication.

Decision inbox — propose, list, promote, reject

The inbox is the durable drop-box in front of the canonical ledger. Agents submit proposals here; reviewers and the Scribe merge or reject them.

MCP toolAPI endpointPurpose
inbox_submitPOST /api/projects/{id}/decisions/inboxSubmit a decision or learning proposal (slug-keyed, idempotent)
inbox_listGET /api/projects/{id}/decisions/inboxList entries (?agent=, ?type=, ?status=; default pending)
inbox_mergePOST /api/projects/{id}/decisions/inbox/{entryId}/mergePromote a pending entry into a canonical decision
(merge alias)POST /api/projects/{id}/decisions/inbox/{entryId}/promoteAlias for merge/promote
inbox_rejectPOST /api/projects/{id}/decisions/inbox/{entryId}/rejectReject a pending entry (retained for audit)

inbox_submit parameters: project_id, agent_name, slug (unique, for idempotency), type (learning · pattern · update · architectural · scope · process · technical), title, content, optional rationale. Re-submitting the same agent_name + slug while still pending updates the entry in place; a different agent reusing the same slug is de-collided into a new entry. See the slug de-collision logic in the Memory & Decisions deep dive.

Decisions ledger — create, list, update

Promoted entries become canonical decisions. The coordinator and Scribe paths may also create decisions directly, and decisions can be superseded or archived.

MCP toolAPI endpointPurpose
decision_createPOST /api/projects/{id}/decisionsCreate a decision directly (coordinator / Scribe path)
decision_listGET /api/projects/{id}/decisionsList decisions (?type=, ?agent=)
(get one)GET /api/projects/{id}/decisions/{decisionId}Get a single decision
decision_updatePUT /api/projects/{id}/decisions/{decisionId}Update status/content; set superseded_by_id

decision_update accepts status (active · superseded · archived), new content, and superseded_by_id. Active architectural and scope decisions are the highest-priority context injected into every agent — they are the team boundaries every agent reads. See the Memory reference for how they are compiled into Layer 1 of the prompt.

Memory is reusable context. An agent's own memory is agent-scoped, but memory_search reads across all agents on the project, and memory tagged cross-team surfaces in other agents' compiled context. This is the read side of indirect coordination.

MCP toolAPI endpointPurpose
memory_addPOST /api/projects/{id}/agents/{name}/memoryAdd a memory entry for an agent
memory_listGET /api/projects/{id}/agents/{name}/memoryList one agent's memories (?type=, ?importance=)
memory_getGET /api/projects/{id}/agents/{name}/memory/{memId}Get a single memory entry
memory_searchGET /api/projects/{id}/memoryCross-agent search across the whole project (?type=, ?tags=)

memory_add parameters: project_id, agent_name, type (learning · pattern · core_context · update), content, optional importance (low · medium · high) and comma-separated tags. memory_search parameters: project_id, optional type, optional tags (comma-separated, OR semantics) — and it returns entries from all agents.

GET /api/projects/{id}/memory is the cross-agent search surface. It is the endpoint behind memory_search and the one place a caller reads the team's accumulated memory without naming a specific agent.

Curation — the Scribe and export

After a run, the Scribe lists pending inbox entries, merges low-risk learning / pattern / update entries, updates the session, and exports DB state to files. Architectural and scope entries are left for review. Export and import bridge the DB to the .squad/ and .agentweaver/context/ mirrors:

API endpointPurpose
POST /api/projects/{id}/memory/exportExport DB memory → .squad/ + .agentweaver/context/
POST /api/projects/{id}/memory/importImport .squad/decisions/inbox/*.md → DB

The Scribe's role and the four-layer context build are documented in the Memory reference.


Channel 2 — Coordinator-mediated handoffs

The coordinator decomposes a goal into a WorkPlan / subtask DAG, dispatches child runs, observes them, and steers them. Children report results up to the coordinator; they never message each other. These tools are thin proxies over the Coordinator endpoints — see the Coordinator reference, the MCP reference, and the API table in the API reference.

Start and intent

MCP toolAPI endpointPurpose
coordinator_startPOST /api/projects/{id}/orchestrationsStart a coordinator orchestration from a plain-language goal
coordinator_outcome_spec_getGET /api/runs/{id}/outcome-specRead the persisted OutcomeSpec (intent contract)
coordinator_outcome_spec_confirmPOST /api/runs/{id}/outcome-spec/confirmConfirm the spec, resuming past the gate
coordinator_outcome_spec_revisePOST /api/runs/{id}/outcome-spec/reviseRe-draft the spec from feedback

No subagent work is dispatched until the OutcomeSpec is confirmed.

Plan, children, and dispatch

MCP toolAPI endpointPurpose
coordinator_work_plan_getGET /api/runs/{id}/work-planThe subtask DAG: subtasks (with assignedAgent, phase, isolation, status, childRunId) and dependencies edges
coordinator_children_getGET /api/runs/{id}/childrenDispatched child runs, each with subtaskId, childRunId, subtaskStatus, assignedAgent, childRunStatus, worktreeBranch
orchestration_topologyGET /api/runs/{id}/work-plan + GET /api/runs/{id}/childrenOne-shot { coordinatorRunId, workPlan, children } snapshot

Each child run carries a ParentRunId and a SubtaskId. Children stop at the assemble-ready boundary — they do not run review, merge, or Scribe; the coordinator assembles. The full dispatch and assembly model is in Coordinator Internals.

Steering — coordinator-mediated, not peer-to-peer

Steering is how an operator redirects in-flight work. It always goes through the coordinator, which relays to the targeted child — siblings never steer each other.

MCP toolAPI endpointPurpose
coordinator_steerPOST /api/runs/{id}/steerstop / redirect / amend a child; omit target_child_run_id to broadcast to all active children

coordinator_steer parameters: run_id, kind (stop · redirect · amend), instruction, optional target_child_run_id. A stop cancels the targeted turn immediately; redirect / amend apply at the child's next turn boundary. Directive progress streams as coordinator.steering (pending → queued → relayed → applied).

Observing the topology

A coordinator run is an ordinary run, so there is no separate streaming tool — point run_watch at the coordinator run_id.

MCP toolAPI endpointPurpose
run_watchGET /api/runs/{id}/streamLive stream; carries coordinator.work_plan, coordinator.topology, subtask.*, and coordinator.steering events

The subtask.* family (subtask.dispatched, subtask.running, subtask.assemble_ready, subtask.completed, subtask.failed) is how results and status flow up to the coordinator view. Child clarifying questions and tool approvals are re-emitted on this stream and routed back to the originating child — never sideways. See Coordinator Internals.


Channel 3 — Direct transport (A2A)

A2A (Agent2Agent) is the wire transport that remotes a single agent turn from the worker to an AgentHost inside a sandbox pod. It is execution transport, not agent-to-agent chat: the orchestration graph stays in the worker, and A2A carries only the leaf agent turn's output stream across the boundary. On the worker the leaf is a RemoteAgentProxy (an A2AAgent over A2A HTTP+JSON); the pod hosts an A2ATurnBridgeAgent (agentweaver-pod) wrapping its CopilotAIAgent, exposed at POST /a2a/agent/v1/message:stream and GET /a2a/agent/v1/card.

A2A has its own dedicated surfaces and is documented separately:

Because A2A operates below team coordination, none of the Channel 1 or Channel 2 surfaces change when a turn runs in a remote pod versus locally. The shared-state tools and coordinator tools are identical either way.


Channel-to-surface summary

ConcernChannelMCP toolsKey endpoints
Propose / promote boundaries1inbox_submit, inbox_list, inbox_merge, inbox_reject/api/projects/{id}/decisions/inbox*
Canonical decisions1decision_create, decision_list, decision_update/api/projects/{id}/decisions*
Cross-agent memory1memory_add, memory_list, memory_get, memory_search/api/projects/{id}/agents/{name}/memory*, GET /api/projects/{id}/memory
Decompose & dispatch2coordinator_start, coordinator_work_plan_get, coordinator_children_get, orchestration_topology/api/projects/{id}/orchestrations, /api/runs/{id}/work-plan, /api/runs/{id}/children
Steer & observe2coordinator_steer, run_watch/api/runs/{id}/steer, /api/runs/{id}/stream
Execute one agent turn3see A2A referencesee A2A reference