Running several coding agents at once can reduce elapsed time, but only when the work is genuinely independent. If two agents edit the same boundary, depend on an unsettled interface, or assume they can merge first, concurrency converts waiting time into conflict resolution.
Current tools make parallel execution easy. GitHub documents isolated agent sessions that can run simultaneously in separate workspaces and branches. Its Copilot SDK supports custom sub-agents with scoped prompts and tools, while the Copilot app exposes commands for fleet dispatch, spawning, orchestration, review, and security review. OpenAI's current model guidance likewise describes multi-agent orchestration and recommends specifying when and how subagents should handle parallel work.
Those capabilities solve dispatch. They do not decide whether a task is safe to split, prevent two branches from changing the same contract, or prove that the combined result works.
The useful operating model is a bounded parallel change set: one parent task, several independent work packets, one integration owner, and a final verification pass over the combined head.
Decide Whether Parallelism Helps
Start with the dependency graph, not the number of available agents.
Parallel work is a good fit when each packet:
- has a concrete output and acceptance test
- can proceed from stable inputs
- owns a distinct file, package, service, document, or research question
- does not need another worker's unreviewed result
- can fail without corrupting another packet
Keep work sequential when it changes a shared schema, public interface, migration order, generated artifact, lockfile, deployment configuration, or a small cluster of tightly coupled files. One agent can establish the contract first; independent workers can then fan out from that stable point.
Ask a simple question before dispatch: If this worker finishes first, can its result be reviewed on its own? If the answer is no, the packet probably still contains a hidden dependency.
Build a Task Dependency Graph
Write each work packet as a node with explicit prerequisites and outputs.
| Packet field | What to record |
|---|---|
| Goal | One observable result |
| Inputs | Stable files, decisions, APIs, and evidence |
| Ownership | Files or boundaries this worker may change |
| Non-goals | Nearby work that belongs elsewhere |
| Checks | Focused commands or review criteria |
| Output | Patch, report, decision, or test evidence |
| Dependencies | Packets that must finish first |
| Integration | How and when the result joins the parent change |
A useful graph has three phases:
- Prepare: settle shared contracts, fixtures, or decisions.
- Fan out: run only independent packets concurrently.
- Fan in: review outputs, integrate in dependency order, and test the combined result.
Do not disguise a sequence as parallel work. If packet B needs packet A's new type, endpoint, migration, or generated file, record that edge and wait for A's accepted output.
Assign Exclusive Workspace Ownership
Isolation prevents local file collisions; ownership prevents semantic collisions.
Give each implementation worker its own branch, worktree, or sandbox. Then define which files and boundaries it owns. Two isolated branches can still make incompatible changes to the same API or duplicate the same helper under different names.
Use these ownership rules:
- one writable owner per file or shared contract during the parallel phase
- read-only access outside the packet when context is needed
- no opportunistic refactors in neighboring areas
- no dependency or lockfile changes unless the packet owns them explicitly
- no merge, deployment, issue closure, or external publication authority for workers
Research and review packets are often safer to parallelize because they can remain read-only. Implementation packets need narrower ownership and stronger integration checks.
Set a Concurrency Budget
More workers increase coordination cost, tool contention, review load, and the chance that results become stale before integration. Set a concurrency budget from the work, not from the platform limit.
Consider:
- number of truly independent packets
- number of people available to review results
- shared CI, database, sandbox, or rate-limit capacity
- expected duration and likelihood of steering
- cost of reconciling conflicting outputs
Start with the smallest group that removes a real wait. Add another worker only when it owns a separate critical-path packet and someone can review its result promptly.
The parent should maintain a compact ledger with packet status, branch or workspace, latest evidence, blockers, and integration order. A dashboard full of active sessions is not a plan.
Give Every Worker a Complete Contract
Each packet should stand on its own. Include:
- the parent goal and relevant acceptance criteria
- exact repository and base revision
- owned files or boundaries
- prohibited changes and external actions
- required sources or local context
- expected output shape
- focused verification commands
- when to stop and report a blocker
Avoid telling a worker to “help with the feature.” That forces it to rediscover scope and increases overlap. Ask for one bounded result such as “inspect these three modules and return a dependency map” or “implement this adapter without changing the shared interface.”
Use specialized workers only when specialization changes the tool or context boundary. GitHub's sub-agent documentation shows separate read-only research and editing agents with distinct tool sets. The durable principle is least privilege: the worker should receive only the capabilities its packet requires.
Collect Evidence, Not Just Summaries
An agent's completion message is a claim. Require evidence that another reviewer can inspect.
For implementation packets, collect:
- changed files and diff summary
- commands run and exact outcomes
- unresolved warnings or assumptions
- base revision and result commit
- known interactions with other packets
For research packets, collect:
- direct source URLs
- dated or versioned facts
- uncertainties and conflicting evidence
- recommendation separated from sourced claims
For review packets, collect:
- findings tied to files and lines
- severity and user impact
- reproduction or reasoning evidence
- remaining test gaps
The integration owner should reject outputs that cannot be traced to a packet contract or verified independently.
Fan In Through One Integration Owner
One owner controls the combined branch and decides integration order. That role may be a person or a designated parent agent, but final acceptance remains with the accountable repository owner.
Integrate in this order:
- Shared contracts and foundational changes.
- Independent implementations that depend on those contracts.
- Tests, docs, and generated artifacts that reflect the final implementation.
- Review fixes and release metadata.
After each meaningful integration, resolve conflicts by intent rather than accepting one side wholesale. Re-run focused checks when a packet lands. Then run the full required suite on the combined head, because passing checks on separate branches do not prove the merged result works.
Use an independent review pass for cross-packet behavior. GitHub's agent-session documentation describes a separate rubber-duck agent that can critique plans, implementations, or tests with a different model. Whether the reviewer is human or automated, keep it outside the authorship path and give it the final combined diff.
Watch for Parallel-Work Failure Modes
Duplicate ownership
Two workers edit the same file or invent competing abstractions. Stop one packet, choose the canonical owner, and rebase the other packet onto the accepted contract.
Hidden dependency
A worker cannot proceed without another packet's output. Add the missing dependency edge and make the work sequential until the contract is stable.
Stale-base success
A packet passes on its original base but fails after earlier work lands. Rebase or replay the packet, then rerun its focused checks.
Review overload
Workers finish faster than results can be assessed. Reduce concurrency, prioritize critical-path packets, and avoid opening more work than the integration owner can absorb.
Shared mutable environment
Concurrent workers write to the same database, cloud project, generated directory, or deployment target. Give each packet an isolated fixture or make one owner serialize those actions.
Premature publication
A worker pushes, merges, deploys, or closes tracking work before fan-in verification. Keep publication authority with the integration owner and require final-head evidence.
A Compact Parallel-Work Checklist
Before fan-out:
- The parent goal and acceptance criteria are stable.
- Every packet has one output and an independent review path.
- Dependencies and integration order are explicit.
- Writable ownership does not overlap.
- Concurrency fits review and infrastructure capacity.
Before fan-in:
- Each packet reports its base, diff, checks, assumptions, and blockers.
- Source claims have direct links.
- Shared contracts land before their consumers.
- Conflicts are resolved by intended behavior.
Before release:
- The combined head passes required checks.
- Cross-packet behavior receives independent review.
- Production and external-write authority stayed with the owner.
- The tracking record links the final evidence.
Parallel agents are most effective when the orchestration layer does less guessing. Make dependencies visible, isolate writable ownership, limit active work to what can be reviewed, and treat the combined result as a new change that must earn its own verification.
