Parallelism: When Parallel Agents Earn Their Overhead

Introduction: The Arithmetic Nobody Does Before Dispatching

Adding agents adds work. That is the uncomfortable starting point of the Superpowers parallel agents theme, and it is the sentence that separates teams that get faster from multiple subagents from teams that just get more busy. A sequential run costs roughly the sum of its tasks. A parallel run costs something different: dispatch (writing a self-contained brief per lane) plus the longest lane plus integration (reading every report back, checking for conflicts, verifying the pieces work together). Parallelism wins only when collapsing the sum beats the two new terms it introduces — and there are whole classes of work where it doesn’t.

The three skills that make up this theme each answer a different part of the question. dispatching-parallel-agents is the mechanics: how to write a brief and run lanes concurrently. subagent-driven-development is the discipline: fresh context per task, a review gate per diff, and a hard rule about what may never run concurrently. executing-plans is the honest baseline: the sequential checklist that is often the right answer, and always the fallback when the parallel math doesn’t close.

This article is the decision procedure between them — grounded in a real audit where the answer was yes, and the failure modes where the answer is no.

Real Example: The SYNAS Storage + Network Parallel Audit

SYNAS is a home lab server running 32 Docker containers across 26 networks on OpenMediaVault — 62 GB of RAM, game servers, an n8n/Tactical RMM stack, an LLM stack, Plex, Vaultwarden. The job was a full health audit. Read as one task, it is a monster: image hygiene, volume usage, writable-layer waste, network topology, attachment mapping, isolation quality, orphan detection. Read as the decision tree below prescribes, it is three lanes — and two of them are textbook-parallel.

A storage lane (image and container disk usage, volume inventory, build cache, dangling artifacts) and a network lane (every network, every attachment, isolation assessment, orphans) share nothing: different commands, different data, different conclusions, zero file overlap. Both are read-only. So the orchestrator dispatched both as a single batched call and let them run concurrently, while the third lane — the health roll-up, which depends on what the other two find — waited its turn.

Both subagents finished in roughly three minutes. Sequentially, the same work was about six minutes of wall clock — a two-for-one, respectable but not the headline. The headline is what isolation bought: each agent could hold its entire lane in context — dozens of command outputs, cross-referenced line by line — in a window dedicated to exactly one question, while the controller stayed lean for integration. What came back was evidence, not vibes:

Three rules made this safe, and they are worth naming because they are the ones people skip. The lanes were read-only — auditors that can’t edit can’t conflict. The prompts were self-contained — each said what to run, what to conclude, and in what format to return, without inheriting session history. And the toolsets were least-privilege — terminal and files for a disk auditor; a browser open on an audit lane is one accidental detour from a wasted run. Headline claims got re-checked with fresh commands before anything shipped, which is the executing-plans contract applying to parallel output: a subagent’s summary is a report to verify, not a fact to paste.

The Decision Tree: Independent? Parallelizable? Shared State?

The skills agree on one procedure. Before any dispatch, answer three questions in order — the order matters, because each gate is cheaper to test than the next.

Is this 2+ tasks in genuinely different problem domains?
│   (each can succeed or fail without affecting the others)
├─ No → SEQUENTIAL. One agent holding the whole picture.
└─ Yes ↓
Can each task be briefed self-contained?
│   (goal + context + constraints + output format, no session history)
├─ No → You're still in discovery. Brainstorm first, then re-ask.
└─ Yes ↓
Any shared state? (same files, same config, same mutable resource)
├─ Yes → SERIALIZE the contended resource, or split the state
│        (git worktrees), then re-ask.
└─ No → DISPATCH IN PARALLEL. Batch the lanes, one domain each.

Gate one kills most bad dispatches. “Two tasks” is not the test; “independent problems” is. Fixing a validation bug and fixing a formatting bug in the same request pipeline are two tasks with one problem domain — the second agent redoes the first one’s investigation to learn what a request even looks like. Gate two is the briefing test: if you cannot write a lane’s brief without pasting your session’s history into it, the decomposition is fake — the lanes aren’t self-contained, they’re just your context cut into pieces. Gate three is where correctness lives. Shared mutable state is the one condition no amount of prompt engineering fixes, which is why subagent-driven-development forbids parallel implementers by name.

When Parallelism Helps

Multiple systems to check, each with its own scope. This is the SYNAS shape: storage and network are different subsystems with different commands and different definitions of “healthy.” Any inspection task that naturally splits along subsystem lines — disk vs. network, backend vs. frontend, service A vs. service B — is a candidate, because independence came from the domain, not from your imagination.

Read-only sweeps. Audits, research passes, log analysis across unrelated services, test suites that exercise different code. Read-only lanes cannot corrupt each other, so the worst failure mode is a wasted run rather than a corrupted system — and a wasted run costs minutes, not a restore.

Genuinely different failures in different files. Three tests failing in three separate modules, each with its own pasteable error and its own test command, is the canonical batch in the skill: one goal, one brief, one scoped verification per lane.

Two practical ceilings belong in the math. Hermes’ batch dispatch runs up to three subagents concurrently with a maximum nesting depth of two — agents cannot spawn their own reviewers — so six lanes is not six-way speedup; it’s two waves of three, and the queue time is real. And the serial fraction of any job caps the win exactly the way Amdahl’s law says: briefing and integration are sequential no matter how many lanes run, so five lanes on a job that is 40% integration top out just under two times faster, not five.

When It Hurts

Related failures. If fixing one problem might fix the others — three symptoms, one root cause — parallel agents are three billings for one insight, and worse, they will each build a confident local theory from partial evidence before any of them sees the pattern. The skill’s warning is explicit: investigate together if fixing one might fix the rest. Related failures want one mind and one evidence trail.

Shared state. Two implementers editing the same tree is a guaranteed conflict, and the conflict is worst where review is concerned: each agent’s self-review sees a working tree another agent is mutating underneath it, so the thing being reviewed isn’t the thing either of them wrote. subagent-driven-development handles this structurally — its task loop is sequential, a fresh subagent per task, never alongside another — and reserves parallel dispatch for lanes like SYNAS’s: read-only, disjoint, mergeable by inspection. If the shared state is a git branch rather than a live system, isolation can be manufactured with git worktrees; if it’s a database, a config file, or a running server, serialize.

Exploratory debugging. Parallelism presumes you already know where the seams are. While you’re still discovering what’s broken, those seams are guesses, and every lane dispatched on a wrong seam manufactures confident findings about a boundary that doesn’t exist. This is the domain of systematic debugging — one tight loop of evidence, pattern, hypothesis, test. Decompose after diagnosis, not during it.

Smell in the workVerdict
Different subsystems, different commands, no shared filesParallel — dispatch the batch
Read-only audits or research sweepsParallel — safe by construction
Fixing lane A might fix lane BSequential — one agent, whole picture
Lanes would edit the same filesSerialize, or split with worktrees
You can’t write the brief without pasting historyNot decomposed yet — brainstorm first
You’re still finding out what’s brokenSequential debugging loop
Lane runs about as long as its briefing takesSequential — overhead eats the win

How the Three Skills Interact

The theme is not three tools in a bag; it’s a pipeline with roles. executing-plans owns the checklist: it loads the plan, works it task by task, and at each checkpoint is also where the sequential-or-parallel call gets made. In the SYNAS run, the plan said “audit storage and network”; the controller ran the decision tree, got three green gates, and only then reached for concurrency.

dispatching-parallel-agents supplies the mechanics for a green-lit checkpoint. Every lane gets a prompt with the skill’s four properties — focused (one problem domain), self-contained (paste the errors, paths, and commands; the agent has no memory of your session), specific about output (name the report format), and constrained (say what not to touch). Least-privilege toolsets ride along. And the skill owns the part everyone forgets: the post-return loop. Read every summary, check that lanes didn’t step on each other, run the full verification across the merge, and spot-check claims — subagents make systematic errors at scale, one wrong assumption times N lanes.

subagent-driven-development is what keeps the whole theme honest. Its whole premise is isolation for focus — a fresh subagent per task — but its task loop is deliberately sequential with a two-stage review (spec compliance, then code quality) after every task, because implementation lanes share the one thing audits don’t: a tree they’re both writing. It also brings the ledger, a detail that matters doubly in parallel runs: when the controller’s context compacts mid-run, the ledger — not the chat — is what prevents re-dispatching lanes that already finished. The composition rule the three skills converge on: dispatch decides how a checkpoint runs; subagent-driven development decides what a checkpoint must produce before it counts; executing-plans provides the checklist they both hang on.

Common Mistakes at Dispatch Time

MistakeFix
Goal spans two problem domainsSplit the lane or drop the batch — one domain per agent
Brief assumes shared memoryPaste errors, paths, and commands; agents inherit nothing
No constraintsSay what NOT to change; silence reads as permission
“Report what you find”Name the output contract: format, claims, evidence
Trust-the-summary integrationRe-verify headline claims with fresh commands before shipping
Unbounded concurrency appetiteRespect the batch ceiling: three lanes, depth two

Related Deep Dives in the Series

Key Takeaways

Previous in the theme series: Planning → Execution. Next: Verification & Quality. Full mechanics in the dispatching-parallel-agents deep dive, or browse the Skills We Use series index.