<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software-Engineering on Corebaseit — POS · EMV · Payments · AI</title><link>https://corebaseit.com/tags/software-engineering/</link><description>Recent content in Software-Engineering on Corebaseit — POS · EMV · Payments · AI</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>contact@corebaseit.com (Vincent Bevia)</managingEditor><webMaster>contact@corebaseit.com (Vincent Bevia)</webMaster><lastBuildDate>Tue, 14 Apr 2026 10:00:00 +0100</lastBuildDate><atom:link href="https://corebaseit.com/tags/software-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>I Spent Years on Adaptive Filters. I Was Already Training Neural Networks.</title><link>https://corebaseit.com/corebaseit_posts_in_review/lms-adaptive-filters-and-neural-network-training/</link><pubDate>Tue, 14 Apr 2026 10:00:00 +0100</pubDate><author>contact@corebaseit.com (Vincent Bevia)</author><guid>https://corebaseit.com/corebaseit_posts_in_review/lms-adaptive-filters-and-neural-network-training/</guid><description>&lt;p>&lt;strong>I spent years implementing LMS-based equalizers and echo cancellers in telecommunications. Only later did I fully appreciate what I had been doing mathematically: the same family of update rules that powers neural network training today.&lt;/strong>&lt;/p>
&lt;p>Not as a loose analogy — as the same structure of optimization. Widrow and Hoff formalized the Least Mean Squares (LMS) algorithm in 1960 for the Adaline. Rumelhart, Hinton, and Williams scaled related ideas through multi-layer networks with backpropagation in 1986. The vocabulary changed from &lt;em>adaptive filtering&lt;/em> to &lt;em>deep learning&lt;/em>, but the core idea — adjust parameters in the direction that reduces error, one small step at a time — is continuous across both worlds.&lt;/p>
&lt;p>This post is my attempt to make that lineage explicit: what LMS actually is, why it is structurally the same rule as stochastic gradient descent on a linear model, how the engineering trade-offs line up, and why non-stationarity remains the hard problem in both domains.&lt;/p>
&lt;hr>
&lt;h2 id="lms-is-not-a-metaphor-for-training--it-is-the-algorithm">LMS Is Not a Metaphor for Training — It Is the Algorithm
&lt;/h2>&lt;p>The LMS update for a linear combiner (FIR filter or single Adaline) is:&lt;/p>
&lt;p>$$
\mathbf{w}(n+1) = \mathbf{w}(n) + \mu , e(n) , \mathbf{x}(n)
$$&lt;/p>
&lt;p style="text-align: center;">
&lt;img src="https://corebaseit.com/diagrams/LMS_SGD_structural_equivalence_diagram.png" alt="LMS = SGD structural equivalence diagram" style="max-width: 900px; width: 100%;" />
&lt;/p>
&lt;p>Here (\mathbf{w}(n)) is the weight vector at time (n), (\mathbf{x}(n)) is the input vector (tap-delay line or feature vector), (e(n) = d(n) - y(n)) is the error between the desired response (d(n)) and the output (y(n) = \mathbf{w}^\top(n)\mathbf{x}(n)), and (\mu) is the step size.&lt;/p>
&lt;p>That is &lt;strong>stochastic gradient descent&lt;/strong> on the instantaneous squared error (\frac{1}{2}e^2(n)) with respect to (\mathbf{w}). The gradient of (\frac{1}{2}(d - \mathbf{w}^\top\mathbf{x})^2) with respect to (\mathbf{w}) is (-e,\mathbf{x}). Walking in the opposite direction of the gradient (or equivalently, in the direction (+e,\mathbf{x}) when you define the update as above) is exactly the LMS rule.&lt;/p>
&lt;p>So if you have ever shipped an LMS equalizer or echo canceller, you have implemented the foundational learning rule that underlies a huge fraction of modern machine learning: &lt;strong>small steps proportional to error times input&lt;/strong>. The notation in Haykin&amp;rsquo;s &lt;em>Adaptive Filter Theory&lt;/em> differs from PyTorch docs; the mathematics does not.&lt;/p>
&lt;p>Multi-layer networks add the chain rule (backpropagation) to compute how error propagates to earlier layers, but the &lt;strong>local&lt;/strong> update at a linear layer trained with mean squared error is still the same structural move: adjust weights in proportion to error and activations. Everything else — momentum, Adam, adaptive learning rates — is engineering on top of that spine.&lt;/p>
&lt;hr>
&lt;h2 id="the-engineering-trade-offs-are-the-same-trade-offs">The Engineering Trade-Offs Are the Same Trade-Offs
&lt;/h2>&lt;p>In telecommunications, the step size (\mu) controls the classic compromise: &lt;strong>convergence speed versus steady-state misadjustment&lt;/strong>. Too large — the filter can diverge or oscillate. Too small — the filter cannot track a fast-fading channel or a moving echo path. Entire chapters of adaptive filtering textbooks are devoted to stability bounds on (\mu) (often expressed in terms of input power and filter length) and to variants that fix the worst-case behavior.&lt;/p>
&lt;p style="text-align: center;">
&lt;img src="https://corebaseit.com/diagrams/Step_size_learning_rate_trade-off_diagram.png" alt="Step size / learning rate trade-off diagram" style="max-width: 900px; width: 100%;" />
&lt;/p>
&lt;p>In deep learning, the learning rate (\eta) plays the same role at a higher level: too high and training diverges or chatters around a minimum; too low and you underfit or burn compute without making progress. The community talks about learning-rate schedules, warm-up, and cosine decay — different names for the same instinct: &lt;strong>the right step size depends on the landscape and may need to change over time&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Normalized LMS (NLMS)&lt;/strong> scales the update by the inverse of the input energy (|\mathbf{x}(n)|^2) (with a small regularizer to avoid division by zero). The goal is stable convergence when input power varies — the same motivation that shows up in adaptive optimizers that normalize updates by running statistics of gradients (RMSProp-style normalization is not identical to NLMS, but the &lt;em>intent&lt;/em> — tame the step when the signal scale changes — is shared). The DSP community spent decades refining these ideas for real-time hardware; ML rediscovered many of the same pressures when training became unstable at scale.&lt;/p>
&lt;hr>
&lt;h2 id="non-stationarity-was-always-the-real-problem--and-still-is">Non-Stationarity Was Always the Real Problem — and Still Is
&lt;/h2>&lt;p>Adaptive filters were built for &lt;strong>non-stationary&lt;/strong> environments: multipath fading, time-varying echoes, drifting noise floors. The “true” optimal weights are not fixed; they move. The filter is not supposed to converge once and freeze — it is supposed to &lt;strong>track&lt;/strong>. That mindset is closer to production ML than a static batch fit on a fixed dataset.&lt;/p>
&lt;p>Modern systems face the same phenomenon under different labels: &lt;strong>distribution shift&lt;/strong>, &lt;strong>concept drift&lt;/strong>, stale features, changing user behavior, adversarial drift in inputs. The model that was optimal last month is not guaranteed to be optimal this month. Retraining on a schedule, online updates, monitoring, and guardrails are the engineering response — conceptually in the same family as “never assume the channel is static.”&lt;/p>
&lt;p>Research on in-context learning in linear models (for example Akyürek et al., 2022) even investigates which learning algorithms are implicitly approximated by transformers under simplified settings — another reminder that the boundary between classical adaptive signal processing and contemporary ML is thinner than course catalogs suggest.&lt;/p>
&lt;hr>
&lt;h2 id="the-bigger-picture">The Bigger Picture
&lt;/h2>&lt;p style="text-align: center;">
&lt;img src="https://corebaseit.com/diagrams/Historical_lineage_timeline_diagram.png" alt="Historical lineage / timeline diagram" style="max-width: 900px; width: 100%;" />
&lt;/p>
&lt;p>For engineers who came up through &lt;strong>telecommunications and signal processing&lt;/strong>, the move into AI is often described as a career pivot. In my experience, it is closer to a &lt;strong>change of vocabulary&lt;/strong> on top of a continuous mathematical thread: error-driven updates, step-size discipline, stability under non-stationarity, and the centrality of second-order statistics (explicitly in LMS, implicitly in much of modern training).&lt;/p>
&lt;p>The boundary between DSP and machine learning was never as sharp as the literature implied. If you understand LMS, you already understand a piece of what every deep learning framework is doing when it steps the weights. The rest is scale, architecture, and tooling — important, but not magic.&lt;/p>
&lt;hr>
&lt;h2 id="references">References
&lt;/h2>&lt;ul>
&lt;li>Widrow, B., &amp;amp; Hoff, M. E. &amp;ldquo;Adaptive switching circuits.&amp;rdquo; &lt;em>IRE WESCON Convention Record&lt;/em>, 4, 96–104, 1960.&lt;/li>
&lt;li>Haykin, S. &lt;em>Adaptive Filter Theory&lt;/em> (4th ed.). Prentice Hall, 2002.&lt;/li>
&lt;li>Rumelhart, D. E., Hinton, G. E., &amp;amp; Williams, R. J. &amp;ldquo;Learning representations by back-propagating errors.&amp;rdquo; &lt;em>Nature&lt;/em>, 323, 533–536, 1986.&lt;/li>
&lt;li>Akyürek, E. et al. &amp;ldquo;What learning algorithm is in-context learning? Investigations with linear models.&amp;rdquo; 2022. &lt;a class="link" href="https://arxiv.org/abs/2211.15661" target="_blank" rel="noopener"
>arxiv.org/abs/2211.15661&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="further-reading">Further reading
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts/stochastic-entropy-ai/" >Stochastic, Entropy &amp;amp; AI: From Thermodynamics to Information Theory to Modern Machine Learning&lt;/a> — related thread on probability, information, and ML foundations&lt;/li>
&lt;li>&lt;em>The Obsolescence Paradox: Why the Best Engineers Will Thrive in the AI Era&lt;/em> — engineering judgment as tools and vocabulary change&lt;/li>
&lt;/ul></description></item><item><title>Multi-Agent Systems Scale Vertically. They Need to Scale Horizontally.</title><link>https://corebaseit.com/corebaseit_posts_in_review/series/multi-agent-systems-scale-vertically_part3/</link><pubDate>Fri, 03 Apr 2026 10:00:00 +0100</pubDate><author>contact@corebaseit.com (Vincent Bevia)</author><guid>https://corebaseit.com/corebaseit_posts_in_review/series/multi-agent-systems-scale-vertically_part3/</guid><description>&lt;p>&lt;em>This post continues the ideas explored in &lt;a class="link" href="https://corebaseit.com/posts_in_review/super-agents-multi-agent-communication/" >Part I: Super Agents and Multi-Agent Communication&lt;/a> and &lt;a class="link" href="https://corebaseit.com/posts_in_review/swarm-intelligence-opposite-architectural-bet/" >Part II: Swarm Intelligence&lt;/a>. Those posts covered how agents coordinate within a workflow. This one asks what happens after the workflow ends.&lt;/em>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>After spending time with the orchestrator pattern and the swarm pattern, I kept running into the same gap — one that the field has not been honest enough about.&lt;/strong>&lt;/p>
&lt;p>Agents can communicate within a workflow. They can share state, hand off tasks, and coordinate through structured message protocols. I covered all of that in the previous posts, and all of that is solved. What is not solved is this: once the run completes and the agents figure out how to handle a complex workflow, that knowledge stays isolated. The next run starts cold.&lt;/p>
&lt;p>That is the vertical scaling trap. And the more I read — across Reflexion, ERL, Letta&amp;rsquo;s stateful agent work, and Google Research&amp;rsquo;s recent findings on scaling agent systems — the more I realized this is the most important unsolved problem in multi-agent architecture today.&lt;/p>
&lt;hr>
&lt;h2 id="what-vertical-scaling-actually-means">What Vertical Scaling Actually Means
&lt;/h2>&lt;p>The industry has concentrated its investment on making individual agents more capable in isolation — longer context windows, stronger reasoning models, richer tool sets, more compute per inference call. This is vertical scaling: more depth, more power, more intelligence concentrated in a single node.&lt;/p>
&lt;p>Vertical scaling has delivered real gains. Modern LLM-based agents can handle significantly longer reasoning chains, maintain larger working memories, and invoke more complex tool sequences than agents from two years ago. The benchmark numbers confirm this.&lt;/p>
&lt;p>But vertical scaling has a ceiling, and that ceiling is architectural, not computational. No matter how capable a single agent becomes, a system of agents that starts each run from a blank slate cannot accumulate collective intelligence over time. Every execution is, in a meaningful sense, the first time that system has encountered the problem.&lt;/p>
&lt;p>That is the definition of a system that does not learn.&lt;/p>
&lt;hr>
&lt;h2 id="the-statefulness-illusion">The Statefulness Illusion
&lt;/h2>&lt;p>This was the part that clarified the problem most for me. LLM agents are stateless by design. The model itself has no memory between API calls — every inference starts fresh, bounded by what exists inside the current context window. What looks like agent memory in most production frameworks is actually infrastructure built around the model: conversation history injected into the prompt, vector stores queried at retrieval time, workflow state persisted in an external database.&lt;/p>
&lt;p>The agent does not remember. The infrastructure remembers. And the agent only knows what the infrastructure decides to surface at inference time.&lt;/p>
&lt;p>This distinction matters because it exposes the scope of what is currently being solved. Stateful agent frameworks — LangGraph, MemGPT/Letta, Amazon Bedrock AgentCore Memory, and others — address continuity &lt;em>within&lt;/em> a workflow and &lt;em>within&lt;/em> a user session. They do not address what happens between runs, across agent instances, or across different executions of the same workflow by different users.&lt;/p>
&lt;p>Each agent run, regardless of the framework, is still largely isolated from the accumulated experience of every run that came before it.&lt;/p>
&lt;hr>
&lt;h2 id="the-horizontal-scaling-problem">The Horizontal Scaling Problem
&lt;/h2>&lt;p>Horizontal scaling in multi-agent systems means something different from what the term usually implies in infrastructure. It is not about running more agent instances in parallel — that is a load distribution problem, and it is solved. The horizontal scaling problem I&amp;rsquo;m describing is about propagating learned competence across agents and across runs.&lt;/p>
&lt;p>When I mapped the gap concretely, it looked like this:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Capability&lt;/th>
&lt;th>Current State&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Agents share state within a run&lt;/td>
&lt;td>Solved&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Agents communicate within a workflow&lt;/td>
&lt;td>Solved&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Agent learns within a run (self-reflection)&lt;/td>
&lt;td>Partial — Reflexion&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Successful strategy propagates to next run&lt;/td>
&lt;td>Not solved&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Knowledge discovered by one agent available to others&lt;/td>
&lt;td>Not solved&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Collective intelligence accumulates over time without retraining&lt;/td>
&lt;td>Not solved&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The bottom three rows represent the horizontal scaling gap. It is not a matter of framework maturity — it is an architectural primitive that does not yet exist in production multi-agent systems.&lt;/p>
&lt;hr>
&lt;h2 id="what-the-field-has-built-as-workarounds">What the Field Has Built as Workarounds
&lt;/h2>&lt;p>Research and engineering teams have made partial progress, and it&amp;rsquo;s worth naming what exists honestly.&lt;/p>
&lt;p>&lt;strong>Shared episodic memory stores.&lt;/strong> Agents can write successful reasoning traces or strategy summaries to a vector database that future agent instances retrieve via RAG. This is useful, but the memory is static once written. It does not update based on outcomes, and retrieval quality determines whether the right experience surfaces at the right moment.&lt;/p>
&lt;p>&lt;strong>Reflexion and its descendants.&lt;/strong> Reflexion (Shinn et al., NeurIPS 2023) introduced a framework where agents verbally reflect on task feedback and store those reflections in an episodic memory buffer to improve decision-making in subsequent trials — without modifying model weights. This is a genuine step forward, and it&amp;rsquo;s the work that first made me think seriously about this problem. But Reflexion is fundamentally a within-run or within-session mechanism. The reflective memory does not propagate across agent instances or persist as a shared resource across independent runs.&lt;/p>
&lt;p>&lt;strong>ExpeL and Experiential Reflective Learning.&lt;/strong> More recent work, including ExpeL (Zhao et al., 2024) and ERL (2025), extracts reusable heuristics by comparing successful and failed trajectories, then injects the most relevant heuristics into future agent contexts via retrieval. This is directionally correct. ERL reports a +7.8% improvement over a ReAct baseline on complex agentic benchmarks precisely because failure-derived heuristics provide negative constraints that prune ineffective strategies. But even here, the experience pool is curated offline, retrieval is still prompt injection, and the feedback loop is not real-time.&lt;/p>
&lt;p>&lt;strong>Prompt distillation and fine-tuning.&lt;/strong> Successful agent runs can generate training data that feeds a fine-tuning pipeline. This is horizontally scalable in principle — the knowledge of one run eventually improves the base model that all agents use. But the feedback loop is slow, expensive, requires human curation, and operates offline. It is not collective learning; it is deferred knowledge consolidation.&lt;/p>
&lt;p>&lt;strong>Workflow libraries and pattern registries.&lt;/strong> Teams manually curate successful workflow templates. This is human-mediated knowledge transfer, not agent-mediated. It does not scale.&lt;/p>
&lt;p>None of these close the gap. They are engineered workarounds for the absence of a proper horizontal learning primitive.&lt;/p>
&lt;hr>
&lt;h2 id="what-is-actually-missing">What Is Actually Missing
&lt;/h2>&lt;p>The architectural primitive that does not yet exist is a persistent, agent-writable, outcome-weighted knowledge layer — one where agents contribute strategy signals after a run completes, and those signals influence future agent behavior without requiring a full retraining cycle or human curation.&lt;/p>
&lt;p>The biological analogy came back to me here from the swarm intelligence research I covered in Part II: pheromone trails in ant colonies are not just a communication mechanism — they are a distributed, incrementally updated knowledge store. Shorter, higher-quality paths accumulate stronger signals through positive feedback. Failed paths evaporate. The swarm&amp;rsquo;s collective intelligence is encoded in the medium itself, not in any individual. No central controller decides which trails are &amp;ldquo;good.&amp;rdquo; The outcome does.&lt;/p>
&lt;p>What that looks like for LLM-based multi-agent systems is still an open design problem, but the requirements I&amp;rsquo;ve been able to identify are:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Outcome-weighted writes.&lt;/strong> Agent runs that complete successfully contribute to the shared knowledge layer with positive weight; failed runs contribute negative constraints. Both are useful — ERL&amp;rsquo;s results show that failure-derived heuristics often outperform success-derived ones on search tasks.&lt;/li>
&lt;li>&lt;strong>Decentralized propagation.&lt;/strong> The update mechanism cannot require a human in the loop or an offline batch process. Strategy signals need to propagate in something close to real time across agent instances.&lt;/li>
&lt;li>&lt;strong>Relevance-gated retrieval.&lt;/strong> Future agents need to surface relevant prior experience without injecting everything into context. This is partially addressed by LLM-based retrieval scoring, but remains unsolved at scale.&lt;/li>
&lt;li>&lt;strong>No weight updates required.&lt;/strong> The mechanism needs to operate within the context engineering layer, not through gradient descent. Retraining is too slow and too expensive for real-time collective learning.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="why-the-industry-has-not-solved-it">Why the Industry Has Not Solved It
&lt;/h2>&lt;p>The more I thought about it, the more I realized the incentive structure explains the gap more than the technical difficulty does.&lt;/p>
&lt;p>Vertical scaling — a bigger model, a stronger benchmark score, a longer context window — has a clear commercial lever. It is attributable to a specific product release and easy to market. Horizontal knowledge propagation is architecturally harder, requires runtime infrastructure that does not exist yet, and the value it generates is distributed across runs and users rather than attributable to a single capability upgrade.&lt;/p>
&lt;p>Google Research&amp;rsquo;s recent work on scaling agent systems found that adding more agents does not consistently improve performance — multi-agent coordination yields substantial gains on parallelizable tasks but can actually degrade performance on sequential workflows. More agents is not the answer. Smarter knowledge transfer is. But that is a harder problem to benchmark and a harder story to sell.&lt;/p>
&lt;hr>
&lt;h2 id="the-architectural-opportunity">The Architectural Opportunity
&lt;/h2>&lt;p>The systems that will win over the next two to three years will not be the ones with the largest individual agents. They will be the ones that figure out how to make collective experience accumulate efficiently across runs, across users, and across agent instances — without requiring a human editor or an offline training cycle to make it useful.&lt;/p>
&lt;p>This is, in a meaningful sense, the missing layer of agentic AI infrastructure. The orchestration layer exists — I covered it in Part I. The communication protocols exist. The shared state store exists. The swarm coordination patterns exist — I covered those in Part II. What does not exist is a production-grade mechanism for collective learning that operates at runtime.&lt;/p>
&lt;p>The research directions are beginning to converge on this problem — Reflexion, ERL, Collaborative Memory — but none has produced a general-purpose primitive that production systems can adopt. That gap is both the honest state of the art and the most interesting open problem in multi-agent architecture today.&lt;/p>
&lt;hr>
&lt;h2 id="references">References
&lt;/h2>&lt;ul>
&lt;li>Letta. &amp;ldquo;Stateful Agents: The Missing Link in LLM Intelligence.&amp;rdquo; &lt;a class="link" href="https://www.letta.com/blog/stateful-agents" target="_blank" rel="noopener"
>letta.com&lt;/a>&lt;/li>
&lt;li>Shinn, N. et al. &amp;ldquo;Reflexion: Language Agents with Verbal Reinforcement Learning.&amp;rdquo; NeurIPS 2023. &lt;a class="link" href="https://arxiv.org/abs/2303.11366" target="_blank" rel="noopener"
>arxiv.org/abs/2303.11366&lt;/a>&lt;/li>
&lt;li>Rezazadeh, M. et al. &amp;ldquo;Collaborative Memory: Multi-User Memory Sharing in LLM Agents with Dynamic Access Control.&amp;rdquo; 2025. &lt;a class="link" href="https://arxiv.org/abs/2505.18279" target="_blank" rel="noopener"
>arxiv.org/abs/2505.18279&lt;/a>&lt;/li>
&lt;li>&amp;ldquo;Experiential Reflective Learning for Self-Improving LLM Agents.&amp;rdquo; 2025. &lt;a class="link" href="https://arxiv.org/abs/2603.24639" target="_blank" rel="noopener"
>arxiv.org/abs/2603.24639&lt;/a>&lt;/li>
&lt;li>Google Research. &amp;ldquo;Towards a Science of Scaling Agent Systems: When and Why Agent Systems Work.&amp;rdquo; 2026.&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts_in_review/super-agents-multi-agent-communication/" >Part I: Super Agents and Multi-Agent Communication&lt;/a> — orchestration, structured communication, and the single source of truth&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts_in_review/swarm-intelligence-opposite-architectural-bet/" >Part II: Swarm Intelligence — The Opposite Architectural Bet&lt;/a> — decentralized coordination and emergent intelligence&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts/reasoning-models-deep-reasoning-llms/" >Reasoning Models and Deep Reasoning in LLMs&lt;/a> — the reasoning strategies that power individual agents&lt;/li>
&lt;li>&lt;em>The Obsolescence Paradox: Why the Best Engineers Will Thrive in the AI Era&lt;/em> — engineering judgment in the age of autonomous AI systems&lt;/li>
&lt;/ul></description></item><item><title>Swarm Intelligence: The Opposite Architectural Bet</title><link>https://corebaseit.com/corebaseit_posts_in_review/series/swarm-intelligence-opposite-architectural-bet_part2/</link><pubDate>Sat, 28 Mar 2026 10:00:00 +0100</pubDate><author>contact@corebaseit.com (Vincent Bevia)</author><guid>https://corebaseit.com/corebaseit_posts_in_review/series/swarm-intelligence-opposite-architectural-bet_part2/</guid><description>&lt;p>&lt;em>This is Part II of a two-part series on multi-agent AI architecture. &lt;a class="link" href="https://corebaseit.com/posts_in_review/super-agents-multi-agent-communication/" >Part I&lt;/a> covered the super agent pattern: centralized orchestration, structured communication, and a single source of truth. This post explores the opposite approach.&lt;/em>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>Everything I described in Part I assumes a central orchestrator that owns workflow visibility and decision authority. Swarm intelligence is the opposite architectural bet — and understanding the contrast changed how I think about multi-agent design.&lt;/strong>&lt;/p>
&lt;p>When I started reading about swarm intelligence after writing the orchestrator post, I expected a niche optimization technique. What I found instead was a fundamentally different philosophy of coordination — one where global competence emerges from local interactions, with no central controller and no global plan. The more I dug in, the more I realized this isn&amp;rsquo;t just an alternative pattern. It&amp;rsquo;s a direct challenge to some of the assumptions I laid out in Part I, and understanding where each approach wins (and fails) is what separates a good multi-agent architecture from an overengineered one.&lt;/p>
&lt;hr>
&lt;h2 id="what-is-swarm-intelligence">What Is Swarm Intelligence?
&lt;/h2>&lt;p>Swarm intelligence is the study and engineering of collective behavior that emerges from many simple agents interacting locally, with no central controller and no global plan. Each agent operates on partial information and follows simple local rules. Global-level competence — efficient foraging, optimal routing, adaptive task allocation — emerges from those local interactions rather than being imposed from above.&lt;/p>
&lt;p>What struck me about this definition is how directly it inverts the super agent model. In Part I, I described a system where the orchestrator is the only node with full workflow visibility, and specialist agents receive scoped inputs and produce scoped outputs. In a swarm, &lt;em>no&lt;/em> agent has full visibility. There is no orchestrator. And yet the collective solves problems that exceed the capability of any individual member.&lt;/p>
&lt;p>Three properties define the pattern:&lt;/p>
&lt;p>&lt;strong>Decentralization.&lt;/strong> There is no leader node. No single agent has full workflow visibility, and none can issue authoritative commands to others. Coordination is a byproduct of local interaction, not a product of centralized planning. This is the property that makes swarms inherently fault-tolerant — remove any individual agent and the system continues functioning, because no agent was indispensable to begin with.&lt;/p>
&lt;p>&lt;strong>Self-organization.&lt;/strong> Coherent global patterns arise spontaneously from local rules. No agent is told &amp;ldquo;build this structure&amp;rdquo; or &amp;ldquo;follow this path.&amp;rdquo; The structure and the paths emerge from thousands of independent decisions, each one simple, each one local, each one informed only by the agent&amp;rsquo;s immediate environment. The global order was never specified — it assembled itself.&lt;/p>
&lt;p>&lt;strong>Emergent intelligence.&lt;/strong> The collective solves problems that exceed the capability of any individual agent. This is the part that I found genuinely surprising when I started looking at the research: the group is, in a meaningful sense, smarter than its members. Not because the agents secretly share a global model, but because local interactions produce feedback loops that concentrate collective effort on high-quality solutions over time.&lt;/p>
&lt;hr>
&lt;h2 id="from-biology-to-algorithms">From Biology to Algorithms
&lt;/h2>&lt;p>The canonical biological examples are not just illustrations — they directly inspired the computational methods in use today. Understanding the biology helps explain why the algorithms work.&lt;/p>
&lt;p>&lt;strong>Ant colonies&lt;/strong> are the most studied example. An individual ant has no map, no plan, and no knowledge of the colony&amp;rsquo;s global state. It follows simple rules: wander randomly, and when you find food, return to the nest while depositing pheromone. Other ants are biased toward following stronger pheromone trails. Shorter paths between food and nest get traversed more frequently, accumulate more pheromone, and attract more ants — creating a positive feedback loop that converges on efficient routes. Meanwhile, pheromone evaporates over time, which means abandoned or suboptimal paths fade naturally. The colony&amp;rsquo;s routing network self-assembles from thousands of individual deposit-and-evaporate decisions.&lt;/p>
&lt;p>What I found remarkable is how robust this is. Block a path, and the colony reroutes within minutes — not because any ant &amp;ldquo;knows&amp;rdquo; the path is blocked, but because pheromone stops accumulating on the blocked segment and alternative routes gain relative strength. The system adapts to disruption without any agent being aware of the disruption at a global level.&lt;/p>
&lt;p>&lt;strong>Bee colonies&lt;/strong> use a different coordination mechanism: the waggle dance. Scout bees evaluate potential food sources or nest sites, then return to the hive and communicate their findings through a dance whose duration and direction encode the distance and quality of the source. Other bees probabilistically follow the more enthusiastic dancers. Over rounds of scouting and reporting, the colony converges on the best available option — a decentralized decision process that has been shown to rival the accuracy of optimal mathematical models.&lt;/p>
&lt;p>&lt;strong>Bird flocks and fish schools&lt;/strong> demonstrate a third variant: alignment-based coordination. Each individual follows three simple rules — separation (don&amp;rsquo;t crowd), alignment (match direction with neighbors), and cohesion (stay close to the group). The stunning visual coherence of a starling murmuration or a sardine ball emerges entirely from these local rules. No bird leads. No fish coordinates. The collective pattern is an emergent property of individual behavior.&lt;/p>
&lt;p>These aren&amp;rsquo;t metaphors. They are the direct inspiration for the algorithms.&lt;/p>
&lt;hr>
&lt;h2 id="the-two-dominant-algorithms">The Two Dominant Algorithms
&lt;/h2>&lt;p>Two metaheuristics dominate applied swarm AI, and both map directly from the biological mechanisms above.&lt;/p>
&lt;h3 id="ant-colony-optimization-aco">Ant Colony Optimization (ACO)
&lt;/h3>&lt;p>ACO, introduced by Marco Dorigo in 1992, translates the ant foraging model into a general-purpose optimization algorithm. Artificial agents (&amp;ldquo;ants&amp;rdquo;) traverse a solution space — typically modeled as a graph — and deposit virtual pheromone on the edges they traverse. The pheromone strength on each edge influences the probability that subsequent ants will choose that edge. Better solutions accumulate stronger pheromone over time through positive feedback, while evaporation ensures the algorithm doesn&amp;rsquo;t lock permanently onto early suboptimal solutions.&lt;/p>
&lt;p>The algorithm is straightforward:&lt;/p>
&lt;ol>
&lt;li>Initialize pheromone levels uniformly across all edges&lt;/li>
&lt;li>Each ant constructs a complete solution by traversing the graph, with transition probabilities biased by pheromone strength and a heuristic desirability function&lt;/li>
&lt;li>After all ants complete their tours, update pheromone: deposit proportional to solution quality, evaporate a fixed fraction globally&lt;/li>
&lt;li>Repeat for a fixed number of iterations or until convergence&lt;/li>
&lt;/ol>
&lt;p>ACO has been applied successfully to the Traveling Salesman Problem, vehicle routing, network routing, job-shop scheduling, and protein folding. What I found interesting from an engineering perspective is that ACO handles dynamic problems well — if the graph changes during execution (a link goes down, a cost changes), the pheromone distribution naturally adapts over subsequent iterations without requiring a restart.&lt;/p>
&lt;h3 id="particle-swarm-optimization-pso">Particle Swarm Optimization (PSO)
&lt;/h3>&lt;p>PSO, introduced by Kennedy and Eberhart in 1995, takes inspiration from bird flocking and fish schooling rather than ant foraging. Each &amp;ldquo;particle&amp;rdquo; in the swarm represents a candidate solution in a continuous search space. Each particle has a position and a velocity, and it maintains two pieces of memory: its own best-known position (&lt;code>pbest&lt;/code>) and the global best position found by any particle in the swarm (&lt;code>gbest&lt;/code>).&lt;/p>
&lt;p>At each iteration, each particle updates its velocity as a weighted combination of three forces:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Inertia&lt;/strong> — continue in the current direction&lt;/li>
&lt;li>&lt;strong>Cognitive pull&lt;/strong> — move toward &lt;code>pbest&lt;/code> (the agent&amp;rsquo;s own best experience)&lt;/li>
&lt;li>&lt;strong>Social pull&lt;/strong> — move toward &lt;code>gbest&lt;/code> (the collective&amp;rsquo;s best experience)&lt;/li>
&lt;/ul>
&lt;p>The balance between cognitive and social pull determines the exploration-exploitation trade-off. Heavy cognitive pull means particles explore independently; heavy social pull means the swarm converges quickly on the current best. Tuning these weights is the primary design decision in PSO.&lt;/p>
&lt;p>PSO is widely used in continuous optimization, neural network training, feature selection, and engineering design optimization. Unlike ACO, PSO operates in continuous space rather than on graphs, which makes it a natural fit for problems where solutions are represented as real-valued vectors.&lt;/p>
&lt;p>What I found appealing about both algorithms is their simplicity. The core logic of ACO or PSO fits in a few dozen lines of code. The intelligence doesn&amp;rsquo;t come from the complexity of the individual agent — it comes from the interaction dynamics of the population.&lt;/p>
&lt;hr>
&lt;h2 id="a-minimal-pso-example">A Minimal PSO Example
&lt;/h2>&lt;p>To make this as concrete as I did for the orchestrator pattern in Part I, here&amp;rsquo;s a minimal PSO implementation. The swarm searches for the minimum of a simple 2D function:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> random
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">objective&lt;/span>(position: list[float]) &lt;span style="color:#f92672">-&amp;gt;&lt;/span> float:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x, y &lt;span style="color:#f92672">=&lt;/span> position
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> x &lt;span style="color:#f92672">**&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#f92672">+&lt;/span> y &lt;span style="color:#f92672">**&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Particle&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">__init__&lt;/span>(self, bounds: list[tuple[float, float]]):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>position &lt;span style="color:#f92672">=&lt;/span> [random&lt;span style="color:#f92672">.&lt;/span>uniform(lo, hi) &lt;span style="color:#66d9ef">for&lt;/span> lo, hi &lt;span style="color:#f92672">in&lt;/span> bounds]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>velocity &lt;span style="color:#f92672">=&lt;/span> [random&lt;span style="color:#f92672">.&lt;/span>uniform(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#66d9ef">for&lt;/span> _ &lt;span style="color:#f92672">in&lt;/span> bounds]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>best_position &lt;span style="color:#f92672">=&lt;/span> list(self&lt;span style="color:#f92672">.&lt;/span>position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>best_score &lt;span style="color:#f92672">=&lt;/span> objective(self&lt;span style="color:#f92672">.&lt;/span>position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">run_pso&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n_particles: int &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">20&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bounds: list[tuple[float, float]] &lt;span style="color:#f92672">=&lt;/span> [(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">10&lt;/span>), (&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">10&lt;/span>, &lt;span style="color:#ae81ff">10&lt;/span>)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> iterations: int &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">50&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> w: float &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.7&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> c1: float &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1.5&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> c2: float &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1.5&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>) &lt;span style="color:#f92672">-&amp;gt;&lt;/span> list[float]:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> particles &lt;span style="color:#f92672">=&lt;/span> [Particle(bounds) &lt;span style="color:#66d9ef">for&lt;/span> _ &lt;span style="color:#f92672">in&lt;/span> range(n_particles)]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> global_best &lt;span style="color:#f92672">=&lt;/span> min(particles, key&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#66d9ef">lambda&lt;/span> p: p&lt;span style="color:#f92672">.&lt;/span>best_score)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gbest &lt;span style="color:#f92672">=&lt;/span> list(global_best&lt;span style="color:#f92672">.&lt;/span>best_position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gbest_score &lt;span style="color:#f92672">=&lt;/span> global_best&lt;span style="color:#f92672">.&lt;/span>best_score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> _ &lt;span style="color:#f92672">in&lt;/span> range(iterations):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> p &lt;span style="color:#f92672">in&lt;/span> particles:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(len(bounds)):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> r1, r2 &lt;span style="color:#f92672">=&lt;/span> random&lt;span style="color:#f92672">.&lt;/span>random(), random&lt;span style="color:#f92672">.&lt;/span>random()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>velocity[i] &lt;span style="color:#f92672">=&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> w &lt;span style="color:#f92672">*&lt;/span> p&lt;span style="color:#f92672">.&lt;/span>velocity[i]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">+&lt;/span> c1 &lt;span style="color:#f92672">*&lt;/span> r1 &lt;span style="color:#f92672">*&lt;/span> (p&lt;span style="color:#f92672">.&lt;/span>best_position[i] &lt;span style="color:#f92672">-&lt;/span> p&lt;span style="color:#f92672">.&lt;/span>position[i])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">+&lt;/span> c2 &lt;span style="color:#f92672">*&lt;/span> r2 &lt;span style="color:#f92672">*&lt;/span> (gbest[i] &lt;span style="color:#f92672">-&lt;/span> p&lt;span style="color:#f92672">.&lt;/span>position[i])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>position[i] &lt;span style="color:#f92672">+=&lt;/span> p&lt;span style="color:#f92672">.&lt;/span>velocity[i]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>position[i] &lt;span style="color:#f92672">=&lt;/span> max(bounds[i][&lt;span style="color:#ae81ff">0&lt;/span>], min(bounds[i][&lt;span style="color:#ae81ff">1&lt;/span>], p&lt;span style="color:#f92672">.&lt;/span>position[i]))
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> score &lt;span style="color:#f92672">=&lt;/span> objective(p&lt;span style="color:#f92672">.&lt;/span>position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> score &lt;span style="color:#f92672">&amp;lt;&lt;/span> p&lt;span style="color:#f92672">.&lt;/span>best_score:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>best_score &lt;span style="color:#f92672">=&lt;/span> score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> p&lt;span style="color:#f92672">.&lt;/span>best_position &lt;span style="color:#f92672">=&lt;/span> list(p&lt;span style="color:#f92672">.&lt;/span>position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> score &lt;span style="color:#f92672">&amp;lt;&lt;/span> gbest_score:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gbest_score &lt;span style="color:#f92672">=&lt;/span> score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gbest &lt;span style="color:#f92672">=&lt;/span> list(p&lt;span style="color:#f92672">.&lt;/span>position)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> gbest, gbest_score
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>best_pos, best_score &lt;span style="color:#f92672">=&lt;/span> run_pso()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Best position: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>best_pos&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Best score: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>best_score&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Twenty particles, each starting at a random position, each pulled toward its own best experience and the swarm&amp;rsquo;s collective best. No particle knows the objective function&amp;rsquo;s landscape. No particle directs the others. Yet within 50 iterations, the swarm converges on the minimum — not because any individual found it deliberately, but because the interaction dynamics between personal memory and social influence concentrate the swarm&amp;rsquo;s exploration on progressively better regions of the space.&lt;/p>
&lt;p>Compare this to the orchestrator pattern from Part I: there, a coordinator explicitly assigned work to specialist agents and tracked the workflow state. Here, there is no coordinator. The &amp;ldquo;coordination&amp;rdquo; is an emergent property of the velocity update rule. Both patterns produce useful collective behavior — through fundamentally different mechanisms.&lt;/p>
&lt;hr>
&lt;h2 id="swarm-vs-orchestrator-the-architectural-trade-off">Swarm vs. Orchestrator: The Architectural Trade-Off
&lt;/h2>&lt;p>This is the comparison I kept coming back to as I read through both bodies of literature:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Property&lt;/th>
&lt;th>Super Agent (Orchestrator)&lt;/th>
&lt;th>Swarm&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Control&lt;/strong>&lt;/td>
&lt;td>Centralized&lt;/td>
&lt;td>Decentralized&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>State visibility&lt;/strong>&lt;/td>
&lt;td>Full (single source of truth)&lt;/td>
&lt;td>Partial (local only)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Coordination&lt;/strong>&lt;/td>
&lt;td>Explicit assignment and gating&lt;/td>
&lt;td>Emergent from local rules&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Failure mode&lt;/strong>&lt;/td>
&lt;td>Orchestrator is a single point of failure&lt;/td>
&lt;td>Robust to individual agent loss&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Predictability&lt;/strong>&lt;/td>
&lt;td>High — deterministic workflow graph&lt;/td>
&lt;td>Lower — emergent behavior&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Debuggability&lt;/strong>&lt;/td>
&lt;td>High — inspect the state store&lt;/td>
&lt;td>Harder — behavior is a collective property&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Best suited for&lt;/strong>&lt;/td>
&lt;td>Complex workflows with strict ordering and accountability&lt;/td>
&lt;td>Search, optimization, and exploration under uncertainty&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The orchestrator pattern wins when you need auditability, sequential dependencies, and defined handoffs — a software delivery pipeline, a compliance workflow, a multi-step API integration. When someone asks &amp;ldquo;what happened and why,&amp;rdquo; you can trace the answer through the state store and the orchestrator&amp;rsquo;s decision log. That&amp;rsquo;s essential in regulated domains like payments, healthcare, or finance, where I spend most of my time.&lt;/p>
&lt;p>The swarm pattern wins when the problem is fundamentally one of parallel exploration, where no single agent can know the right answer in advance and the solution space is too large for a directed search. Routing optimization, hyperparameter tuning, resource allocation under dynamic constraints, adversarial search — these are problems where the strength of the swarm is that it doesn&amp;rsquo;t commit to a single path early. It explores broadly, converges gradually, and adapts to changes in the landscape without requiring a central replanning step.&lt;/p>
&lt;p>The failure modes are equally instructive. An orchestrator system that loses its coordinator loses everything — the workflow stops, the state becomes ambiguous, and recovery requires restarting from a checkpoint. A swarm that loses 20% of its agents barely notices — the remaining agents continue interacting, and the collective behavior degrades gracefully rather than collapsing. On the other hand, a swarm that converges on a suboptimal solution can be hard to diagnose, because the &amp;ldquo;decision&amp;rdquo; was never made by any single agent — it emerged from the collective dynamics, and there&amp;rsquo;s no decision log to inspect.&lt;/p>
&lt;hr>
&lt;h2 id="the-hybrid-where-both-patterns-meet">The Hybrid: Where Both Patterns Meet
&lt;/h2>&lt;p>What I found most interesting — and most relevant to real-world systems — is that the best architectures don&amp;rsquo;t choose one pattern exclusively. They combine both.&lt;/p>
&lt;p>The emerging production pattern looks like this: a super agent orchestrates the high-level workflow and enforces policy, while swarm-style sub-networks handle search, ranking, or optimization sub-problems where emergent behavior is an asset rather than a liability.&lt;/p>
&lt;p>Consider a concrete example: a multi-agent system for automated code review. The orchestrator (super agent) manages the workflow — receive a pull request, assign analysis tasks, collect results, enforce quality gates, produce a final report. That&amp;rsquo;s a sequential, auditable pipeline. But within the analysis stage, you might deploy a swarm of lightweight agents, each examining the code from a different angle — style, security, performance, correctness, test coverage — with their findings aggregated through a voting or ranking mechanism rather than a centralized decision. The orchestrator owns the workflow. The swarm owns the search.&lt;/p>
&lt;p>This hybrid is not theoretical. It shows up in retrieval-augmented generation (RAG) pipelines where an orchestrator manages the query-retrieve-generate flow while a swarm of retrieval agents explores different index partitions in parallel. It shows up in automated trading systems where a central risk engine enforces position limits while swarm-based signal generators explore the market independently. It shows up in robotics where a planner coordinates high-level task sequences while swarm algorithms handle local path planning and obstacle avoidance.&lt;/p>
&lt;p>The architectural insight is that orchestration and emergence are not competing philosophies — they are complementary tools for different layers of the same system. The orchestrator provides structure, accountability, and policy enforcement. The swarm provides exploration, resilience, and adaptive search. Using both, at the right layers, gives you something that neither alone can achieve.&lt;/p>
&lt;hr>
&lt;h2 id="what-i-took-away-from-all-of-this">What I Took Away from All of This
&lt;/h2>&lt;p>Across both posts, the thread that connects everything is that &lt;strong>multi-agent AI is fundamentally a systems engineering problem.&lt;/strong> Whether you&amp;rsquo;re building a centralized orchestrator with a shared state store or a decentralized swarm with emergent coordination, the design questions are the same ones that distributed systems engineers have been wrestling with for decades: how do agents communicate? Who owns state? How do you handle failure? How do you debug collective behavior?&lt;/p>
&lt;p>The super agent pattern gives you control, auditability, and predictability. The swarm pattern gives you resilience, adaptability, and the ability to solve problems that are too large or too dynamic for a directed search. The best systems use both — orchestration where you need accountability, emergence where you need exploration.&lt;/p>
&lt;p>If Part I was about understanding how to make agents work &lt;em>together&lt;/em> under a coordinator, this post is about understanding when to let agents work &lt;em>independently&lt;/em> — and trusting that the collective behavior will be smarter than any individual plan.&lt;/p>
&lt;p>The models handle the reasoning. The architecture handles the reliability. And the choice between orchestration and emergence determines the shape of that architecture.&lt;/p>
&lt;hr>
&lt;h2 id="references">References
&lt;/h2>&lt;ul>
&lt;li>Wikipedia. &amp;ldquo;Swarm Intelligence.&amp;rdquo; &lt;a class="link" href="https://en.wikipedia.org/wiki/Swarm_intelligence" target="_blank" rel="noopener"
>en.wikipedia.org&lt;/a>&lt;/li>
&lt;li>Vation Ventures. &amp;ldquo;Swarm Intelligence: Definition, Explanation, and Use Cases.&amp;rdquo; &lt;a class="link" href="https://vationventures.com/resources/swarm-intelligence" target="_blank" rel="noopener"
>vationventures.com&lt;/a>&lt;/li>
&lt;li>Scholarpedia. &amp;ldquo;Swarm Intelligence.&amp;rdquo; &lt;a class="link" href="http://www.scholarpedia.org/article/Swarm_intelligence" target="_blank" rel="noopener"
>scholarpedia.org&lt;/a>&lt;/li>
&lt;li>HPE. &amp;ldquo;What is Swarm Intelligence?&amp;rdquo; &lt;a class="link" href="https://www.hpe.com/us/en/what-is/swarm-intelligence.html" target="_blank" rel="noopener"
>hpe.com&lt;/a>&lt;/li>
&lt;li>Ultralytics. &amp;ldquo;Swarm Intelligence in Vision AI.&amp;rdquo; &lt;a class="link" href="https://www.ultralytics.com/glossary/swarm-intelligence" target="_blank" rel="noopener"
>ultralytics.com&lt;/a>&lt;/li>
&lt;li>ScienceDirect Topics. &amp;ldquo;Swarm Intelligence.&amp;rdquo; &lt;a class="link" href="https://www.sciencedirect.com/topics/computer-science/swarm-intelligence" target="_blank" rel="noopener"
>sciencedirect.com&lt;/a>&lt;/li>
&lt;li>Dorigo, M. &amp;ldquo;Optimization, Learning and Natural Algorithms.&amp;rdquo; PhD Thesis, Politecnico di Milano, 1992.&lt;/li>
&lt;li>Kennedy, J. &amp;amp; Eberhart, R. &amp;ldquo;Particle Swarm Optimization.&amp;rdquo; IEEE International Conference on Neural Networks, 1995.&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts_in_review/super-agents-multi-agent-communication/" >Part I: Super Agents and Multi-Agent Communication&lt;/a> — the orchestrator pattern, communication mechanisms, and a minimal Python implementation&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts/reasoning-models-deep-reasoning-llms/" >Reasoning Models and Deep Reasoning in LLMs&lt;/a> — the reasoning strategies that power individual agents in both patterns&lt;/li>
&lt;li>&lt;em>The Obsolescence Paradox: Why the Best Engineers Will Thrive in the AI Era&lt;/em> — engineering judgment in the age of autonomous AI systems&lt;/li>
&lt;/ul></description></item><item><title>Super Agents and Multi-Agent Communication: Architecture That Actually Scales</title><link>https://corebaseit.com/corebaseit_posts_in_review/series/super-agents-multi-agent-communication_part1/</link><pubDate>Fri, 27 Mar 2026 22:00:00 +0100</pubDate><author>contact@corebaseit.com (Vincent Bevia)</author><guid>https://corebaseit.com/corebaseit_posts_in_review/series/super-agents-multi-agent-communication_part1/</guid><description>&lt;p>&lt;em>This is Part I of a two-part series on multi-agent AI architecture. This post covers centralized orchestration. &lt;a class="link" href="https://corebaseit.com/posts_in_review/swarm-intelligence-opposite-architectural-bet/" >Part II&lt;/a> explores the opposite approach: swarm intelligence.&lt;/em>&lt;/p>
&lt;hr>
&lt;p>&lt;strong>I&amp;rsquo;ve been reading a lot about &amp;ldquo;super agents&amp;rdquo; lately — and once I got past the marketing noise, I found a genuinely useful architectural pattern underneath.&lt;/strong>&lt;/p>
&lt;p>The term gets thrown around loosely, but the more I dug into it — across AWS documentation, IBM&amp;rsquo;s multi-agent research, LangGraph&amp;rsquo;s implementation guides, and a handful of practical engineering write-ups — the more I realized it maps cleanly onto problems that single-model, turn-by-turn systems simply cannot solve reliably: multi-step workflows with branching logic, delegated expertise, and external system integration. The concept is not new — multi-agent coordination has decades of research behind it — but LLMs have made it practically viable in ways that weren&amp;rsquo;t possible three years ago.&lt;/p>
&lt;p>This post is my attempt to organize what I&amp;rsquo;ve learned: what the term actually means, how agents communicate in practice, and a minimal Python implementation I put together to make the pattern concrete before reaching for a framework.&lt;/p>
&lt;hr>
&lt;h2 id="what-is-a-super-agent">What Is a Super Agent?
&lt;/h2>&lt;p>The clearest definition I found across the literature: a super agent is an autonomous AI system capable of interpreting a high-level goal, decomposing it into sub-tasks, orchestrating tools and specialist agents, and executing a multi-step workflow with minimal human intervention. That&amp;rsquo;s the architectural distinction that separates it from a standard chatbot — a chatbot responds turn-by-turn; a super agent plans, delegates, acts, and adapts.&lt;/p>
&lt;p>What struck me when I started pulling the concept apart is how concrete the capabilities actually are:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Decompose goals&lt;/strong> — translate a high-level objective (&amp;ldquo;Audit our Q2 pipeline and notify the reps&amp;rdquo;) into a sequenced set of executable tasks.&lt;/li>
&lt;li>&lt;strong>Orchestrate tools and sub-agents&lt;/strong> — coordinate search, code execution, external APIs, CRM writes, and domain-specific agents as a unified workflow.&lt;/li>
&lt;li>&lt;strong>Maintain long-horizon context&lt;/strong> — preserve memory of the user, the project state, and intermediate results across multiple reasoning steps.&lt;/li>
&lt;li>&lt;strong>Act in external systems&lt;/strong> — send emails, update records, generate documents, and book reservations — not just describe how to do those things.&lt;/li>
&lt;li>&lt;strong>Support human-in-the-loop&lt;/strong> — pause for confirmation, accept corrections, and revise plans accordingly.&lt;/li>
&lt;/ul>
&lt;p>The framing that resonated most with me is that a super agent functions as a digital &lt;strong>teammate&lt;/strong> that can plan, decide, and act — not a passive assistant that generates single responses.&lt;/p>
&lt;hr>
&lt;h2 id="do-agents-actually-talk-to-each-other">Do Agents Actually Talk to Each Other?
&lt;/h2>&lt;p>This was the question that pulled me deeper into the topic. The answer is yes — and the way they do it is where the architecture gets interesting. In multi-agent systems, agents communicate via structured messages to coordinate work, share intermediate results, and negotiate task ownership.&lt;/p>
&lt;h3 id="communication-mechanisms">Communication Mechanisms
&lt;/h3>&lt;p>From what I found, three mechanisms dominate in practice:&lt;/p>
&lt;p>&lt;strong>Message passing.&lt;/strong> Agents exchange typed messages (request, result, status, feedback) over a bus, queue, or shared memory store. The message structure includes sender, receiver, intent, payload, and timestamp, so both sides can route and act on messages reliably. This is the most flexible mechanism and the one that most closely resembles traditional distributed systems communication — which, coming from a systems engineering background, immediately made sense to me.&lt;/p>
&lt;p>&lt;strong>Shared state.&lt;/strong> Rather than direct peer-to-peer calls, agents read from and write to a single authoritative state object. This is the foundation of LangGraph-style graphs and is the pattern most relevant to in-process agent systems. The state object becomes both the communication channel and the coordination mechanism — agents don&amp;rsquo;t need to know about each other, only about the state contract.&lt;/p>
&lt;p>&lt;strong>Natural language over a structured envelope.&lt;/strong> LLM-based agents can exchange plain-text prompts and responses, but production systems wrap those in a JSON schema or DSL to reduce ambiguity and enable deterministic parsing. The natural language carries the semantic content; the envelope carries the routing and type information that machines need to act on it reliably.&lt;/p>
&lt;h3 id="coordination-patterns">Coordination Patterns
&lt;/h3>&lt;p>The coordination patterns I kept seeing across the literature include request–response, broadcast, task announcement and bidding, and peer-to-peer collaboration where agents refine each other&amp;rsquo;s outputs. The coordination role is explicit: either a planner agent delegates to workers, or agents operate in a fully collaborative graph where outputs flow through defined contracts.&lt;/p>
&lt;p>What I found particularly useful to think about is how the choice of coordination pattern has direct architectural consequences. A centralized planner is simpler to reason about and debug, but creates a single point of failure. A fully distributed collaboration graph is more resilient but harder to monitor and control. Most production systems seem to land somewhere in between — a planner that delegates to autonomous agents, with guardrails and fallback logic at the orchestration layer.&lt;/p>
&lt;hr>
&lt;h2 id="a-minimal-in-process-pattern">A Minimal In-Process Pattern
&lt;/h2>&lt;p>To make this concrete for myself, I put together a minimal example. The cleanest starting point I could find for understanding agent-to-agent communication requires only three components: a shared state object, two agent functions, and a lightweight orchestrator that sequences them.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> dataclasses &lt;span style="color:#f92672">import&lt;/span> dataclass, field
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> typing &lt;span style="color:#f92672">import&lt;/span> List, Dict
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@dataclass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">State&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user_goal: str
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> messages: List[Dict[str, str]] &lt;span style="color:#f92672">=&lt;/span> field(default_factory&lt;span style="color:#f92672">=&lt;/span>list)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> draft: str &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> review: str &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">writer_agent&lt;/span>(state: State) &lt;span style="color:#f92672">-&amp;gt;&lt;/span> &lt;span style="color:#66d9ef">None&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state&lt;span style="color:#f92672">.&lt;/span>draft &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Draft for goal: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>state&lt;span style="color:#f92672">.&lt;/span>user_goal&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state&lt;span style="color:#f92672">.&lt;/span>messages&lt;span style="color:#f92672">.&lt;/span>append({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;from&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;writer&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;to&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;reviewer&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;draft&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;content&amp;#34;&lt;/span>: state&lt;span style="color:#f92672">.&lt;/span>draft,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">reviewer_agent&lt;/span>(state: State) &lt;span style="color:#f92672">-&amp;gt;&lt;/span> &lt;span style="color:#66d9ef">None&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> incoming &lt;span style="color:#f92672">=&lt;/span> state&lt;span style="color:#f92672">.&lt;/span>messages[&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>][&lt;span style="color:#e6db74">&amp;#34;content&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state&lt;span style="color:#f92672">.&lt;/span>review &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Reviewed version of: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>incoming&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state&lt;span style="color:#f92672">.&lt;/span>messages&lt;span style="color:#f92672">.&lt;/span>append({
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;from&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;reviewer&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;to&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;writer&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;review&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;content&amp;#34;&lt;/span>: state&lt;span style="color:#f92672">.&lt;/span>review,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">run_workflow&lt;/span>(goal: str) &lt;span style="color:#f92672">-&amp;gt;&lt;/span> State:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state &lt;span style="color:#f92672">=&lt;/span> State(user_goal&lt;span style="color:#f92672">=&lt;/span>goal)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> writer_agent(state)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reviewer_agent(state)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> state
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>state &lt;span style="color:#f92672">=&lt;/span> run_workflow(&lt;span style="color:#e6db74">&amp;#34;Create a short API integration summary&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(state&lt;span style="color:#f92672">.&lt;/span>messages)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(state&lt;span style="color:#f92672">.&lt;/span>review)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>writer_agent()&lt;/code> produces a draft and appends a typed message targeted at the reviewer. &lt;code>reviewer_agent()&lt;/code> reads that message and writes its response back into the same structure. Both agents live in the same process, yet the message list enforces a clean protocol boundary — which is exactly what makes the design debuggable and extensible.&lt;/p>
&lt;h3 id="why-this-pattern-scales">Why This Pattern Scales
&lt;/h3>&lt;p>What I like about this design is that the agents are loosely coupled: they do not invoke each other&amp;rsquo;s business logic directly; they communicate through state and message contracts. That separation makes it straightforward to insert a supervisor, add retries, inject validation, or introduce checkpointing without rewriting each agent&amp;rsquo;s core responsibility.&lt;/p>
&lt;p>When I later looked at LangGraph, I found this same idea formalized as graph nodes that receive state and return a &lt;code>Command&lt;/code> specifying which node runs next and what state updates to apply. The plain Python example above maps directly to &lt;code>START → writer → reviewer → END&lt;/code>, with shared state as the communication channel. Building the minimal version first helped me understand what the framework is actually abstracting.&lt;/p>
&lt;hr>
&lt;h2 id="the-super-agent-as-orchestrator">The Super Agent as Orchestrator
&lt;/h2>&lt;p>One pattern that came up consistently across everything I read: in production multi-agent systems, the super agent is the &lt;strong>orchestrator&lt;/strong> — not another worker. This distinction matters more than it sounds.&lt;/p>
&lt;p>The orchestrator does not perform domain work. It decomposes the user goal and assigns sub-tasks to specialist agents. It tracks workflow state, evaluates intermediate results, and decides on next steps, retries, or fallbacks. It enforces policies, cost boundaries, and safety checks at a single control point. Every specialist agent has a scoped responsibility; the orchestrator has workflow-level visibility.&lt;/p>
&lt;p>I sketched out two diagrams to think through how this works in practice. The first illustrates a software delivery context: a single Super Agent at the top of the hierarchy delegates to five specialized agents — Requirements, Coder, Refactor, Test, and Documentation — each with a clearly scoped responsibility and no direct coupling to the others.&lt;/p>
&lt;p style="text-align: center;">
&lt;img src="https://corebaseit.com/diagrams/SuperAgentCodeSoftware.png" alt="Super Agent orchestrating a software delivery pipeline — each specialist agent owns a single stage while the orchestrator owns the sequence, gates, and handoffs" style="max-width: 700px; width: 100%;" />
&lt;/p>
&lt;p>The second diagram scales the same pattern to a broader engineering context. Here the orchestrator coordinates six agents covering the full stack — Requirements, Architecture, Frontend, Backend, Test, and Security — and what I noticed is that the hierarchy holds regardless of how many specialists you introduce.&lt;/p>
&lt;p style="text-align: center;">
&lt;img src="https://corebaseit.com/diagrams/superAI.png" alt="Super Agent orchestrating a full-stack engineering workflow — adding specialist agents does not change the orchestration contract, only the assignment table grows" style="max-width: 700px; width: 100%;" />
&lt;/p>
&lt;p>What stays constant across both diagrams — and what I think is the key insight — is that the orchestrator is the only node with full workflow visibility. Specialist agents receive scoped inputs and produce scoped outputs. They do not need to know what the other agents are doing. That coordination burden belongs entirely to the super agent.&lt;/p>
&lt;p>The practical three-layer production pattern that I kept seeing emerge:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Layer&lt;/th>
&lt;th>Role&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Orchestrator / super agent&lt;/strong>&lt;/td>
&lt;td>Owns the workflow graph, task assignment, and gate logic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Shared context store&lt;/strong>&lt;/td>
&lt;td>Versioned state or artifacts (DB, files, or structured in-memory state) — the single source of truth&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Specialist agents&lt;/strong>&lt;/td>
&lt;td>Read from the store, produce outputs into it, never assume hidden state&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>This layering felt immediately familiar to me. It mirrors how well-designed distributed systems have always worked: a coordinator with global visibility, workers with local scope, and a shared data layer that keeps everyone honest.&lt;/p>
&lt;hr>
&lt;h2 id="single-source-of-truth-non-negotiable">Single Source of Truth: Non-Negotiable
&lt;/h2>&lt;p>One thing that stood out across nearly every resource I read: multi-agent systems fail when each agent builds its own version of reality. The mature architectures all anchor the entire system to a &lt;strong>single source of truth&lt;/strong> — whether that is a shared in-process state object, a central database, or a versioned artifact store.&lt;/p>
&lt;p>The benefits are concrete, and they&amp;rsquo;re the same benefits I&amp;rsquo;ve seen in any well-designed distributed system:&lt;/p>
&lt;p>&lt;strong>Consistency.&lt;/strong> No diverging world-views across agents running in parallel. When the coder agent writes a function and the test agent writes assertions against it, both are working from the same artifact — not from separate memories of what the specification said.&lt;/p>
&lt;p>&lt;strong>Debuggability.&lt;/strong> One place to inspect current state across the entire workflow. When something goes wrong — and in multi-agent systems, something always goes wrong — you need a single pane of glass to understand what each agent saw, what it produced, and where the chain broke.&lt;/p>
&lt;p>&lt;strong>Clean handoffs.&lt;/strong> Agents know exactly which fields or artifacts they are responsible for updating. They do not invent state. They do not carry assumptions from a previous run. They read, process, and write — through the central store.&lt;/p>
&lt;p>Agents may maintain local working memory or intermediate caches for their own reasoning steps, but they must reconcile through the central truth store before producing outputs that other agents depend on. This is the difference between a system that works reliably and one that works until the agents&amp;rsquo; internal models diverge — which, without a single source of truth, they eventually will.&lt;/p>
&lt;hr>
&lt;h2 id="the-bigger-picture">The Bigger Picture
&lt;/h2>&lt;p>After going through all of this, my takeaway is that the super agent concept is not hype — if you ground it in architecture. The key properties are clear: a goal-decomposing orchestrator, loosely coupled specialist agents, structured inter-agent communication, and a single authoritative state store. The Python pattern in this post is deliberately minimal — I wanted to see the essential reasoning surface before layering on a framework.&lt;/p>
&lt;p>If you are building toward a LangGraph or similar implementation, the concepts translate directly: nodes map to agents, edges map to message contracts, and the graph state is your single source of truth. The abstraction is different. The architecture is the same.&lt;/p>
&lt;p>The broader realization I came away with is that the hard problem in agentic AI is not making individual agents smarter. It is making multiple agents coordinate reliably — which is, fundamentally, a systems engineering problem. The same principles that make distributed systems work — clear contracts, shared state, scoped responsibility, centralized coordination — are exactly the principles that make multi-agent systems work.&lt;/p>
&lt;p>The models handle the reasoning. The architecture handles the reliability.&lt;/p>
&lt;p>But centralized orchestration is not the only way to coordinate agents. In &lt;a class="link" href="https://corebaseit.com/posts_in_review/swarm-intelligence-opposite-architectural-bet/" >Part II&lt;/a>, I explore the opposite architectural bet — &lt;strong>swarm intelligence&lt;/strong> — where there is no orchestrator, no global plan, and global competence emerges from local interactions. Understanding when each pattern wins is what makes the difference between a good multi-agent design and an overengineered one.&lt;/p>
&lt;hr>
&lt;h2 id="references">References
&lt;/h2>&lt;ul>
&lt;li>Attention.com. &amp;ldquo;Introducing Super Agent: Your AI Teammate for Revenue Execution.&amp;rdquo; 2025.&lt;/li>
&lt;li>IBM Think. &amp;ldquo;What is a Multi-Agent System.&amp;rdquo; &lt;a class="link" href="https://www.ibm.com/think/topics/multiagent-system" target="_blank" rel="noopener"
>ibm.com&lt;/a>&lt;/li>
&lt;li>AWS Prescriptive Guidance. &amp;ldquo;Agentic AI: Multi-Agent Collaboration Patterns.&amp;rdquo; &lt;a class="link" href="https://docs.aws.amazon.com/prescriptive-guidance/latest/agentic-ai-multi-agent-collaboration-patterns/introduction.html" target="_blank" rel="noopener"
>docs.aws.amazon.com&lt;/a>&lt;/li>
&lt;li>GeeksforGeeks. &amp;ldquo;Multi-Agent System in AI.&amp;rdquo; &lt;a class="link" href="https://www.geeksforgeeks.org/multi-agent-system-in-ai/" target="_blank" rel="noopener"
>geeksforgeeks.org&lt;/a>&lt;/li>
&lt;li>SmythOS. &amp;ldquo;Agent Communication in Multi-Agent Systems.&amp;rdquo; &lt;a class="link" href="https://smythos.com/ai-agents/multi-agent-systems/agent-communication/" target="_blank" rel="noopener"
>smythos.com&lt;/a>&lt;/li>
&lt;li>ApXML. &amp;ldquo;Communication Protocols for LLM Agents.&amp;rdquo; 2025.&lt;/li>
&lt;li>DigitalOcean. &amp;ldquo;Agent Communication Protocols Explained.&amp;rdquo; &lt;a class="link" href="https://www.digitalocean.com/resources/articles/agent-communication" target="_blank" rel="noopener"
>digitalocean.com&lt;/a>&lt;/li>
&lt;li>LangChain. &amp;ldquo;LangGraph Multi-Agent Systems Overview.&amp;rdquo; &lt;a class="link" href="https://langchain-ai.github.io/langgraph/concepts/multi_agent/" target="_blank" rel="noopener"
>langchain-ai.github.io&lt;/a>&lt;/li>
&lt;li>LangChain. &amp;ldquo;Multi-Agent Collaboration Tutorial.&amp;rdquo; &lt;a class="link" href="https://langchain-ai.github.io/langgraph/tutorials/multi_agent/multi-agent-collaboration/" target="_blank" rel="noopener"
>langchain-ai.github.io&lt;/a>&lt;/li>
&lt;li>VentureBeat. &amp;ldquo;How Architectural Design Drives Reliable Multi-Agent Orchestration.&amp;rdquo; 2025.&lt;/li>
&lt;li>IBM Community. &amp;ldquo;Agentic Multi-Cloud Infrastructure Orchestration.&amp;rdquo; 2025.&lt;/li>
&lt;li>Latenode Community. &amp;ldquo;How Separate Agents Share a Single Memory.&amp;rdquo; 2025.&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts_in_review/swarm-intelligence-opposite-architectural-bet/" >Part II: Swarm Intelligence — The Opposite Architectural Bet&lt;/a> — decentralized coordination, emergent intelligence, and when to choose swarm over orchestrator&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts/ai-sycophancy/" >AI Sycophancy&lt;/a> — why confident-looking AI output still requires verification, even from autonomous agents&lt;/li>
&lt;li>&lt;a class="link" href="https://corebaseit.com/posts/reasoning-models-deep-reasoning-llms/" >Reasoning Models and Deep Reasoning in LLMs&lt;/a> — the reasoning strategies that power individual agents&lt;/li>
&lt;li>&lt;em>The Obsolescence Paradox: Why the Best Engineers Will Thrive in the AI Era&lt;/em> — engineering judgment in the age of autonomous AI systems&lt;/li>
&lt;/ul></description></item></channel></rss>