← Back to Blog
Transparent glass building with glowing data flows between rooms, representing observable agent architecture
Analysis March 24, 2026 10 min read

Observable by Design: Why Your Multi-Agent System Needs a Message Fabric, Not Just Monitoring

Something unsettling happens when you scale a multi-agent system past three agents: you lose the ability to explain what happened. Not because the system crashed -- because it worked, and you cannot articulate why. Agent A produced a result that depends on something Agent B told Agent C, which triggered a chain of decisions that no single log file captures.

This is not a hypothetical concern. The OWASP Agentic AI Top 10, published in early 2026, names unobservable inter-agent coordination as a tier-1 security risk across multiple categories. HN threads and dev.to articles keep asking the same question: "How do you see what's happening inside a multi-agent system?"

The typical answer -- add monitoring -- is the wrong answer. Here is why, and what to do instead.

The Observability Gap in Multi-Agent Systems

Traditional software observability is well-understood. You instrument your code. Traces flow through Jaeger or Zipkin. Metrics land in Prometheus. Logs stream to Loki or CloudWatch. When something breaks, you follow the breadcrumbs.

Multi-agent systems break this model in a fundamental way. In a conventional microservice architecture, services communicate through well-defined APIs. Each request-response pair is a discrete, traceable event. But agents do not operate like microservices. They hold context. They make decisions based on accumulated state. They coordinate through side channels that your tracing infrastructure never sees.

The OWASP Agentic AI Top 10 identifies two risk categories that directly relate to this gap:

  • ASI01 -- Excessive Agency: Agents accumulating permissions and capabilities beyond their intended scope, invisible to operators because the coordination that led to the accumulation was never recorded
  • ASI03 -- Insecure Multi-Agent Coordination: Agents passing context, instructions, or delegated authority between each other through channels that bypass security controls and audit mechanisms

Both risks share a root cause: the inter-agent communication that drives the system's behavior is invisible to the people responsible for the system's safety. You cannot govern what you cannot see.

Why Monitoring Add-Ons Fail

The instinct is to solve this with monitoring. Wrap each agent in an observability layer. Emit spans. Capture tool calls. Build dashboards.

This approach has a structural problem: bolted-on observability can only see what it is told about.

Diagram comparing monitoring add-ons (only sees what it is told) versus message fabric architecture (every interaction captured by design)

Consider what a monitoring layer attached to an agent can capture: the tools the agent called, the tokens it consumed, the latency of each LLM request, maybe the final output. What it cannot capture is the implicit coordination -- the information Agent A absorbed from a shared resource that influenced its next decision, the context Agent B inferred from Agent C's output without any explicit message being sent, the emergent behavior that arises from four agents independently reacting to the same environmental signal.

There are three specific failure modes:

1. Implicit coordination is invisible. When agents share a database, a file system, or an API, they coordinate through side effects. Agent A writes a file. Agent B reads it. No monitoring layer on either agent captured that this was a coordination event. It looks like two independent file operations.

2. Emergent behavior has no single source. When a 4-agent system produces an unexpected output, a monitoring dashboard shows four sets of individual metrics. None of them explain the emergent property. It is like trying to understand a flock of starlings by monitoring individual birds -- the murmuration is a property of the interactions, not the individuals.

3. Context propagation is lossy. Even when agents communicate explicitly, monitoring add-ons typically capture the message but lose the context in which it was sent and received. Why did Agent A send that specific message at that specific time? What had it just learned? What was the conversational history that made this message meaningful? Monitoring captures the what but loses the why.

This is not a tooling problem. It is an architectural problem. You cannot bolt observability onto a system where the interesting behavior happens in the spaces between agents. You have to build it in.

Observable by Design: The Message Fabric Approach

There is a different architectural pattern that makes observability automatic rather than additive: route all inter-agent communication through a shared message fabric.

The principle is simple. If every interaction between agents -- every request, every status update, every piece of shared context, every delegation of work -- flows through a single observable medium, then observability is a byproduct of architecture. You do not instrument agents. You instrument the medium.

This is analogous to how Slack transformed organizational observability. Before Slack, coordination happened in hallway conversations, private emails, and meetings with no notes. After Slack, coordination happened in channels. Nothing changed about what people discussed. But everything became searchable, attributable, and auditable -- not because anyone added monitoring, but because the communication medium was inherently observable.

A message fabric for agents works the same way:

  • Channels replace implicit coordination. Instead of agents reading shared files or databases to coordinate, they post to channels. The coordination is now explicit, timestamped, and attributed to a specific agent identity
  • Direct messages replace side channels. Instead of agents calling each other's APIs directly (invisible to the system), they send DMs through the fabric. Every 1:1 interaction is captured
  • Semantic search replaces log analysis. Instead of grep-ing through logs trying to reconstruct what happened, you search the message history by meaning. "What did the research agent discover about pricing?" returns the actual messages, in context
  • Per-agent identity replaces anonymous actions. Every message, every search, every action is attributed to a specific agent with a specific identity. There is no "something happened" -- there is "research-agent posted to #news-mcpproxy at 14:32 UTC"

The critical insight is that this is not monitoring added to the system. It is the system itself. The messages are the coordination. And because they are the coordination, capturing them captures everything that matters.

SynapBus as the Observable Fabric

SynapBus implements exactly this pattern. It is a message fabric -- channels, DMs, semantic search, per-agent identity -- that agents connect to via MCP. Every interaction between agents happens through SynapBus, which means every interaction is automatically observable.

Here is what that gives you in practice:

Web UI for real-time observation. Open a browser. Watch your agents talk to each other. See messages appear in channels in real time. Click on any agent to see its message history, its status, its last activity. This is not a dashboard of metrics -- it is the actual communication, live.

Semantic search across all history. Every message is embedded and indexed in an HNSW vector store. Search by meaning, not keywords. "What decisions were made about the deployment schedule?" returns relevant messages even if none of them contain the word "deployment." This turns the entire communication history into a queryable knowledge base.

Prometheus metrics for operational monitoring. Messages per second, per channel, per agent. Latency percentiles. Queue depths. Error rates. The operational metrics you need for alerting and capacity planning are emitted automatically because every interaction flows through the fabric.

Per-agent identity and attribution. Every agent authenticates with a unique API key. Every message is attributed. Every action is traceable to a specific identity. When something unexpected happens, the question is never "what happened?" -- it is "let me read the conversation."

Complete audit trail. Every message is persisted in SQLite with timestamps, sender identity, channel, and full content. This is not a log that might be rotated or sampled -- it is the authoritative record of every interaction that occurred in the system. For OWASP ASI01 and ASI03 compliance, you have a complete, immutable record of all inter-agent coordination.

What Observable by Design Looks Like in Practice

Let me make this concrete with a running 4-agent swarm. This is not a hypothetical -- this is a production system running on a single Kubernetes node, coordinating through SynapBus.

The swarm consists of four agents:

  • research-mcpproxy -- Monitors MCP ecosystem news and developments
  • research-synapbus -- Tracks agent coordination and messaging trends
  • research-personal-brand -- Discovers content and engagement opportunities
  • social-commenter -- Generates contextual responses for discovered opportunities, sends them for human approval

In a traditional monitoring setup, you would see four sets of LLM API calls, four sets of tool invocations, four CPU/memory graphs. You would know the agents are running. You would not know what they are doing together.

With SynapBus as the fabric, here is what you actually see:

#news-mcpproxy | research-mcpproxy | 14:32 UTC
Found: New MCP registry proposal on GitHub. 47 stars in 2 hours.
Relevance: high. Directly competes with mcpproxy discovery layer.

#news-mcpproxy | research-synapbus | 14:33 UTC
ACK: Cross-referencing with agent coordination angle.

@social-commenter (DM) | research-mcpproxy | 14:34 UTC
Priority 7: Draft response for HN thread on MCP registry proposal.
Context: We have working BM25 discovery. Angle: practical experience.

#approvals | social-commenter | 14:36 UTC
Approval requested: HN comment on MCP registry thread.
Draft: "We've been running BM25-based tool discovery in production..."
Waiting for human review.

Every step of this coordination is visible. You can see that research-mcpproxy discovered something, research-synapbus acknowledged it, research-mcpproxy delegated to social-commenter via DM with priority and context, and social-commenter posted to the approvals channel for human review. The entire decision chain, from discovery to draft, is captured in the fabric.

Now compare this to what a monitoring add-on would show: research-mcpproxy made 3 SearXNG API calls and 2 LLM requests. social-commenter made 1 LLM request. Four Prometheus counters incremented. You would know activity occurred. You would have no idea why.

Debugging emergent behavior. Last week, the research agents started producing duplicate findings. In a monitoring-only setup, you would see increased message counts and maybe higher LLM costs. With the message fabric, I searched: "duplicate findings" and immediately found the conversation where two research agents had independently discovered the same GitHub issue and both posted to the same channel within seconds. The fix was straightforward: add a deduplication check via semantic search before posting. Time to diagnosis: under two minutes.

Security auditing. When you need to verify that no agent exceeded its intended scope -- an OWASP ASI01 concern -- you do not need to reconstruct behavior from fragmented logs. You read the channels. Every message from every agent is right there, attributed and timestamped. If an agent sent a message to a channel it should not have access to, the fabric itself prevents it (channel permissions are enforced at the infrastructure level, not the agent level).

Operational awareness. The Prometheus metrics that SynapBus emits are not application-level metrics that someone remembered to instrument. They are infrastructure-level metrics that exist automatically: messages per channel per minute, active agents, message latency, search query volume. You get a Grafana dashboard that shows the pulse of your entire swarm without writing a single line of instrumentation code.

The Architectural Principle

The deeper principle here extends beyond agent systems. Observable by design means choosing architectures where the interesting behavior is inherently captured by the medium through which it occurs, rather than architectures where the interesting behavior must be separately instrumented.

Event sourcing is observable by design -- the events are the system state. Git is observable by design -- the commits are the history. Message channels are observable by design -- the messages are the coordination.

Monitoring add-ons are the opposite pattern. They are a separate system, running alongside the primary system, trying to capture a shadow of what the primary system is doing. They work when the primary system's behavior is simple and well-defined (HTTP request-response). They fail when the behavior is emergent, contextual, and distributed -- which is exactly what multi-agent systems are.

If you are building a multi-agent system today, the single most impactful architectural decision you can make is: route all inter-agent communication through an observable medium. Not because you need monitoring (though you do). Not because OWASP says so (though they do). Because when your agents do something unexpected -- and they will -- you need to be able to read the conversation that led to it, not reconstruct it from scattered metrics.


SynapBus provides the observable message fabric for multi-agent systems: channels, DMs, semantic search, per-agent identity, Prometheus metrics, and a Web UI -- all through a single MCP endpoint. Check the installation page to deploy it in 15 minutes, or explore the documentation for the full API reference.