The default architecture is hub-and-spoke: the coordinator owns all inter-subagent communication, error handling, and routing, and decides which subagents to invoke based on the complexity of the incoming query. Subagents do not talk to each other. Letting them share findings directly looks efficient and is exactly what destroys observability — when something goes wrong, hub-and-spoke is the version where you can actually see what happened.
Left: every exchange passes through the coordinator. Right: subagents talk directly — faster round-trips, but the coordinator can no longer see what was exchanged.
Two failure shapes get conflated constantly, and telling them apart is the actual skill:
- Duplication — two subagents covering the same ground. Fix: partition scope, assigning distinct subtopics or source types per agent.
- Gaps — nobody covering some area, while every individual subagent reports success. Fix: an iterative refinement loop, where the coordinator evaluates the synthesized output for coverage gaps, re-delegates targeted queries to fill them, and re-invokes synthesis — repeating until coverage is sufficient. A one-shot decompose-then-synthesize pipeline is the naive form that can't self-correct.
A third failure mode sits underneath both: overly narrow decomposition. Split a broad topic too finely — say, a "AI in creative industries" report sliced into digital art, graphic design, and photography — and every subagent can succeed completely at its assigned slice while the aggregate still misses whole categories (music, writing, film) that were never assigned to anyone. The root cause here isn't any subagent's execution; it's the coordinator's decomposition. Blaming a downstream agent's search quality or relevance filtering when the actual problem is the assignment it was given is the single most repeated trap in this task statement. Adding more subagents doesn't fix a scoping problem either — it just gives the narrow slices more helpers.