concord ai

AI agent coordination keeps agents from stepping on each other

What coordination means for AI agents in a codebase and how it differs from orchestration, with concrete examples.

Albin Jaldevik, AI Engineer9 min read

the short answer

AI agent coordination is the shared workspace that tells each agent who owns which task, what is in scope, what decisions have been made and what others are waiting on, so independently running agents do not conflict.

Abstract technical illustration for the article AI agent coordination keeps agents from stepping on each other

When you run two or more coding agents on the same codebase, the work they do only becomes useful if they avoid stepping on each other. Coordination is the shared workspace that tells each agent who owns which task, what files or interfaces are in scope, which decisions have already been made and what another agent is waiting on, so independently running agents do not conflict. Orchestration decides what runs, coordination keeps what is already running from conflicting.

Defining coordination in concrete terms

In a shared codebase, coordination answers four questions for every agent at every moment. First, who owns which task and what is the task’s status. Second, which files or interfaces are in scope for that task, so another agent does not edit the same area. Third, which decisions have already been made and must be respected by future work. Fourth, what another agent is waiting on before it can proceed, so you do not block progress by starting work that depends on an unfinished decision.

These four pieces of shared state are the difference between agents that work in parallel without surprises and agents that overwrite each other’s changes or waste time on already-solved problems. Without coordination, each agent keeps its context in a private session. Context only surfaces when a pull request arrives, at which point mistakes are expensive to fix.

Worked example one: overlapping scopes

Imagine two agents are asked to add a new field to a user record. Agent A is told to add a lastSeenAt timestamp. Agent B is told to add a deviceId field. Both tasks touch src/models/User.ts. Without coordination, both agents start editing the same file, introduce merge conflicts and waste CPU cycles on a problem that one agent could have surfaced immediately.

With coordination, the first agent to claim the task records the files it will edit. When the second agent tries to claim the same task or a related one, the system shows an overlap warning that lists the files already in scope for the first task. The second agent can either choose a different task, negotiate scope with the first agent, or wait until the first task finishes and the files are no longer contested.

json

{
  "task": "Add lastSeenAt timestamp",
  "owner": "agent-a",
  "scope": ["src/models/User.ts"],
  "status": "in_progress"
}

The overlap warning arrives when an agent claims work, which the five tools each contribute to in a different way. start_work registers the agent’s presence and scope. inspect_work reads the current state so the second agent can see the warning. transfer_work lets the first agent release the files once done. Until then, the second agent sees the conflict and can reconsider its plan.

Worked example two: recorded decisions

Suppose you have three agents working on a checkout flow. Agent C designs the database schema, Agent D writes the API layer and Agent E implements the frontend. Agent C decides to store paymentMethodId instead of paymentMethod for normalization. If Agent D and Agent E do not know this decision, they may design interfaces around the wrong field name, creating rework later.

Coordination records that decision in shared state the moment Agent C makes it. Agent D and Agent E read the decision when they start their tasks, so their code aligns with the schema without extra prompts or meetings. The decision is recorded as typed intent, so reviewers can see the rationale when the work is handed off.

json

{
  "decision": "Use paymentMethodId for normalization",
  "made_by": "agent-c",
  "timestamp": "2025-06-04T14:32:00Z",
  "rationale": "Avoids string duplication and supports multiple payment methods"
}

Agents record decisions with update_work, which appends typed intent, assumptions and findings to the shared workspace. When Agent D and Agent E inspect their tasks, they see the decision and can proceed without second-guessing the schema. This reduces the time between finishing a task and handing it off to the next agent, because the next agent does not need to rediscover the decisions that shaped the work.

Worked example three: handoff and blocking waits

Agent F implements a new authentication flow. Agent G must add logging once the authentication flow is live, because the logs depend on the new endpoints. Without coordination, Agent G starts work without knowing Agent F’s progress, risks building on an unstable interface, or wastes time on a feature that will change soon.

With coordination, Agent G records that its work depends on Agent F finishing the authentication endpoints. Agent F, in turn, marks its task as blocked until the endpoints are stable. When Agent F finishes its task, it calls finish_work to record the changes and mark the task review-ready. Agent G sees the state change, starts its logging work with the stable interface, and marks its own task as ready once done.

json

{
  "task": "Add authentication endpoints",
  "owner": "agent-f",
  "blocked_on": [],
  "status": "in_progress"
}

{
  "task": "Add logging for auth flow",
  "owner": "agent-g",
  "blocked_on": ["Add authentication endpoints"],
  "status": "pending"
}

The shared workspace becomes a single source of truth for dependencies. Agents read blocked_on fields to know what to wait for, and call transfer_work to accept or decline handoffs. When the last agent finishes, the task is review-ready and reviewers see the recorded context instead of piecing together a changelog from private sessions.

Why coordination is not orchestration

Orchestration decides what runs. Coordination keeps what is already running from conflicting. Orchestration answers which agent should implement a feature, when it should run and what priority it has. Coordination answers who owns which task now, what is in scope, what decisions have been made and what others are waiting on.

A system can orchestrate agents without coordination. For example, an orchestrator can assign tasks to agents in a queue, but if the agents keep their context private, they still risk overlapping scopes, duplicate decisions and unresolved waits. Conversely, a system can coordinate agents without orchestrating them. Agents can claim tasks on their own, but if the system provides shared state for ownership, scope and decisions, the agents avoid conflicts even without a central scheduler.

The difference is visible when you add a third agent. An orchestrator assigns the agent a task, but if the new agent starts editing files already in scope for another task, the system has no way to surface the overlap unless coordination is also in place. Coordination provides the shared state that makes orchestration safe, but coordination can also stand alone to keep independently running agents from conflicting.

What happens when coordination is missing

Without coordination, agents rely on private sessions. Each agent’s context lives in its own prompt history, so decisions, assumptions and file scopes never leave the agent’s session until a pull request arrives. When the pull request appears, reviewers see the final code but not the reasoning behind it, the scope of earlier decisions or the dependencies between tasks.

This leads to three common failure patterns. First, reviewers ask agents to re-explain decisions that were already made, because the decisions were never recorded. Second, agents overwrite each other’s changes because they edited the same file without knowing the other was working there. Third, tasks are blocked because no one knows who owns the next step, so work stalls until a human intervenes.

These patterns waste CPU cycles and human time. Agents repeat work that was already done. Reviewers spend cycles reconstructing context instead of reviewing the code. Humans spend time assigning tasks and resolving conflicts that the system could have surfaced automatically.

How the five coordination tools fit together

The MCP tools for coordination are not separate products. They are the primitives that let agents read and write shared state while they work. start_work registers an agent’s presence, claims or accepts a task and surfaces scope overlaps before editing. inspect_work reads workspace or task state, an agent’s inbox and outbox or a prompt/reply thread. update_work appends typed intent, decisions, assumptions and findings or prompts another agent live. transfer_work assigns, accepts, declines, releases, reassigns, offers a handoff or reopens versioned work. finish_work records changes, tests, risks and decisions, then marks the task review-ready before the pull request.

Each tool contributes a piece of the shared state. Together they turn private sessions into a shared workspace where agents do not step on each other’s work. The tools sequence around a task: an agent starts work, inspects the current state, updates decisions, transfers ownership if needed and finishes with recorded context ready for review.

Coordination does not decide what runs. It decides what does not conflict while it runs.

When coordination matters most

Coordination matters whenever multiple agents touch the same files, share interfaces or depend on each other’s decisions. Examples include adding new fields to shared models, refactoring core utilities used by several services, designing APIs that multiple clients consume, or implementing features that depend on shared infrastructure like authentication or databases.

If every agent works in isolation, coordination is optional. But once two agents edit the same file or rely on the same decision, coordination becomes the difference between agents that work in parallel and agents that create rework. The more shared state exists in a codebase, the more coordination matters.

How to choose a coordination approach

If you already run coding agents with shared prompts or a central orchestrator, ask whether those systems surface ownership, scope and decisions in real time. If not, the system is orchestrating but not coordinating. Agents still risk overlapping scopes and duplicate decisions, and reviewers still reconstruct context from pull requests.

If you use MCP-capable agents like Claude Code, Cursor or Codex, the coordination primitives are already available as tools. You do not need a new agent or a new orchestrator. You need to wire the tools together so agents read and write shared state while they work.

For teams that need a shared workspace out of the box, a local MCP server and CLI like Concord AI provides presence, task memory, ownership, agent-to-agent messaging and review evidence in one place. It is not a replacement for your agents. It is the shared workspace your agents call while they work.

Option one: build the primitives yourself

You can implement the five tools on top of any MCP server. Store task state in a JSON file or database, expose the tools via MCP, and wire agents to call them before and during work. The cost is maintaining the shared state and ensuring agents actually use it. If an agent skips a tool call, the system reverts to private sessions and the usual failure patterns return.

Option two: use an existing MCP server

Several open source MCP servers expose coordination primitives. The Concord MCP server implements the five tools and adds presence, inbox, outbox and review evidence. Other servers may provide similar features, so evaluate whether they surface ownership, scope and decisions in the way your agents need.

Option three: a shared workspace for teams

Teams that coordinate across repositories and machines will soon have a hosted option. Concord Cloud is coming soon and provides a shared workspace for agents working across repositories, machines and time zones. Until then, a local MCP server and CLI is the fastest way to give agents a shared workspace without rewriting tooling.

Whichever option you choose, the goal is the same: turn private sessions into shared context. Agents should not have to rediscover decisions, negotiate scope or resolve conflicts after the fact. Coordination keeps agents from stepping on each other while they work, so the only surprises that reach reviewers are the ones that belong in code review.

ai agent coordinationcoding agent coordinationmulti-agent coordinationagent handoffagent conflict resolutionai agent memorycoding agent memoryai agent context sharing

Common questions

What’s the difference between coordination and orchestration for coding agents?
Orchestration decides which agent runs a task and when. Coordination keeps multiple agents from stepping on each other while they work, by tracking ownership, scope and pending decisions across tasks.
How do agents know what another agent is already doing?
Agents read a shared state that records ownership, in-scope files and pending decisions. When an agent tries to claim work that overlaps, the system warns them before they start editing.
What happens when an agent finishes its task?
The agent records its changes, tests, risks and decisions, then marks the task ready for review. Reviewers see the recorded context instead of reconstructing it from a pull request.
Can two agents work on the same file at the same time?
Not safely. Coordination prevents overlap by surfacing scope overlaps before edits begin. If two agents need the same file, they must coordinate outside the shared workspace or reassign the work.
What tools actually implement this coordination?
The MCP tools `start_work`, `inspect_work`, `update_work`, `transfer_work` and `finish_work` together provide presence, ownership, messaging and evidence in one shared workspace.

written by

Albin Jaldevik, AI Engineer

Works on agent workflows, review evidence, and keeping generated code reviewable.

Give your agents one shared work-state.