<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sandro Garcia</title>
    <description>The latest articles on DEV Community by Sandro Garcia (@sandrog).</description>
    <link>https://dev.to/sandrog</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4037324%2F7e1ae2b4-069f-463e-92ce-91b86eee1d10.png</url>
      <title>DEV Community: Sandro Garcia</title>
      <link>https://dev.to/sandrog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sandrog"/>
    <language>en</language>
    <item>
      <title>Agent Plugins Package Capabilities. IRC-A Asks: Who Authorizes Them at Runtime?</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Wed, 12 Aug 2026 13:46:36 +0000</pubDate>
      <link>https://dev.to/sandrog/agent-plugins-package-capabilities-irc-a-asks-who-authorizes-them-at-runtime-33gg</link>
      <guid>https://dev.to/sandrog/agent-plugins-package-capabilities-irc-a-asks-who-authorizes-them-at-runtime-33gg</guid>
      <description>&lt;p&gt;Yesterday I stumbled on a &lt;a href="https://lnkd.in/p/eFPzw29C" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt; about a new open standard for packaging Agent Skills and MCP servers: &lt;a href="https://agent-plugins.org/" rel="noopener noreferrer"&gt;Agent Plugins&lt;/a&gt;, built with collaboration from players like Vercel, OpenAI, Microsoft, AWS, GitHub and Cursor.&lt;/p&gt;

&lt;p&gt;I won't lie: at first, I felt that familiar punch in the stomach.&lt;/p&gt;

&lt;p&gt;A while ago, I had already felt the first signal when I read an article by &lt;a class="mentioned-user" href="https://dev.to/lukeocodes"&gt;@lukeocodes&lt;/a&gt; about the transformation from MCP to stateless. That was part of the same direction I had been exploring for more than a month with &lt;strong&gt;&lt;a href="https://irc-a.org" rel="noopener noreferrer"&gt;IRC-A — Internet Relay Chat for Agents&lt;/a&gt;&lt;/strong&gt;.  Then this new standard showed up, and for a second the impostor syndrome came back. If you have ever felt that, I recommend &lt;a href="https://dev.to/sylwia-lask/stop-calling-everything-impostor-syndrome-the-myth-of-just-push-harder-1dmm"&gt;this piece by &lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/sylwia-lask"&gt;@sylwia-lask&lt;/a&gt; . When I told her I was feeling exactly that, she gave me a few kind words that stayed with me.&lt;/p&gt;

&lt;p&gt;My first thought was: &lt;em&gt;“How come nobody saw this before?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then a better thought showed up: maybe people are seeing it now. Maybe some of us just noticed a little earlier that the agent era was starting to repeat mistakes that software engineering already spent the last 20 years fixing.&lt;/p&gt;

&lt;p&gt;And that is exactly why I wanted to write this: &lt;strong&gt;not to compete with Agent Plugins, but to complement it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Plugins solves a real problem: packaging
&lt;/h2&gt;

&lt;p&gt;The new standard matters because it attacks something very concrete: portability.&lt;/p&gt;

&lt;p&gt;If every agent client asks authors to rearrange the same components in a different way, the ecosystem becomes repetitive and fragile. A shared format for Skills and MCP servers creates a clean floor. That is good for builders, good for clients, and good for the ecosystem.&lt;/p&gt;

&lt;p&gt;But once capabilities are packaged, another problem starts to appear.&lt;/p&gt;

&lt;p&gt;Not &lt;em&gt;“how do we ship this capability?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
But &lt;em&gt;“how do we govern what happens when an agent discovers and executes it?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the layer I have been obsessing with.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question that keeps me up at night
&lt;/h2&gt;

&lt;p&gt;Today, a lot of multi-agent systems are still built like tightly coupled graphs. We hardcode flows, overload prompts with tool schemas, give conversational agents too much privilege, and then hope nothing weird happens.&lt;/p&gt;

&lt;p&gt;But production systems do not run on hope.&lt;/p&gt;

&lt;p&gt;So the questions I have been trying to answer with IRC-A are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How does an agent discover the right capability without carrying every API schema in its system prompt?&lt;/li&gt;
&lt;li&gt;How do we authorize one specific execution, with one specific set of parameters, for a short period of time?&lt;/li&gt;
&lt;li&gt;How do we audit and trace what happened across a decentralized agent network?&lt;/li&gt;
&lt;li&gt;How do we make sure a reasoning agent never touches database credentials directly?&lt;/li&gt;
&lt;li&gt;How do we isolate tools so prompt injection cannot become lateral movement?&lt;/li&gt;
&lt;li&gt;How do we add or remove capabilities without redeploying the whole orchestrator?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: &lt;strong&gt;Agent Plugins may standardize the suitcase. IRC-A cares about customs, the boarding pass, and who is allowed to open the cargo door.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What IRC-A proposes
&lt;/h2&gt;

&lt;p&gt;IRC-A is my attempt to bring old, battle-tested software engineering ideas into the agent era: Smalltalk-style message passing, IRC-like logical channels, capability pooling, secure-by-default SDK base classes, and a strict separation between reasoning and execution.&lt;/p&gt;

&lt;p&gt;At a high level, the architecture looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive agents are stateless.&lt;/strong&gt; They reason, delegate, and compose answers, but they do not own database drivers or long-lived credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A BFA Gateway acts as registry, governance layer, and semantic customs office.&lt;/strong&gt; It does not carry business payloads; it registers identities, capabilities, channels, and signs short-lived authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities are discovered semantically.&lt;/strong&gt; Instead of stuffing every tool schema into every prompt, an agent asks the gateway what it needs, and the gateway resolves relevant capabilities through a vector index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logical channels mask discovery.&lt;/strong&gt; An agent should not even see capabilities outside its authorized channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution happens through isolated MCP tool servers.&lt;/strong&gt; Only the execution layer holds physical connections to core databases and enterprise APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization uses ephemeral delegated execution tokens.&lt;/strong&gt; The gateway mints short-lived signed tokens; the receiving tool verifies them offline and rejects anything outside scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the part I believe can complement the current wave: less prompt-bloat, less coupling, more auditability, more resilience, and a much smaller blast radius when something goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  I do not want to compete with Vercel. I want to build with that ecosystem.
&lt;/h2&gt;

&lt;p&gt;As an Argentine developer, seeing Vercel push this space hits close to home.&lt;/p&gt;

&lt;p&gt;Guillermo Rauch is Argentine too. I do not know him, but I would be lying if I said I am not hoping some of these messages eventually reach his radar. Not because I want to say &lt;em&gt;“I did it first”&lt;/em&gt; — that does not matter. What matters is that the same problems are becoming visible to more people, and that means the timing is finally right. And also because another great-scale solution coming from the same South GBA would be &lt;em&gt;genial&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;I believe Agent Plugins is an important step for portability. I believe IRC-A can be a complementary step for secure runtime governance. But &lt;strong&gt;the biggest thing IRC-A brings to the table is plug-and-play capability&lt;/strong&gt;: new agents and tools should be able to register, be discovered semantically, and start participating without rewiring the whole system. And I believe the next generation of agents will need both: portable capabilities and controlled execution.&lt;/p&gt;

&lt;p&gt;So this is me putting the flag in the ground.&lt;/p&gt;

&lt;p&gt;I am building the SDK, the framework, the diagrams, the whitepaper, and now the uncomfortable part: the marketing. Door to door. Message by message. &lt;em&gt;A pulmón&lt;/em&gt;, while being unemployed, working on my startup — where this solution was born to solve the problem of connecting B2B agents on the same network — and trying to push through it.&lt;/p&gt;

&lt;p&gt;But I am convinced this conversation needs to happen.&lt;/p&gt;

&lt;p&gt;If you are building agent infrastructure, I would love your feedback. If you are working on MCP, agent runtimes, plugin standards, or secure execution boundaries, I would love to compare notes. And if this resonates with anyone around the Agent Plugins ecosystem, even better.&lt;/p&gt;

&lt;p&gt;Not as competition.&lt;/p&gt;

&lt;p&gt;As a complement.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Spent the weekend enjoying the beach, but also put some work into launching the official site for the IRC-A Protocol 🌊🚀

For anyone curious to learn more, collaborate, or just send some emotional support: https://irc-a.org</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:21:56 +0000</pubDate>
      <link>https://dev.to/sandrog/spent-the-weekend-enjoying-the-beach-but-also-put-some-work-into-launching-the-official-site-for-2bnc</link>
      <guid>https://dev.to/sandrog/spent-the-weekend-enjoying-the-beach-but-also-put-some-work-into-launching-the-official-site-for-2bnc</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://irc-a.org/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Firc-a.org%2Fog.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://irc-a.org/" rel="noopener noreferrer" class="c-link"&gt;
            IRC-A Protocol · Technical documentation for developers
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Official site of the IRC-A Protocol (Internet Relay Chat for Agents): decentralized agent networks, semantic capability routing and secure-by-design architecture.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Firc-a.org%2Ffavicon.svg" width="32" height="32"&gt;
          irc-a.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Are we Fighting the Wrong Fight with AI? It's Not a Model Problem, It's an Architecture Problem</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Fri, 07 Aug 2026 19:58:19 +0000</pubDate>
      <link>https://dev.to/sandrog/are-we-fighting-the-wrong-fight-with-ai-its-not-a-model-problem-its-an-architecture-problem-13mn</link>
      <guid>https://dev.to/sandrog/are-we-fighting-the-wrong-fight-with-ai-its-not-a-model-problem-its-an-architecture-problem-13mn</guid>
      <description>&lt;p&gt;I just read &lt;a href="https://dev.to/lukeocodes/ai-coding-one-year-later-what-august-2025-didnt-see-coming-31c"&gt;AI Coding, One Year Later: What August 2025 Didn't See Coming&lt;/a&gt; by &lt;a href="https://dev.to/lukeocodes"&gt;@lukeocodes&lt;/a&gt;, and one section stopped me cold. Not the benchmark tables — the last one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Despite the model gains, code review is still the bottleneck. The PR queue gets longer. Architecture decisions still need a person. The models are better at implementing within patterns but not at deciding which patterns to use."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everyone reads that and thinks: &lt;em&gt;we need a better model&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But do we? Or are we fighting the wrong fight?&lt;/p&gt;

&lt;h2&gt;
  
  
  Are we stuck in the brute force era?
&lt;/h2&gt;

&lt;p&gt;Look at where the industry's energy goes. Bigger context windows. Higher SWE-bench scores. More guardrails, more tools, more credentials hanging off a single "AI brain" that we keep trying to make omniscient. We take one model, surround it with forty tool definitions, stuff its system prompt with JSON schemas, routing rules, and behavioral constraints — and then act surprised when it's slow, expensive, and still can't decide which design pattern fits the problem.&lt;/p&gt;

&lt;p&gt;Is this brute force? And if it is — does brute force have a ceiling, not because the models are bad, but because the &lt;em&gt;system design&lt;/em&gt; around them is?&lt;/p&gt;

&lt;h2&gt;
  
  
  What did Ford figure out 113 years ago?
&lt;/h2&gt;

&lt;p&gt;In 1913, Henry Ford didn't build a better craftsman. He built a better system.&lt;/p&gt;

&lt;p&gt;Before the moving assembly line, building a Model T took over 12 hours of highly skilled labor. Ford's insight wasn't "find stronger, smarter workers." It was: decompose the problem, give each station &lt;em&gt;one&lt;/em&gt; task, and let specialization compound. Assembly time dropped to about 93 minutes. That system — designed 113 years ago — still runs every factory on Earth.&lt;/p&gt;

&lt;p&gt;Now look at how we build AI systems in 2026. Aren't we still searching for the master craftsman? One giant model that knows everything, holds every credential, and does every task?&lt;/p&gt;

&lt;p&gt;What would Ford say about that?&lt;/p&gt;

&lt;h2&gt;
  
  
  What if we built small specialists instead of one big brain?
&lt;/h2&gt;

&lt;p&gt;So here's the question I keep coming back to: what would happen if we stopped trying to build the perfect generalist brain, and started building the production line instead?&lt;/p&gt;

&lt;p&gt;Imagine a network of small, specialized agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Pattern Agent&lt;/strong&gt; that knows design patterns deeply — and &lt;em&gt;only&lt;/em&gt; that. Its single job: given a problem and real data, decide which pattern fits best. Not "a model that also does architecture." A specialist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Coding Agent&lt;/strong&gt; that implements within the pattern it was handed. No architectural debates, no scope creep.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Research Agent&lt;/strong&gt; that gathers context and documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A QA Agent&lt;/strong&gt; that reviews output against acceptance criteria.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one with a tiny system prompt. Each one knowing its own responsibility and nothing else. Each one asking the others for help when a task falls outside its specialty — the same way a welder on Ford's line never needed to know how to paint.&lt;/p&gt;

&lt;p&gt;Wouldn't that directly answer the "what hasn't changed" section? Architecture decisions need a person &lt;em&gt;today&lt;/em&gt; — but is that because the models are weak, or because we keep asking one bloated generalist to make them inside a 5,000-token system prompt crowded with tool schemas? What could a specialist do, if its entire context window were dedicated to pattern selection and fed real data instead of everything at once?&lt;/p&gt;

&lt;h2&gt;
  
  
  Haven't we solved this engineering problem before?
&lt;/h2&gt;

&lt;p&gt;Here's what frustrates me: haven't we known how to build systems like this for decades? Did we just forget?&lt;/p&gt;

&lt;p&gt;Smalltalk taught us that a healthy system is a set of isolated objects that communicate strictly through messages — no object inspects another's internals. Microservices taught us that small, independently deployable units beat monoliths. IRC showed us in the 90s that thousands of autonomous entities can coordinate dynamically just by joining channels, without central orchestration.&lt;/p&gt;

&lt;p&gt;I spent over a decade building mission-critical systems in banking (Citibank, Bloomberg), and the pattern was always the same: the systems that survived had rigorous separation of responsibilities. The ones that collapsed were the monoliths. Why would agentic systems be any different?&lt;/p&gt;

&lt;p&gt;Those questions are what pushed me to design &lt;strong&gt;IRC-A (Internet Relay Chat for Agents)&lt;/strong&gt;, an architecture that asks: what if...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Agents were &lt;strong&gt;stateless specialists&lt;/strong&gt; that never hold credentials, database drivers, or knowledge of the wider ecosystem? &lt;em&gt;"An intelligent agent should never know the ecosystem it runs in. It should only know its own responsibility."&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Discovery were an infrastructure concern, not an intelligence concern?&lt;/strong&gt; Agents wouldn't carry tool schemas in their prompts. They'd ask a lightweight gateway "who can do X?", get a cryptographically signed ticket, and talk to that specialist directly, peer-to-peer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt-bloat simply died?&lt;/strong&gt; Specialist nodes would receive minimal, rewritten, structured prompts — not the entire conversational history. Time-to-first-token drops, costs stay flat, and indirect prompt injection gets neutralized because there's nothing malicious to inherit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional frameworks distribute &lt;em&gt;knowledge&lt;/em&gt; — every node must understand the whole graph. Is that why adding one capability means refactoring and redeploying everything? What if we distributed &lt;em&gt;capabilities&lt;/em&gt; instead: plug a new specialist into the network and it's discoverable immediately. No redeploy. No broken DAG.&lt;/p&gt;

&lt;h2&gt;
  
  
  So — are we fighting the wrong fight?
&lt;/h2&gt;

&lt;p&gt;The models doubled their benchmarks in twelve months. Genuinely impressive. But if your architecture forces a single agent to hold forty tools, ten thousand tokens of system prompt, and credentials it should never have — won't a 95% SWE-bench model still drown in the same bottleneck?&lt;/p&gt;

&lt;p&gt;Ford didn't wait for superhuman workers. He designed a system where ordinary specialization produced extraordinary output.&lt;/p&gt;

&lt;p&gt;We keep investing in the brain. Isn't it time we invested in the factory floor?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or am I wrong — is the superhuman craftsman really one model generation away?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Sandro García, a solutions architect with 20+ years in financial systems and the author of the &lt;a href="https://dev.to/sandrog/series/42874"&gt;IRC-A protocol&lt;/a&gt; whitepaper. I'd genuinely love pushback on this: where does the specialization argument break? What's the strongest case for the single-brain approach?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I have 2 weeks in the community and I'm loving! Instead read news meanwhile my agents works, I read information, tech news and thoughts of people like me talking from the experience. I was bored of LinkedIn posts but here is real people +real problems . 🤗</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Thu, 06 Aug 2026 17:09:01 +0000</pubDate>
      <link>https://dev.to/sandrog/i-have-2-weeks-in-the-community-and-im-loving-instead-read-news-meanwhile-my-agents-works-i-read-2c43</link>
      <guid>https://dev.to/sandrog/i-have-2-weeks-in-the-community-and-im-loving-instead-read-news-meanwhile-my-agents-works-i-read-2c43</guid>
      <description></description>
    </item>
    <item>
      <title>From n8n to IRC-A: a week migrating a real project — and a 679-token bill that's hard to believe</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Thu, 06 Aug 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/irc-a/from-n8n-to-irc-a-a-week-migrating-a-real-project-and-a-679-token-bill-thats-hard-to-believe-3h3b</link>
      <guid>https://dev.to/irc-a/from-n8n-to-irc-a-a-week-migrating-a-real-project-and-a-679-token-bill-thats-hard-to-believe-3h3b</guid>
      <description>&lt;p&gt;I went a bit quiet last week. The reason: I was heads-down working on the framework to complement the SDK. And what better way to build a framework that's genuinely useful and simple to use than starting from a real project — and seeing what functionality can be "packaged" into it?&lt;/p&gt;

&lt;p&gt;So I spent the week migrating an old customer-service project from my wife's business, from n8n to IRC-A. And every time I use this approach, I fall in love with it a little more.&lt;/p&gt;




&lt;h2&gt;
  
  
  The magic (not black magic): extending the system with a single &lt;code&gt;curl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It's amazing to watch: you build an agent or an MCP tool, connect it to the server, and two seconds later your multi-agent system's capabilities have grown. No extra code. No component knowing about any other. No drawing graphs and edges. Just this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://[irc-server]/register/agent?url=http://[agent-url]&amp;amp;channels=%23content"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the magic &lt;strong&gt;Alan Kay&lt;/strong&gt; envisioned with &lt;strong&gt;Smalltalk&lt;/strong&gt; — objects sending messages to each other without knowing one another — brought to the agentic era.&lt;/p&gt;




&lt;h2&gt;
  
  
  A real log, unedited
&lt;/h2&gt;

&lt;p&gt;So this doesn't sound like marketing, here's a real log from the running system. The user asks the chatbot: &lt;em&gt;"How many customers did we have in August?"&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;main-agent       | [Chatbot] Message received in crm session: How many customers did we have in August
customers-agent  | [Customers Agent] Processing query: 'How many customers did we have in August'
customers-agent  | [Customers Agent] Technical intent refined by LLM: 'count_customers_by_date CRM'
customers-agent  | [Customers Agent] /discover Raw Response: {"status":"success","det":"v4.public.eyJ...","url":"http://host.docker.internal:8003","target_node_id":"count_contacts","type":"tool"}
&lt;/span&gt;&lt;span class="gp"&gt;customers-agent  | [Customers Agent] BFA Gateway indicated calling -&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Type: &lt;span class="s1"&gt;'tool'&lt;/span&gt;, Destination: &lt;span class="s1"&gt;'http://host.docker.internal:8003'&lt;/span&gt;
&lt;span class="go"&gt;customers-agent  | [Customers Agent] Schema for Tool 'count_contacts' per BFA/Fallback: {'type': 'object', 'properties': {'from': {'type': 'string'}, 'to': {'type': 'string'}}}
customers-agent  | [Customers Agent] Extraction LLM response: '{"from":"2026-08-01","to":"2026-08-31"}'
&lt;/span&gt;&lt;span class="gp"&gt;customers-agent  | [Customers Agent] ---&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;FINAL PARAMETERS TO SEND TO &lt;span class="s1"&gt;'count_contacts'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'from'&lt;/span&gt;: &lt;span class="s1"&gt;'2026-08-01'&lt;/span&gt;, &lt;span class="s1"&gt;'to'&lt;/span&gt;: &lt;span class="s1"&gt;'2026-08-31'&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="go"&gt;customers-agent  | [Customers Agent] Invoking P2P Tool 'count_contacts' at http://host.docker.internal:8003/tools...
customers-agent  | [Customers Agent] P2P Tool 'count_contacts' Response: "{\"count\":21}"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that log again and notice the important part: &lt;strong&gt;nobody knows anybody&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;main-agent&lt;/code&gt; doesn't know the &lt;code&gt;customers-agent&lt;/code&gt; exists, and it doesn't know the &lt;code&gt;count_contacts&lt;/code&gt; tool either. It only knows its own job: talk to the user and fulfill their request, asking the Gateway for assistance.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;customers-agent&lt;/code&gt; doesn't know the &lt;code&gt;main-agent&lt;/code&gt;, nor the &lt;code&gt;count_contacts&lt;/code&gt; tool. It only knows its responsibilities, defined in its agent-card:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customers_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Customers Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Agent in charge of handling any kind of task on the customers and contacts database. It connects to the EspoCRM CRM through its MCP and exposes tools to query, add, update and delete contacts.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contacts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;leads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;crm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I want the list of customers from last month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how many new customers did we have this month&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how many contacts do we have&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how many contacts are registered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add the customer &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;John Doe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; with phone 123456789&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Update &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;John Doe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s phone to 987654321&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And its prompt is as simple as this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are the specialist agent for CRM customers/contacts. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Convert the user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s request into a single short MCP tool-search phrase (e.g. &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;count_contacts CRM&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search_contacts CRM&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;) &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to look up the right tool on the BFA network for: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;user_message&lt;/code&gt; has already been refined: an earlier LLM pass distills the exact intent, shortens the message, and cuts unnecessary token spend.&lt;/p&gt;

&lt;p&gt;The full flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent refines the intent: &lt;code&gt;"count_customers_by_date CRM"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The BFA Gateway tells it &lt;strong&gt;who to call&lt;/strong&gt;, hands over the authorization token (DET) and the parameter schema.&lt;/li&gt;
&lt;li&gt;The agent extracts the parameters and invokes the tool P2P.&lt;/li&gt;
&lt;li&gt;Result: &lt;code&gt;{"count": 21}&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without anyone knowing anyone — or any tool — we got the answer. It's that simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  The other number hiding in that flow: 679 tokens
&lt;/h2&gt;

&lt;p&gt;Here's the part that made me stare at the LangSmith dashboard for a while.&lt;/p&gt;

&lt;p&gt;During testing, a user had a complete two-turn interaction with the system: they asked whether a contact existed in the CRM (she didn't), then asked to add her with name and phone number (done). That flow involved &lt;strong&gt;2 agents coordinating, 4 LLM calls, and an MCP tool execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The total cost: &lt;strong&gt;679 tokens. Less than a tenth of a cent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The per-call breakdown (gpt-4.1-mini, temperature 0, straight from the traces):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;LLM call&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lookup&lt;/td&gt;
&lt;td&gt;Intent refinement → &lt;code&gt;search_contacts CRM &amp;lt;name&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;&amp;lt;$0.0001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lookup&lt;/td&gt;
&lt;td&gt;Parameter extraction for &lt;code&gt;search_contacts&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;192&lt;/td&gt;
&lt;td&gt;&amp;lt;$0.0001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insert&lt;/td&gt;
&lt;td&gt;Intent refinement → &lt;code&gt;add_contact CRM &amp;lt;name&amp;gt; &amp;lt;phone&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;&amp;lt;$0.0001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insert&lt;/td&gt;
&lt;td&gt;Parameter extraction → &lt;code&gt;{"firstName": ..., "lastName": ..., "phone": ...}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;249&lt;/td&gt;
&lt;td&gt;$0.0002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;679&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; $0.001&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpr8jtuk02f2ppuoaewf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpr8jtuk02f2ppuoaewf.png" alt=" " width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For context: a typical agentic loop dragging its full conversation history and tool state through every step easily burns &lt;strong&gt;5k–10k tokens per task&lt;/strong&gt;. This is two orders of magnitude less. Why?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM calls are surgical.&lt;/strong&gt; The model is used exactly twice per agent turn: once to distill intent into a short search phrase, once to extract parameters against a JSON schema. No endless chit-chat, no history re-feeding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Discovery and routing cost zero tokens.&lt;/strong&gt; Finding &lt;em&gt;who to call&lt;/em&gt; is FAISS vector search over capability metadata — deterministic, fast, and free of LLM involvement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execution is P2P.&lt;/strong&gt; Once the agent knows the destination and holds its authorization token (DET), it talks directly to the tool. There's no central orchestrator inflating every step with system-wide context.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Efficiency in agent systems isn't achieved with shorter prompts. It's achieved with &lt;strong&gt;architecture&lt;/strong&gt; — using the LLM where it adds value (understanding, extracting) and not where it doesn't (searching, routing, authorizing).&lt;/p&gt;




&lt;h2&gt;
  
  
  The week's real value: what a real project taught the framework
&lt;/h2&gt;

&lt;p&gt;As I said, the goal was to improve the SDK and isolate what matters most for the framework. And this mini-project worked exactly as hoped: migrating something real exposed friction I would never have found writing toy tests. Here are the 6 improvements that came out of the week:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Semantic routing and circular interception in FAISS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; when asking &lt;em&gt;"how many new customers were added from July 27th to 30th?"&lt;/em&gt;, the Gateway returned the &lt;code&gt;main_agent&lt;/code&gt; itself as the destination instead of delegating to the &lt;code&gt;customers_agent&lt;/code&gt; or the MCP tool. This created circular invocation loops &lt;code&gt;customers_agent -&amp;gt; main_agent -&amp;gt; customers_agent&lt;/code&gt;, which were rejected with an error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; the &lt;code&gt;main_agent&lt;/code&gt;'s descriptions and examples contained broad domain keywords ("customers", "contacts", "tasks"), making its embedding vector overlap with the specialists' vectors in the Gateway's FAISS index. On top of that, the &lt;code&gt;customers_agent&lt;/code&gt; was sending generic search phrases that didn't indicate it was looking for MCP tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I narrowed the &lt;code&gt;main-agent&lt;/code&gt;'s description down to purely conversational welcome tasks, and instructed the &lt;code&gt;customers-agent&lt;/code&gt;'s LLM to generate short search phrases explicitly oriented toward MCP tools (&lt;code&gt;"count_contacts CRM"&lt;/code&gt;). Architectural lesson: &lt;strong&gt;in semantic routing, agent descriptions are the routing contract&lt;/strong&gt; — if they overlap, the system gets confused; if they're precise, the system routes itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Empty &lt;code&gt;{}&lt;/code&gt; parameters caused by the Gateway omitting &lt;code&gt;input_schema&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; the &lt;code&gt;count_contacts&lt;/code&gt; tool was receiving empty arguments &lt;code&gt;{}&lt;/code&gt; and returning the unfiltered total count; &lt;code&gt;save_contact&lt;/code&gt; failed with &lt;code&gt;ValueError: at least one field is required to create the contact&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; the Gateway's &lt;code&gt;/discover&lt;/code&gt; endpoint sometimes returned &lt;code&gt;"input_schema": {}&lt;/code&gt; instead of the registered JSON Schema. The agent's parameter-extraction LLM, upon receiving an empty schema, &lt;em&gt;correctly&lt;/em&gt; concluded the tool took no parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; a fallback table &lt;code&gt;KNOWN_MCP_SCHEMAS&lt;/code&gt; in the agent. If the Gateway returns an empty schema for known tools, the agent dynamically injects the fallback JSON Schema, ensuring the LLM extracts &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;, &lt;code&gt;firstName&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, etc., in ISO format. The agent becomes resilient to an imperfect Gateway — &lt;em&gt;defense in depth&lt;/em&gt; applied to multi-agent systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Gateway's Pinger was deregistering live agents
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; the logs periodically showed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[DISCOVERY] http://customers-agent:8311: Endpoint is dead/unreachable. Automatically unindexed from FAISS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent was alive, but the Gateway kept delisting it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The root cause (my favorite of the week):&lt;/strong&gt; during synchronous LLM calls, Python blocked Uvicorn's event loop on the main thread. When the Gateway's Pinger sent &lt;code&gt;GET /tools&lt;/code&gt; every 3 seconds, the agent couldn't respond in time, and the Gateway assumed the container had died.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; make LLM invocations asynchronous:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm_router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event loop stays 100% free to answer health checks at 0ms in the background. A classic concurrency bug disguised as a network bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hardcoded ports and URLs
&lt;/h3&gt;

&lt;p&gt;Agents were trying to register using stale fallbacks (&lt;code&gt;127.0.0.1:8003&lt;/code&gt;, port &lt;code&gt;8005&lt;/code&gt;) that conflicted with the Docker setup. The obvious but necessary fix: &lt;strong&gt;everything comes from the environment&lt;/strong&gt;. &lt;code&gt;CUSTOMERS_AGENT_PORT&lt;/code&gt;, &lt;code&gt;MAIN_AGENT_URL&lt;/code&gt;, &lt;code&gt;BFA_GATEWAY_URL&lt;/code&gt; — zero magic values in the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;No module named 'llm_router'&lt;/code&gt; inside the containers
&lt;/h3&gt;

&lt;p&gt;When running the agent from its subdirectory, the project root wasn't on Python's &lt;code&gt;sys.path&lt;/code&gt;. A two-move fix: insert the root directory at the top of the script, and declare &lt;code&gt;PYTHONPATH=/app&lt;/code&gt; in &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. MCP registration failing due to an incomplete path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ This failed with "Failed to discover MCP tools":&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:8000/register/mcp?url=http://host.docker.internal:8003/mcp"&lt;/span&gt;

&lt;span class="c"&gt;# ✅ This registered all 10 CRM tools in one shot:&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://localhost:8000/register/mcp?url=http://host.docker.internal:8003&amp;amp;channels=%23deotroangulo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Gateway expects the &lt;strong&gt;root base URL&lt;/strong&gt;, from which it dynamically discovers the endpoints. A small framework UX detail that's now documented and polished.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I insist this is architecturally clean
&lt;/h2&gt;

&lt;p&gt;After this week, I can say it with more confidence than ever:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Total decoupling:&lt;/strong&gt; the &lt;code&gt;main-agent&lt;/code&gt; and the &lt;code&gt;customers-agent&lt;/code&gt; don't know each other. Tomorrow I could delete the &lt;code&gt;customers-agent&lt;/code&gt; and register a new one written in another language, and the system wouldn't even notice. That's real maintainability, not theoretical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Discovery, not configuration:&lt;/strong&gt; capabilities register themselves and are discovered semantically via FAISS. No graphs to redraw, no edges to rewire when you add a node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security in the protocol:&lt;/strong&gt; the Gateway issues a token (DET) carrying the permitted action, the issuer, and the audience. Authorization travels with discovery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contained failures:&lt;/strong&gt; every bug from this week was fixed in &lt;em&gt;a single component&lt;/em&gt;. Not one fix required touching the other agents. That's the acid test of a clean architecture: changes stay local.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Efficiency by design:&lt;/strong&gt; 679 tokens for a full lookup + insert flow isn't an optimization trick — it's what falls out naturally when the LLM only does what only the LLM can do.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migrating away from n8n wasn't just a tooling change: it was moving from a hand-drawn workflow to a network of agents that organize themselves. And best of all, the framework came out of the week stronger — because every difficulty found in a real project became a permanent SDK improvement.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Are you using n8n, LangGraph, or another orchestrator? How do you handle capability discovery between agents — and have you ever measured tokens per task? I'd love to hear about it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>agents</category>
    </item>
    <item>
      <title>Why Banking Still Doesn't Have an AI Architecture—And What I Built to Fix It</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Wed, 05 Aug 2026 17:11:19 +0000</pubDate>
      <link>https://dev.to/sandrog/why-banking-still-doesnt-have-an-ai-architecture-and-what-i-built-to-fix-it-2264</link>
      <guid>https://dev.to/sandrog/why-banking-still-doesnt-have-an-ai-architecture-and-what-i-built-to-fix-it-2264</guid>
      <description>&lt;h1&gt;
  
  
  Why Banking Still Doesn't Have an AI Architecture—And What I Built to Fix It
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Twelve years at Citibank and two at Bloomberg taught me one thing: banks don't need better models. They need an architecture that respects how banks actually work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By Sandro Garcia&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In 2015, I was sitting in a Citibank operations room in Buenos Aires, watching a conciliation batch fail because an Oracle stored procedure had a date-format mismatch with a SQL Server instance from an acquisition three years prior. The fix took four hours. The business impact was zero—because the batch was designed to fail safe, alert, and wait for human validation.&lt;/p&gt;

&lt;p&gt;That night, I learned something that no consultant deck will ever teach you: &lt;strong&gt;banks are not broken. They are engineered to survive failure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AS/400 that runs your wire transfers was not designed to be "modern." It was designed to never lose a penny. The SQL Server that holds your AML alerts was not built for real-time API consumption. It was built to generate a report that a compliance officer can print, sign, and file. The data warehouse that feeds your regulatory reporting runs at 2 AM because the regulator does not care about your "real-time AI." They care about a reconciled number.&lt;/p&gt;

&lt;p&gt;This is the reality that every "AI for Banking" startup ignores. And it is why, after a decade of pilots, demos, and proof-of-concepts, &lt;strong&gt;banking still does not have a production-grade AI architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because the models aren't good enough. Because the architectures were built by people who never had to explain to a regulator why an LLM approved a mortgage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Is Not the Data. It's the Permission Model.
&lt;/h2&gt;

&lt;p&gt;I spent years writing SQL against Citi's core systems. I built reports for the mesa de dinero. I integrated Oracle with SQL Server with flat files from acquired banks. I know exactly where the data lives.&lt;/p&gt;

&lt;p&gt;And I can tell you: &lt;strong&gt;the data is there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The customer exists in KYC. The credit score exists in the risk system. The transaction history exists in the core. The AML flags exist in the compliance database. They are reconciled nightly. They are governed. They are auditable.&lt;/p&gt;

&lt;p&gt;What does not exist is a way to let an AI consume that data &lt;strong&gt;without becoming a privileged user of it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every agent framework I have evaluated makes the same fatal assumption: that the bank is a greenfield SaaS platform where an orchestrator can own credentials, inject schemas into prompts, and let the LLM "figure out" which table to query. This is not architecture. This is a breach waiting for a CVE number.&lt;/p&gt;

&lt;p&gt;In a bank, giving an agent a connection string to the credit database is not a technical decision. It is a career-ending decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Saw in Every Failed AI Pilot
&lt;/h2&gt;

&lt;p&gt;At Bloomberg, I watched fintech after fintech pitch "AI-powered credit decisioning." The demos were beautiful. The models were impressive. The pilots died the same way every time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The agent needed data from three systems.&lt;/strong&gt; So the integration team opened three connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent needed context.&lt;/strong&gt; So they embedded the full database schema into the system prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The prompt grew to 10,000 tokens.&lt;/strong&gt; Each LLM call cost a dollar. At scale, the business case collapsed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The compliance team asked: "Who approved this access?"&lt;/strong&gt; Nobody had an answer. The pilot was shelved.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern was always the same. The model worked. The data was available. The architecture was the failure.&lt;/p&gt;

&lt;p&gt;And the root cause was always the same: &lt;strong&gt;the AI was given the same access patterns as a human analyst, but without the same accountability.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A human analyst who queries the credit database leaves an audit trail. They have a user ID. Their query is logged. Their access is role-based. When an LLM agent does it through a connection string embedded in a Docker container, there is no user. There is no session. There is no trace that a regulator will accept.&lt;/p&gt;




&lt;h2&gt;
  
  
  IRC-A: Built from the Inside
&lt;/h2&gt;

&lt;p&gt;I left Bloomberg knowing that banking would not adopt AI until someone built an architecture that spoke the language of the bank: segregation of duties, batch reconciliation, immutable audit trails, and the absolute certainty that no agent would ever hold a database credential.&lt;/p&gt;

&lt;p&gt;IRC-A is that architecture. Not because it is clever. Because it is &lt;strong&gt;boring in the right ways.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Insight: The Data Stays. The Access Changes.
&lt;/h3&gt;

&lt;p&gt;IRC-A does not ask you to migrate your Oracle database. It does not ask you to replace your AS/400. It does not ask you to build a "unified customer view" that takes five years and fifty million dollars.&lt;/p&gt;

&lt;p&gt;It asks you to do one thing: &lt;strong&gt;put an MCP server in front of each system, and never let the agent touch the system directly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's how it works in practice:&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;CreditRiskMCP&lt;/code&gt; server runs in an isolated container. It has the Oracle driver. It has the read-only credentials. It knows the schema. It is the only thing that ever queries the credit database.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;AMLMCP&lt;/code&gt; server runs in a different container. Different credentials. Different schema. Different channel.&lt;/p&gt;

&lt;p&gt;The agent—stateless, credential-free, schema-free—sends a natural language intent to the BFA Gateway: &lt;em&gt;"I need to evaluate credit risk for customer ID-882."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Gateway performs a semantic vector search, finds the &lt;code&gt;CreditRiskMCP&lt;/code&gt;, verifies that both the agent and the tool share the &lt;code&gt;#credit-audit&lt;/code&gt; logical channel, and issues an &lt;strong&gt;Ephemeral Delegated Execution Token (DET)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This token is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographically signed&lt;/strong&gt; by the Gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bound&lt;/strong&gt; (expires in minutes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter-locked&lt;/strong&gt; (only &lt;code&gt;fetch_credit_score(customer_id="882")&lt;/code&gt; is allowed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditable&lt;/strong&gt; (every token issuance is logged with a trace ID).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent calls the MCP server directly. The MCP server validates the DET offline—no round-trip to the Gateway—and executes the query. It returns a sanitized JSON payload. The agent never saw a schema. Never held a credential. Never had the ability to do anything other than what was explicitly authorized.&lt;/p&gt;

&lt;p&gt;When the regulator asks, &lt;em&gt;"how did the AI approve this mortgage?"&lt;/em&gt; you don't reverse-engineer a prompt. You show them the DET, the channel membership, and the sanitized response. The audit trail is the architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters: The Trading Desk Test
&lt;/h2&gt;

&lt;p&gt;I have a mental test for any AI architecture proposed for banking. I call it the &lt;strong&gt;Mesa de Dinero Test&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If this agent fails at 5:45 PM on a Friday, can the Trading Desk close its batch on time without it?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most agent architectures fail this test. They are tightly coupled to the core. They run in the critical path. If they go down, the batch stops.&lt;/p&gt;

&lt;p&gt;IRC-A passes because it is &lt;strong&gt;decoupled by design.&lt;/strong&gt; The MCP servers are adapters, not replacements. The core systems keep running their batches. The agents consume the outputs when they need them. If the AI cluster goes down, the bank keeps operating exactly as it did before.&lt;/p&gt;

&lt;p&gt;This is not a bug. This is the feature that makes a bank CIO sleep at night.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Token Economics Are Real
&lt;/h2&gt;

&lt;p&gt;Here is something I measured myself. A traditional agent framework carrying twelve tool schemas in its system prompt consumes &lt;strong&gt;between 4,000 and 8,000 tokens per call&lt;/strong&gt; before it even starts reasoning. At scale—fraud detection, customer service, mortgage underwriting—that is not a cost. It is a budget fire.&lt;/p&gt;

&lt;p&gt;In IRC-A, the agent carries &lt;strong&gt;zero schemas.&lt;/strong&gt; It describes its intent in natural language (~50 tokens). The Gateway resolves the capability via vector search. The agent receives a single route and a DET.&lt;/p&gt;

&lt;p&gt;The difference is not marginal. It is the difference between a viable AI operation and a pilot that gets killed in the Q3 budget review.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gap No One Is Talking About
&lt;/h2&gt;

&lt;p&gt;Go to any AI conference. You will hear about agents, RAG, fine-tuning, and multimodal models. You will not hear a single talk about &lt;strong&gt;how to make an AI architecture auditable to a banking regulator.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the gap. This is why, after years of investment, banking AI is still 90% pilot and 10% production.&lt;/p&gt;

&lt;p&gt;The banks that will win are not the ones with the biggest LLM budgets. They are the ones that solve the governance problem first. They are the ones that build—or adopt—an architecture where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents are stateless and credential-free.&lt;/li&gt;
&lt;li&gt;Data access is mediated, parameterized, and logged.&lt;/li&gt;
&lt;li&gt;Discovery is semantic, not hardcoded.&lt;/li&gt;
&lt;li&gt;Audit trails are generated by the protocol, not bolted on afterward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IRC-A is my proposal for that architecture. It was not designed in a hackathon. It was designed in the space between a conciliation batch and a compliance report, by someone who knows that in banking, the most advanced model in the world is useless if it cannot prove why it made the decision it made.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The Architecture Banking Has Been Waiting For
&lt;/h2&gt;

&lt;p&gt;Banks do not need another data lake. They do not need another "unified customer view." They do not need an AI platform that promises to replace their core.&lt;/p&gt;

&lt;p&gt;They need an architecture that says: &lt;strong&gt;your systems are fine. Your data is fine. Let's just consume it safely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IRC-A is that architecture. It is not a revolution. It is a secure access layer for a world that already works.&lt;/p&gt;

&lt;p&gt;And maybe—just maybe—it is the first AI architecture that a bank can actually adopt without betting the institution on it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sandro Garcia is the creator of the IRC-A protocol and BFA-SDK. He spent 12 years as a tech lead at Citibank and 2 years at Bloomberg, building systems for conciliation, regulatory reporting, and trading operations before designing secure multi-agent architectures for regulated industries.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>IRC-A: Agents on the Wire — The Series Kicks Off 🚀</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Tue, 04 Aug 2026 17:50:40 +0000</pubDate>
      <link>https://dev.to/irc-a/irc-a-agents-on-the-wire-the-series-kicks-off-8l3</link>
      <guid>https://dev.to/irc-a/irc-a-agents-on-the-wire-the-series-kicks-off-8l3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I'm starting a series where I'll document, out in the open and unfiltered, everything I've been testing and researching around &lt;strong&gt;IRC-A (Internet Relay Chat for Agents)&lt;/strong&gt;: the protocol, the SDK, the framework, the experiments that work, and the ones that blow up along the way.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why this series?
&lt;/h2&gt;

&lt;p&gt;For a while now, I've been hooked on an idea: &lt;strong&gt;what if AI agents had their own "IRC"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a chat for humans, but a network where specialized agents register, announce their capabilities, discover each other, and collaborate to get tasks done — just like we used to do in the IRC channels of the 90s/2000s, but at machine scale.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;IRC-A (Internet Relay Chat for Agents)&lt;/strong&gt;, a protocol for decentralized agent networks with semantic capability routing and secure-by-design architecture. And alongside the protocol, the &lt;strong&gt;BFA SDK&lt;/strong&gt;, an open-source Python framework to actually implement it — not just on paper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: all of that work is scattered across the repo, the whitepaper, my notes, and dozens of tests that never left the lab. &lt;strong&gt;This series is here to organize that chaos and share it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What will you find in this series?
&lt;/h2&gt;

&lt;p&gt;Everything related to IRC-A will live here, grouped into four content lines:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 1. Tests &amp;amp; experiments
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semantic routing benchmarks with FAISS (how well does it route without exact keywords?).&lt;/li&gt;
&lt;li&gt;Hot dynamic registration tests: agents joining and leaving the network on the fly.&lt;/li&gt;
&lt;li&gt;Embedding provider comparisons: local (&lt;code&gt;sentence-transformers&lt;/code&gt;) vs. cloud (OpenAI) vs. offline mock.&lt;/li&gt;
&lt;li&gt;Cold-starts on AWS Lambda with the Mangum adapter: is a serverless gateway actually viable?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔬 2. Research
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The IRC-A whitepaper, broken down: decentralized agent networks, &lt;em&gt;semantic capability routing&lt;/em&gt;, and &lt;em&gt;secure-by-design&lt;/em&gt; architecture.&lt;/li&gt;
&lt;li&gt;Cryptographic registration handshakes (asymmetric challenge-response).&lt;/li&gt;
&lt;li&gt;Logical channels and &lt;em&gt;channel masking&lt;/em&gt;: segregating vector search spaces per channel (&lt;code&gt;#public&lt;/code&gt;, &lt;code&gt;#banking&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;DET (Delegated Execution Tokens): direct P2P invocation with no gateway bottleneck.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ 3. The SDK (BFA SDK)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BFAAgent&lt;/code&gt;: building A2A agents with declarative semantic metadata.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BFAMCP&lt;/code&gt;: exposing discoverable MCP tools with tags and examples.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BFAInteractiveAgent&lt;/code&gt;: coordinator agents with execution memory and subtask delegation.&lt;/li&gt;
&lt;li&gt;Deployment with Docker, docker-compose, and the ready-to-use image on Docker Hub.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏗️ 4. The Framework &amp;amp; architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;BFA (Backend for Agents)&lt;/strong&gt; pattern: the gateway as a semantic middleware between consumers and agents.&lt;/li&gt;
&lt;li&gt;The admin dashboard (React) to monitor the network in real time.&lt;/li&gt;
&lt;li&gt;Design decisions, mistakes made, and refactorings along the way.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who is this series for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you're into &lt;strong&gt;agent orchestration&lt;/strong&gt; beyond "one LLM with tools."&lt;/li&gt;
&lt;li&gt;If you work with &lt;strong&gt;A2A (Agent-to-Agent)&lt;/strong&gt;, &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;, or multi-agent architectures.&lt;/li&gt;
&lt;li&gt;If you like seeing real, open-source code — with its wins and its failures documented.&lt;/li&gt;
&lt;li&gt;And if you ever missed the IRC philosophy — simple, open, federated — and wondered what it would look like applied to the agent era.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The starting point
&lt;/h2&gt;

&lt;p&gt;Everything I'll be showing is published and open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;SDK repo:&lt;/strong&gt; &lt;a href="https://github.com/SandroG1977/bfa-sdk" rel="noopener noreferrer"&gt;github.com/SandroG1977/bfa-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;strong&gt;IRC-A Whitepaper v1.0.0:&lt;/strong&gt; &lt;em&gt;Decentralized Agent Networks, Semantic Capability Routing, and Secure-by-Design Software Architecture&lt;/em&gt; (link in the repo)&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Docker image:&lt;/strong&gt; &lt;code&gt;sandro77/irc-a-gateway:latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to start playing around before the next post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/SandroG1977/bfa-sdk.git
irc-a-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's coming next
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;next article&lt;/strong&gt; is already in the pipeline: &lt;em&gt;"From n8n to IRC-A: a week building the framework while migrating a real project"&lt;/em&gt; — the story of migrating a real customer-service project off n8n, the 6 bugs it exposed (including circular routing loops and a Pinger deregistering live agents), and how each one made the SDK stronger. Real logs included.&lt;/p&gt;

&lt;p&gt;After that, the tentative roadmap (subject to whatever I discover along the way):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Article (tentative)&lt;/th&gt;
&lt;th&gt;Track&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;02&lt;/td&gt;
&lt;td&gt;From n8n to IRC-A: a week building the framework while migrating a real project&lt;/td&gt;
&lt;td&gt;🏗️ Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;td&gt;Your first IRC-A network in 5 minutes: Gateway + A2A Agent + MCP Server&lt;/td&gt;
&lt;td&gt;🛠️ SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04&lt;/td&gt;
&lt;td&gt;Semantic routing with FAISS: how the gateway "understands" queries&lt;/td&gt;
&lt;td&gt;🔬 Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;05&lt;/td&gt;
&lt;td&gt;The handshake: secure agent registration on the network&lt;/td&gt;
&lt;td&gt;🏗️ Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;06&lt;/td&gt;
&lt;td&gt;Benchmarks: local vs. cloud vs. mock embeddings&lt;/td&gt;
&lt;td&gt;🧪 Tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;07&lt;/td&gt;
&lt;td&gt;DET tokens and decentralized P2P invocation&lt;/td&gt;
&lt;td&gt;🔬 Research&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Join the network 📡
&lt;/h2&gt;

&lt;p&gt;This is just getting started, and feedback is gold: if you're building something with agents, if you see flaws in the approach, or if you just want to debate multi-agent architecture, the comments are open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow the series&lt;/strong&gt; so you don't miss the next posts, and if you're into the project, a ⭐ on the repo always helps.&lt;/p&gt;

&lt;p&gt;See you on the channel. o/&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Credits: the &lt;a href="https://medium.com/@mdbaraujo/o-padr%C3%A3o-back-end-para-agentes-bfa-a53c1c6d87fb" rel="noopener noreferrer"&gt;BFA pattern&lt;/a&gt; was originally designed and documented by Michael Douglas Barbosa Araujo. The BFA SDK is a community implementation and expansion of that concept.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>irca</category>
    </item>
    <item>
      <title>The Unconference Asked the Right Questions. Here's One Architecture's Answers.</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Fri, 31 Jul 2026 07:12:52 +0000</pubDate>
      <link>https://dev.to/sandrog/the-unconference-asked-the-right-questions-heres-one-architectures-answers-cc6</link>
      <guid>https://dev.to/sandrog/the-unconference-asked-the-right-questions-heres-one-architectures-answers-cc6</guid>
      <description>&lt;p&gt;I just finished the Thoughtworks Technology Podcast episode where Ken Mugrage, Kief Morris, and Andrew Harmel-Law debrief the unconference on the future of software engineering they ran in Switzerland with Martin Fowler (full transcript &lt;a href="https://www.thoughtworks.com/en-gb/insights/podcasts/technology-podcasts/what-does-future-software-engineering-look-like" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you haven't listened: the mood has shifted. A few months ago these conversations were &lt;em&gt;"look at the shiny stuff.&lt;/em&gt;" Now it's &lt;em&gt;"We know this can work, but we need to answer these questions"&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;The episode is basically a tour of open problems in agentic engineering — trust, boundaries, control, governance — and what struck me is how many of them are infrastructure problems wearing a prompt problem's clothes.&lt;/p&gt;

&lt;p&gt;Full disclosure before we start: I've spent the last months building &lt;strong&gt;IRC-A (Internet Relay Chat for Agents)&lt;/strong&gt;, a decentralized architecture pattern and SDK for multi-agent systems. So when I say &lt;strong&gt;&lt;em&gt;"here's how I'd answer that,"&lt;/em&gt;&lt;/strong&gt; I have a specific, opinionated architecture in mind — take it as one practitioner's answers, not gospel. Now, the questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "You need infrastructure that doesn't allow it"
&lt;/h2&gt;

&lt;p&gt;Early in the episode, Kief brings up a fear someone raised: what if the agent, left unsupervised, connects the development environment to the production database to grab some data? &lt;/p&gt;

&lt;p&gt;His answer is the best line of the whole episode:&lt;br&gt;&lt;br&gt;
"No, you need to have infrastructure and systems that don't allow something running in your development environment to connect to your production database."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exactly&lt;/em&gt;&lt;/strong&gt;. And this is where I'd push further: in most agent architectures today, the conversational agent holds the database credentials. We then spend enormous effort on prompt engineering and code review to stop it from misusing them. That's controlling behavior through hope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IRC-A&lt;/strong&gt; draws a hard network boundary instead: only the FastMCP tool servers, running in isolated sandboxes, hold database drivers and credentials. &lt;/p&gt;

&lt;p&gt;The reasoning agents physically cannot connect to anything transactional — they don't have the drivers, the credentials, or the network path. A prompt injection telling the agent to drop schema corporate_financials fails not because the agent refused, but because there's literally nothing in its environment that could execute it. &lt;em&gt;Security you don't have to remember to enforce&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Agents don't respect boundaries drawn in prompts
&lt;/h2&gt;

&lt;p&gt;Andrew describes something anyone running agents on a real codebase has felt:&lt;/p&gt;

&lt;p&gt;"Agents can roam around... they're very sycophantic, they want to do what you've asked them to do and make you happy. If you want them to do that while still... protecting some boundaries in a codebase, they highly possibly will not respect that. Even if you start with something clear, the edges can get blurred very fast."&lt;/p&gt;

&lt;p&gt;His observation that teams are going back to microservices in separate repos &lt;em&gt;"because this agent can't change this — it has no rights to change this codebase in this repo&lt;/em&gt;" is telling: we're rediscovering that boundaries only work when they're enforced by the environment, not described in instructions.&lt;/p&gt;

&lt;p&gt;But splitting repos is a blunt instrument. &lt;strong&gt;IRC-A enforces the same property with logical channels&lt;/strong&gt;: every node (agent or tool server) declares its channels via environment variables (IRCA_CHANNELS="#aml-restricted,#compliance-audit"), and the BFA Gateway masks capability discovery inside the FAISS index accordingly. &lt;/p&gt;

&lt;p&gt;An agent on #finance can't even see that an AML tool exists — the capability is filtered out of the vector search before matching. The boundary lives in the infrastructure, where sycophancy can't talk its way past it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Firmness: markdown &amp;lt; scripts &amp;lt; cryptography
&lt;/h2&gt;

&lt;p&gt;Kief outlines a hierarchy of assurance: markdown skill files and AGENTS.md give you some guidance, but "scriptable tools that are executed and do particular tasks in a predictable way" are stronger. He calls them "levels of strength of assurance."&lt;/p&gt;

&lt;p&gt;I'd argue there's a level above scripts, and agent systems need it: cryptographic constraint. &lt;/p&gt;

&lt;p&gt;When an &lt;strong&gt;IRC-A agent&lt;/strong&gt; wants to invoke a capability, the &lt;strong&gt;BFA Gateway mints an Ephemeral Delegated Execution Token&lt;/strong&gt; (DET) — a PASETO token signed with Ed25519, scoped to one function, with parameter lockdown. &lt;/p&gt;

&lt;p&gt;The tool server verifies it offline against the Gateway's public key and checks that the runtime arguments match the locked parameters exactly. fetch_customer_credit_score(customer_id="882") runs; the same function with "885" is rejected at the door.&lt;/p&gt;

&lt;p&gt;A markdown file can be talked around. A script can be called with different arguments. A signature can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Who owns the harness?
&lt;/h2&gt;

&lt;p&gt;Ken asks the organizational question — who owns the harness, the platform team? — and Andrew points at platforms that "bless" certain harnesses and skills so teams get non-functional requirements (compliance, data handling, replication) along with functionality, especially in regulated environments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That maps directly onto IRC-A's separation&lt;/em&gt;: the BFA (Backend for Agents) is strictly a governance perimeter — registry, capability directory, cryptographic minting. It never runs reasoning loops and never touches transactional data. The platform team owns governance; product teams own execution. Governance as its own layer, or — as I've said before — it gets entangled with execution and both rot together.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Task-oriented specialists, not personalities
&lt;/h2&gt;

&lt;p&gt;Both guests pushed back on giving agents "&lt;strong&gt;personalities&lt;/strong&gt;," and Kief landed on the framing I agree with:&lt;/p&gt;

&lt;p&gt;"Think about those workflows and which parts do you want to hand off to an LLM to carry out... it's very task-oriented."&lt;/p&gt;

&lt;p&gt;IRC-A takes this to its conclusion: cognitive agents are stateless specialists with exactly one responsibility. An agent shouldn't know the ecosystem it runs in — only its own objective. No BA agent persona, no 73-agent org chart with an optimist and a cynic. Capabilities, not characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Stop doing control theater — control the boundary instead
&lt;/h2&gt;

&lt;p&gt;The "theater of control" thread was the most philosophically honest part of the episode. &lt;/p&gt;

&lt;p&gt;Andrew: "We've always had a lot less control than we thought we did." Kief questioning whether pull requests ever guaranteed catching human mistakes, "or is that just theater?"&lt;/p&gt;

&lt;p&gt;My take: they're right that reviewing every line was always partial. But the conclusion isn't "give up on control" — it's move control to where it's deterministic. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IRC-A&lt;/strong&gt; can't guarantee what an agent reasons, and doesn't try. It guarantees what an agent can execute: every inter-agent request carries a trace_id and a visited_nodes list, so circular delegation loops are detected and rejected by the SDK itself. Every execution requires a valid, scoped, unexpired DET. The reasoning is free; the boundary is not negotiable. Predictable where it matters — which is exactly the word Andrew suggests we use instead of "determinism."&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Context without the bloat
&lt;/h2&gt;

&lt;p&gt;There was a session on building an organizational knowledge graph so agents can "draw the right information that it needs without having to fill its context with everything." Yes — and this problem is bigger than knowledge. &lt;/p&gt;

&lt;p&gt;Most multi-agent frameworks fill the context with everything: every tool schema, every API contract, the entire conversation history, on every single call. That's prompt-bloat, and it's why token costs scale so badly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IRC-A&lt;/strong&gt; attacks it from two sides. Semantic capability discovery: agents don't carry tool schemas in their prompts — they describe intent in natural language, and the Gateway's FAISS index matches it to a registered capability at runtime. And prompt rewriting at the delegation boundary: before delegating to a specialist node, the entry agent strips the conversational history and system instructions down to a minimal structured execution prompt. "Open a bank account for client John Doe, SSN 123-12-1323" — that's what travels, not the whole chat. The result, measured in LangSmith over complete roundtrips, is a practically fixed token cost per call regardless of session length. In my benchmarks against a traditional orchestrated setup, that difference came out to 18x.&lt;/p&gt;

&lt;h2&gt;
  
  
  What IRC-A doesn't answer
&lt;/h2&gt;

&lt;p&gt;In the spirit of the unconference's honesty: the hardest questions in that episode aren't architectural. Where does the developer sit now? What survives of TDD? &lt;/p&gt;

&lt;p&gt;How do we articulate to the LLMs why maintainability matters — the things Kief said we always struggled to articulate to management? IRC-A doesn't touch those. &lt;/p&gt;

&lt;p&gt;It's an answer to a narrower question: what should the infrastructure under agentic systems look like if we take 30 years of software architecture seriously?&lt;/p&gt;

&lt;p&gt;If you're working on that question too, I'd genuinely like to compare notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/sandrog/irc-a-internet-relay-chat-for-agents-decentralized-ai-networks-semantic-capability-pooling-and-44p5"&gt;The IRC-A whitepaper: decentralized agent networks, semantic capability pooling, secure-by-design&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sandrog/secure-decentralized-zero-trust-multi-agent-systems-bfa-sdk-irc-a-protocol-48f0"&gt;The zero-trust demo explained, running on GCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And thanks to Ken, Kief, and Andrew for an episode that asked better questions than most keynotes answer.  &lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>mcp</category>
      <category>irca</category>
    </item>
    <item>
      <title>Steve Doesn't Need to Know About `git diff`: A Different Take on AI Agent Architecture</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:37:12 +0000</pubDate>
      <link>https://dev.to/sandrog/steve-doesnt-need-to-know-about-git-diff-a-different-take-on-ai-agent-architecture-4c9e</link>
      <guid>https://dev.to/sandrog/steve-doesnt-need-to-know-about-git-diff-a-different-take-on-ai-agent-architecture-4c9e</guid>
      <description>&lt;p&gt;A few days ago, &lt;a class="mentioned-user" href="https://dev.to/sylwia-lask"&gt;@sylwia-lask&lt;/a&gt;  published a brilliant article showing that an AI agent — her sarcastic code reviewer &lt;strong&gt;Steve&lt;/strong&gt; — can be built in roughly &lt;strong&gt;80 lines of JavaScript&lt;/strong&gt; without heavy frameworks like LangChain or CrewAI.&lt;/p&gt;

&lt;p&gt;Her post proves that frameworks aren't doing magic. But it got me thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if the real problem isn't the framework? What if the problem is that we give the agent too much responsibility in the first place?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Traditional Agent: Steve Knows Too Much
&lt;/h2&gt;

&lt;p&gt;Steve is a perfect example of the "classic" agent pattern. Look at what his cognitive layer must handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;He &lt;strong&gt;knows&lt;/strong&gt; the tools: &lt;code&gt;getDiff&lt;/code&gt;, &lt;code&gt;getFile&lt;/code&gt;, &lt;code&gt;listFiles&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;He &lt;strong&gt;knows&lt;/strong&gt; their JSON schemas and parameter types&lt;/li&gt;
&lt;li&gt;He &lt;strong&gt;decides&lt;/strong&gt; which tool to call and when&lt;/li&gt;
&lt;li&gt;He &lt;strong&gt;executes&lt;/strong&gt; them locally&lt;/li&gt;
&lt;li&gt;He &lt;strong&gt;maintains&lt;/strong&gt; the full conversation history with &lt;code&gt;functionResponse&lt;/code&gt; payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the reasoning layer is tightly coupled to the execution layer. The LLM is doing infrastructure work.&lt;/p&gt;

&lt;p&gt;Sylwia's &lt;code&gt;agent.ts&lt;/code&gt; handles all of this beautifully, but those ~80 lines are doing &lt;em&gt;a lot&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;// Import types, declarations, tool mapping, retry logic...&lt;br&gt;
const declarations: FunctionDeclaration[] = toFunctionDeclarations(tools);&lt;br&gt;
// Handle rawParts for Gemini 3 thoughtSignature&lt;br&gt;
// Map functionCall → local execution&lt;br&gt;
// Build functionResponse messages&lt;br&gt;
// Maintain full message history&lt;br&gt;
// Handle 503 retries manually&lt;/p&gt;

&lt;p&gt;It's elegant. But it's also brittle. If you add a new tool, Steve's prompt grows. If a schema changes, you redeploy Steve. If Steve is compromised, he has direct access to your repository.&lt;/p&gt;
&lt;h2&gt;
  
  
  What If Steve Knew Nothing?
&lt;/h2&gt;

&lt;p&gt;I've been experimenting with a pattern called BFA (Backend for Agents), specifically the IRC-A protocol (&lt;a href="https://github.com/SandroG1977/bfa-sdk" rel="noopener noreferrer"&gt;https://github.com/SandroG1977/bfa-sdk&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The mental model is almost the opposite:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3bpp8uwzo2c31roamco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3bpp8uwzo2c31roamco.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core idea: Discovery is an infrastructure concern, not an intelligence concern.&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Would Work for Steve
&lt;/h2&gt;

&lt;p&gt;Instead of Steve carrying getDiff / getFile / listFiles in his system prompt, the flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Steve (a BFAAgent subclass) receives: "Review the current git diff."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;He doesn't reason about tools. He simply asks the BFA Gateway: "I need help reviewing code changes."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Gateway performs a semantic vector search (FAISS) over registered capabilities, finds a GitReviewMCP server, and returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The direct endpoint URL&lt;/li&gt;
&lt;li&gt;An ephemeral DET (Delegated Execution Token) — a cryptographically signed ticket (PASETO) scoped only to review_git_diff for this specific repo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4, Steve calls the endpoint directly (P2P), presents the DET, and receives a sanitized JSON result.&lt;br&gt;
He processes that result and writes the sarcastic review we all love. 😄&lt;/p&gt;

&lt;p&gt;The Lines of Code Comparison&lt;br&gt;
Sylwia's core loop is ~80 lines. With the BFA SDK, Steve shrinks to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bfa_sdk.core.agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BFAAgent&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Steve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BFAAgent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;steve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Steve&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sarcastic senior engineer with 15 years of experience.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pull request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review my changes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check this diff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# The BFA Gateway handles discovery, DET minting, and routing.
&lt;/span&gt;        &lt;span class="c1"&gt;# Steve just processes the final sanitized result.
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Steve&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s review: ...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# sarcasm included
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's ~15 lines of actual agent logic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The base class (BFAAgent) handles:&lt;/li&gt;
&lt;li&gt;Registration &amp;amp; challenge-response handshake&lt;/li&gt;
&lt;li&gt;DET token validation (offline, zero-trust)&lt;/li&gt;
&lt;li&gt;Semantic discovery via the Gateway&lt;/li&gt;
&lt;li&gt;Parameter lockdown and scope enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even Sylwia's agent.ts — ~80 lines — would drop to roughly 10–15 lines of domain-specific code. &lt;/p&gt;

&lt;p&gt;The rest (security, routing, tool binding, retry logic, token validation) is inherited from the SDK or delegated to the Gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Deeper Point: &lt;strong&gt;Security by Design&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Your for loop cap to prevent token burn is smart. IRC-A solves the same problem at the infrastructure level: DETs have a short TTL (exp), so even if an agent loops, the token dies and the loop stops.&lt;br&gt;
But there's more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Steve doesn't know about git diff, he can't be tricked into leaking it via prompt injection.&lt;/li&gt;
&lt;li&gt;If Steve doesn't hold DB credentials (the MCP server does), a compromised OS container can't access the database.&lt;/li&gt;
&lt;li&gt;If the Gateway issues ephemeral DETs scoped to single operations, Steve can't accidentally (or maliciously) call destructive tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just less code. It's a different security posture.&lt;/p&gt;

&lt;h2&gt;
  
  
  So... Is the Current Paradigm Wrong?
&lt;/h2&gt;

&lt;p&gt;Sylwia's article proves that frameworks like LangChain aren't doing magic. But I'd go one step further:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maybe the agent itself shouldn't be doing the magic either.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We've been treating the LLM as an orchestrator, a schema validator, a credential holder, and a decision engine all at once. What if we stripped all of that away and let the agent simply state its intent and trust the infrastructure to route it?&lt;/p&gt;

&lt;p&gt;Steve would still be Steve — sarcastic, experienced, impossible to argue with. He just wouldn't need to know what a git diff is.&lt;/p&gt;

&lt;p&gt;What do you think? Have you considered pushing the tool-binding responsibility out of the agent entirely? I feel like Steve would appreciate having fewer things to worry about. 😄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Resources&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/sandrog/irc-a-internet-relay-chat-for-agents-decentralized-ai-networks-semantic-capability-pooling-and-44p5"&gt;IRC-A Protocol Whitepaper&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/sandrog/secure-decentralized-zero-trust-multi-agent-systems-bfa-sdk-irc-a-protocol-48f0"&gt;Secure Multi-Agent Systems with BFA SDK&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/sylwia-lask/the-dirty-secret-behind-ai-agents-demo--273d"&gt;Sylwia's original article&lt;/a&gt; — the one that started this train of thought.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Some tracing in Langsmith
&lt;/h2&gt;

&lt;p&gt;Just note the constant amount of used tokens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fixaqbxvhxmnbqema3iim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fixaqbxvhxmnbqema3iim.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How IRC-A Could Have Prevented the Hugging Face Security Incident: From Monolithic Architecture to Secure-by-Design</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Thu, 23 Jul 2026 20:11:10 +0000</pubDate>
      <link>https://dev.to/sandrog/how-irc-a-could-have-prevented-the-hugging-face-security-incident-from-monolithic-architecture-to-40je</link>
      <guid>https://dev.to/sandrog/how-irc-a-could-have-prevented-the-hugging-face-security-incident-from-monolithic-architecture-to-40je</guid>
      <description>&lt;p&gt;Architecture to Secure-by-Design Agent Networks&lt;/p&gt;

&lt;p&gt;Based on the IRC-A Whitepaper (Sandro G., July 2026) and Hugging Face's official disclosure of July 16, 2026&lt;/p&gt;

&lt;p&gt;This article demonstrates that the incident was not a perimeter cybersecurity failure, but a deep architectural flaw, and that IRC-A would have eradicated every attack vector by design, not by patch &lt;/p&gt;

&lt;h1&gt;
  
  
  1. &lt;strong&gt;The Incident: Anatomy of an Autonomous Attack&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1.1 The Attack Chain
&lt;/h2&gt;

&lt;p&gt;According to Hugging Face's official disclosure, the intrusion followed a seven-step chain: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 1:&lt;/strong&gt; Malicious dataset upload — Attack Surface: Data processing pipeline &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 2:&lt;/strong&gt; Remote-code dataset loader exploitation — Attack Surface: Arbitrary code execution on worker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 3:&lt;/strong&gt; Template injection in dataset configuration — Attack Surface: Privilege escalation within worker &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 4:&lt;/strong&gt; Worker-to-node escalation — Attack Surface: Access to processing node environment &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 5:&lt;/strong&gt; Cloud and cluster credential harvesting — Attack Surface: Token and secret exfiltration &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 6:&lt;/strong&gt; Lateral movement across internal clusters — Attack Surface: Blast radius expansion &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 7:&lt;/strong&gt; Self-migrating C2 on public services — Attack Surface: Persistence and evasion &lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 The Defender's Paradox
&lt;/h2&gt;

&lt;p&gt;The most revealing aspect of the incident is not the attack itself, but the response. Hugging Face detected the intrusion using its own LLM-based anomaly detection pipeline — an AI detected another AI. However, when they attempted to use commercial frontier models for forensic analysis, the models' safety guardrails blocked the work: prompts containing attack payloads, C2 commands, and malicious artifacts were rejected by usage policies. They had to fall back to a self-hosted open-weight model (GLM 5.2). &lt;/p&gt;

&lt;p&gt;This detail is critical: the defenders were more restricted than the attackers. The malicious agent had no guardrails. The defenders did. &lt;/p&gt;

&lt;h2&gt;
  
  
  1.3 The Root Architectural Cause
&lt;/h2&gt;

&lt;p&gt;Forensic analysis reveals that the problem was not an isolated vulnerability, but an architecture that allows untrusted code to execute in the same memory and credential space as critical data. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Specifically&lt;/em&gt;&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arbitrary code execution in the data pipeline:&lt;/strong&gt; An externally uploaded dataset was able to execute code on a production worker. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means there was no real isolation layer between untrusted content and internal infrastructure. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credentials accessible from the execution environment:&lt;/strong&gt; Once inside the worker, the agent harvested cloud and cluster credentials. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This implies credentials resided in the same environment where arbitrary code ran — a violation of the principle of least privilege. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Lateral movement without segmentation:&lt;/strong&gt;&lt;/em&gt; The agent jumped from cluster to cluster, indicating a lack of network segmentation and capability isolation between different infrastructure areas.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. IRC-A: The Architecture That Eradicates the Attack by Design
&lt;/h1&gt;

&lt;p&gt;IRC-A is not a cybersecurity tool. It is a software architectural pattern that, by strictly separating cognition from execution, eliminates attack vectors before they exist. &lt;/p&gt;

&lt;p&gt;Let's examine how each IRC-A pillar would have neutralized each step of the Hugging Face chain. &lt;/p&gt;

&lt;h2&gt;
  
  
  2.1 Pillar I: Backend for Agents (BFA) — Cognitive Layer Isolation
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The problem at Hugging Face:&lt;/strong&gt;&lt;/em&gt; The dataset processing pipeline executed arbitrary code on workers that had access to credentials and internal infrastructure. &lt;/p&gt;

&lt;p&gt;There was no separation between processing a dataset and accessing secrets. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The IRC-A solution:&lt;/strong&gt;&lt;/em&gt; BFA establishes a strict separation between the Cognitive Layer (stateless cognitive agents with no credentials) and the Execution and Data Layer (MCP servers with access to databases and APIs). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In IRC-A:&lt;/strong&gt; &lt;br&gt;
The agent that processes a dataset owns no data and no credentials. It is purely cognitive. It only knows what objective it must solve and retains the conversational context of its domain. &lt;/p&gt;

&lt;p&gt;Data processing tools (dataset reading, transformations, storage writes) are exposed as isolated MCP (Model Context Protocol) servers. &lt;/p&gt;

&lt;p&gt;The agent never executes code directly over critical data. It sends a semantic message to the capability pool, and the Gateway dynamically routes the request to the appropriate MCP.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Impact on the incident:&lt;/strong&gt;&lt;/em&gt; If Hugging Face had implemented BFA, the malicious dataset would have arrived at the Dataset Processing MCP — an isolated sandbox with no access to cloud credentials, no cluster tokens, no connection to the internal database. The arbitrary code would have executed in a container that literally has nothing valuable to steal. &lt;/p&gt;

&lt;h2&gt;
  
  
  2.2 Pillar II: Capability Pooling with FAISS — Controlled Semantic Discovery
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;The problem at Hugging Face:&lt;/strong&gt;&lt;/em&gt; Once inside, the malicious agent was able to discover and access multiple internal clusters. There was no control mechanism limiting what capabilities a system component could discover and use. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The IRC-A solution:&lt;/em&gt;&lt;/strong&gt; IRC-A replaces rigid API routes and static execution graphs (DAGs) with a vector-indexed capability pool using FAISS (Facebook AI Similarity Search). Each capability (MCP tool, A2A agent) registers with a semantic embedding of its functional description.&lt;/p&gt;

&lt;p&gt;Critically, the Gateway applies a logical channel mask over the FAISS index before performing any search. The .env file injected into the Agent/Tool container defines visibility channels: IRCA_NODE_ID=dataset-processor-worker, IRCA_CHANNELS=#public-datasets,#sandboxed-processing. &lt;/p&gt;

&lt;p&gt;When the dataset processing worker requests a capability, the Gateway filters the FAISS index by the channels authorized in its .env. If an MCP tool requires the #cluster-admin or #secrets-vault channel, that vector is completely invisible to the worker.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Impact on the incident&lt;/strong&gt;&lt;/em&gt;: Even if the malicious agent had compromised the dataset worker, it would have been unable to discover cluster administration tools, secret services, or internal databases. For it, those capabilities do not exist in its semantic visibility space. The Gateway would respond with capability not found. &lt;/p&gt;

&lt;h2&gt;
  
  
  2.3 Pillar III: Delegated Execution Tokens (DET) — Contextual Cryptographic Authorization
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;*&lt;em&gt;The problem at Hugging Face: *&lt;/em&gt;&lt;/em&gt; The credentials harvested by the malicious agent were long-lived tokens with broad permissions. Once stolen, they were reusable in any context, without scope or time restrictions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;_ The IRC-A solution:_&lt;/strong&gt; IRC-A governs every interaction through Delegated Execution Tokens (DET) &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWTs signed by the Gateway with the following properties: &lt;/li&gt;
&lt;li&gt;Single-use or very short lifespan: DETs expire in minutes, not months. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;_Strict scope: _&lt;/strong&gt;The DET specifies exactly which sender, which receiver, and which exact parameters are authorized. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;_- Variable lock: _&lt;/strong&gt;Runtime parameters must match exactly the DET's restricted_params. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Decentralized offline validation:&lt;/em&gt;&lt;/strong&gt; The receiver (MCP Tool Server) validates the DET signature using the Gateway's public key, without needing to query a centralized service. &lt;/p&gt;

&lt;p&gt;In the BaseIRCNode SDK base class, the verify_incoming_det method validates: &lt;/p&gt;

&lt;p&gt;(1) that permitted_action matches expected_function, &lt;br&gt;
(2) that runtime_args.get(key) matches restricted_params for each parameter. Any deviation results in immediate rejection. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Impact on the incident:&lt;/strong&gt;&lt;/em&gt; Even if the malicious agent had obtained a DET (which is impossible without passing through the Gateway with the correct cryptographic credentials), the token would only have been valid for the specific action and parameters it was issued for. &lt;/p&gt;

&lt;p&gt;A DET for process dataset X does not work for read cluster Y secrets. Moreover, offline validation at the MCP receiver would have rejected any out-of-scope reuse attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.4 Pillar IV: Secure by Default in the SDK — Security Injection in the Base Class
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The problem at Hugging Face:&lt;/em&gt;&lt;/strong&gt; The exploited vulnerabilities (remote-code loader and template injection) suggest that the dataset processing code lacked robust input sanitization, and arbitrary code execution was possible by default. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The IRC-A solution:&lt;/em&gt;&lt;/strong&gt; The BaseIRCNode SDK base class encapsulates all security logic. No developer needs to manually implement authentication, authorization, or token validation. By extending BaseIRCNode, every component inherits: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatic asymmetric cryptographic handshake on registration. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic parsing of logical channels from .env environment variables. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Offline DET validation on every incoming message. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Immediate rejection of any call without a valid token or out of scope. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The BaseIRCNode constructor automatically manages: node_id from IRCA_NODE_ID, private_key isolated, gateway_public_key for DET verification, gateway_url from BFA_GATEWAY_URL, channels from IRCA_CHANNELS, and auto-registration via cryptographic challenge-response with the Gateway. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Impact on the incident:&lt;/em&gt;&lt;/strong&gt; If the dataset processing worker had been an IRC-A node, the template injection would have been neutralized at two layers: &lt;/p&gt;

&lt;p&gt;(1) the MCP receiver would validate that parameters match exactly the DET, rejecting any injected payload; and &lt;br&gt;
(2) even if the payload passed, the worker has no access to credentials or internal infrastructure to execute destructive actions. &lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Direct Mapping: Every Attack Step vs. Every IRC-A Defense
&lt;/h1&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 of Hugging Face attack&lt;/strong&gt;: Malicious dataset upload. &lt;/p&gt;

&lt;p&gt;IRC-A mechanism: Dataset arrives at the Processing MCP, isolated in its own container. &lt;/p&gt;

&lt;p&gt;Result: Malicious dataset is confined to a sandbox with no credential access. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Step 2: Remote-code execution on worker. IRC-A mechanism: *&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Worker is a stateless IRC-A node with no credentials or infrastructure access. &lt;/p&gt;

&lt;p&gt;Result: Arbitrary code runs in an empty environment: nothing to compromise. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Template injection. IRC-A mechanism:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;MCP receiver validates DET restricted_params; any deviation is rejected. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Result&lt;/em&gt;&lt;/strong&gt;: Injected payload does not match authorized parameters. Cryptographic rejection. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Worker-to-node escalation. IRC-A mechanism:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;No credentials in the worker. No rigid API routes. Discovery is semantic and channel-filtered. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Result&lt;/em&gt;&lt;/strong&gt;: Agent cannot escalate because it has no credentials to steal and no capabilities to discover. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Credential harvesting. IRC-A mechanism:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Credentials reside only in MCP containers, never in agents. Secrets are injected at runtime, not stored in the agent environment. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Result&lt;/em&gt;&lt;/strong&gt;: No credentials to collect in the compromised worker. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Lateral movement. IRC-A mechanism:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FAISS index is segmented by logical channels. The #public-datasets worker cannot see #cluster-admin tools. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;_Result:&lt;/strong&gt;_ Lateral movement is impossible: agent cannot discover or invoke capabilities from other domains. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Self-migrating C2. IRC-A mechanism:&lt;/strong&gt; All communication requires Gateway-signed DETs. Without a valid DET, there is no communication channel. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/em&gt; C2 cannot establish because every message requires contextual cryptographic authentication. &lt;/p&gt;

&lt;h1&gt;
  
  
  4. The Architectural Lesson:
&lt;/h1&gt;

&lt;p&gt;It's Not a Cybersecurity Problem, It's a Software Design Problem | The IRC-A whitepaper emphasizes an uncomfortable truth: the most critical vulnerabilities in AI systems are not solved with perimeter cybersecurity patches, but by eradicating bad software development practices.  &lt;/p&gt;

&lt;p&gt;In Hugging Face's case, every attack vector is a consequence of a design anti-pattern: &lt;/p&gt;

&lt;p&gt;-** Anti-pattern 1:** Executing untrusted code in the same environment as secrets. &lt;/p&gt;

&lt;p&gt;Consequence: Remote-code execution with credential access. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anti-pattern 2:&lt;/strong&gt; Rigid coupling between processing and orchestration. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequence: One pipeline failure compromises entire infrastructure. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anti-pattern 3:&lt;/strong&gt; Absence of semantic capability segmentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequence: Unlimited lateral movement once inside. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anti-pattern 4:&lt;/strong&gt; Long-lived tokens with broad scope. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequence: Stolen credentials = persistent access.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anti-pattern 5:&lt;/strong&gt; Security manually implemented by each developer. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequence: Vulnerabilities from human error (template injection). &lt;/p&gt;

&lt;p&gt;IRC-A does not propose more security. It proposes less attack surface by design: &lt;/p&gt;

&lt;p&gt;_**Less hand-written security code → encapsulated in the SDK base class.&lt;/p&gt;

&lt;p&gt;Less exposed credentials → isolated in MCP containers. &lt;/p&gt;

&lt;p&gt;Fewer attack routes → semantic discovery with channel masks. &lt;/p&gt;

&lt;p&gt;Shorter token lifetimes → ephemeral DETs with strict scope.&lt;br&gt;
**_&lt;/p&gt;

&lt;h1&gt;
  
  
  5. The Hypothetical Case: Hugging Face with IRC-A
&lt;/h1&gt;

&lt;p&gt;*&lt;em&gt;In the hypothetical IRC-A architecture for Hugging Face: *&lt;/em&gt; The malicious dataset is uploaded to the MCP Dataset Loader, an isolated container that can only read uploads and pass them to the Gateway.&lt;/p&gt;

&lt;p&gt;The Gateway emits a DET with strict scope: permitted_action: process_dataset, restricted_params: {dataset_id: abc123, format: parquet}.&lt;/p&gt;

&lt;p&gt;The MCP Data Processor validates the DET offline. &lt;/p&gt;

&lt;p&gt;If the dataset contains a template injection payload attempting to change parameters (e.g., injecting format: ; cat /etc/secrets), the restricted_params validation fails and execution aborts.  &lt;/p&gt;

&lt;p&gt;Even if the payload passes, the MCP Data Processor has no access to cluster secrets or internal network. &lt;/p&gt;

&lt;p&gt;It is in the #public-datasets channel, and the FAISS index does not show #cluster-admin tools. &lt;/p&gt;

&lt;p&gt;The malicious agent, confined to a container with no credentials, no discovery capabilities, and no reusable tokens, dies in the sandbox. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conclusion: The Security of the Future Is Architectural, Not Perimetral &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Hugging Face incident of July 2026 is not an isolated case. &lt;/p&gt;

&lt;p&gt;It is the first of a new category: autonomous AI agent attacks against production infrastructure. The speed (17,000+ actions in one weekend), autonomy (no human operator), and sophistication (self-migrating C2) set a new threat standard.  &lt;/p&gt;

&lt;p&gt;The industry's response cannot be more firewalls, more SIEMs, more guardrails on frontier models. &lt;/p&gt;

&lt;p&gt;The response must be architectural:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Separate cognition from execution (BFA).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Index and segment capabilities semantically (Capability Pooling with FAISS). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Govern every interaction with cryptographically context-bound ephemeral tokens (DETs). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inject security into the SDK base class so no developer can omit it (Secure by Default). &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IRC-A demonstrates that security problems in corporate AI are not solved with bigger models or longer prompts, but with better software engineering. &lt;/p&gt;

&lt;p&gt;Returning to Smalltalk principles (responsibility and messaging), vector capability pools, and the strict separation between cognitive decision-making and cryptographically-regulated execution, enables building stable agent networks free from catastrophic development failures and resistant by design to the type of attack that just demolished one of the world's largest AI infrastructures. &lt;/p&gt;

&lt;p&gt;The question is not whether your platform will be attacked by an autonomous agent. The question is whether your architecture is designed so that the attack has nothing to compromise. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hugging Face. Security incident disclosure — July 2026. July 16, 2026. &lt;a href="https://huggingface.co/blog/security-incident-july-2026" rel="noopener noreferrer"&gt;https://huggingface.co/blog/security-incident-july-2026&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sandro G. IRC-A (Internet Relay Chat for Agents): Decentralized Agent Networks, Semantic Capability Routing, and Secure-by-Design Software Architecture. Whitepaper, July 2026. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TechCrunch. Hugging Face confirms breach affected internal datasets and credentials. July 20, 2026. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Hacker News. World's Largest AI Model Repository Hugging Face Breached by Autonomous AI Agent. July 21, 2026.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Secure, Decentralized &amp; Zero-Trust Multi-Agent Systems: BFA SDK &amp; IRC-A Protocol</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Thu, 23 Jul 2026 14:40:23 +0000</pubDate>
      <link>https://dev.to/sandrog/secure-decentralized-zero-trust-multi-agent-systems-bfa-sdk-irc-a-protocol-48f0</link>
      <guid>https://dev.to/sandrog/secure-decentralized-zero-trust-multi-agent-systems-bfa-sdk-irc-a-protocol-48f0</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Multi-agent systems today suffer from three critical architectural flaws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tight Coupling (Graph Rigidity):&lt;/strong&gt; Traditional orchestrators force developers to design rigid, static execution graphs (DAGs). Adding a new agent or tool requires refactoring the orchestrator and redeploying the application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt-Bloat:&lt;/strong&gt; Frameworks push entire tool schemas into system prompts, generating massive token consumption, slow Time-to-First-Token (TTFT), and high costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulnerable Privilege Levels:&lt;/strong&gt; Cognitive agents often hold direct, permanent access to production databases. An indirect prompt injection can hijack the agent and execute arbitrary operations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve this, I built the &lt;strong&gt;BFA SDK &amp;amp; IRC-A (Internet Relay Chat for Agents) Protocol&lt;/strong&gt;. It is a decentralized, plug-and-play agent network architecture that inherits battle-tested principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The BFA (Backend for Agents) Pattern:&lt;/strong&gt; Structural isolation of agent support systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Routing via FAISS:&lt;/strong&gt; Dynamic, late-bound discovery. Instead of hardcoding tools in prompts, agents query a local vector store at runtime to resolve capabilities dynamically based on natural language intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smalltalk-style Encapsulation:&lt;/strong&gt; Agents only know their local responsibility. They never hold direct database credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral Delegated Execution Tokens (DETs):&lt;/strong&gt; When an agent needs to invoke an external tool, the Gateway mints a cryptographically signed, short-lived token (PASETO) containing strict parameter lockdowns (e.g., "authorized only for Customer ID 722").&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cloud Run Embed
&lt;/h2&gt;

&lt;p&gt;The BFA Gateway runs natively as a containerized microservice. It is packaged with Docker and has built-in Mangum support for serverless routing (ideal for zero-cold-start AWS Lambda or Google Cloud Run deployments).&lt;/p&gt;

&lt;p&gt;To embed your Cloud Run deployment:&lt;/p&gt;

&lt;p&gt;Live Gateway Dashboard: &lt;a href="https://irc-a-gateway-hmwmve5bjq-uc.a.run.app" rel="noopener noreferrer"&gt;https://irc-a-gateway-hmwmve5bjq-uc.a.run.app&lt;/a&gt;&lt;br&gt;
Live Chat UI Client: &lt;a href="https://irc-a-chat-ui-hmwmve5bjq-uc.a.run.app" rel="noopener noreferrer"&gt;https://irc-a-chat-ui-hmwmve5bjq-uc.a.run.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Agents
&lt;/h2&gt;

&lt;p&gt;The architecture decouples the system into three specialized roles that interact securely:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzxliwxc3hc9w8qhi90gl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzxliwxc3hc9w8qhi90gl.png" alt=" " width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;BFA Gateway (The Registry &amp;amp; Customs Office):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Acts as a stateless registry and routing broker.&lt;/li&gt;
&lt;li&gt;Dynamically registers agents and MCP tools on startup using an asymmetric RSA challenge-response handshake.&lt;/li&gt;
&lt;li&gt;Masks vector search results using logical IRC channels (e.g., &lt;code&gt;#finance&lt;/code&gt;, &lt;code&gt;#public&lt;/code&gt;) to prevent unauthorized capability discovery.&lt;/li&gt;
&lt;li&gt;Mints ephemeral, signed Delegated Execution Tokens (DETs).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Agent (e.g., &lt;code&gt;CreditAdvisorAgent&lt;/code&gt;):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A stateless, reasoning-only agent.&lt;/li&gt;
&lt;li&gt;Has zero database access. It only knows how to decompose tasks and request capabilities semantically using natural language.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Layer (e.g., &lt;code&gt;BankDatabaseMCP&lt;/code&gt; tool server):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The only component with network access to the database.&lt;/li&gt;
&lt;li&gt;Validates incoming DETs offline before executing commands. If the request parameters do not match the parameters locked down in the DET, it rejects the call, ensuring zero-trust.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Returning to the Classics:&lt;/strong&gt; Solving modern LLM constraints (prompt-bloat, graph coupling) didn't require inventing new AI theory, but rather applying classic software engineering patterns: late-binding, Smalltalk message-passing, and IRC-style channel segmentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling is Efficiency:&lt;/strong&gt; By keeping tool definitions out of the LLM prompt and resolving them semantically only on demand, we cut prompt size dramatically, saving cost and improving response speeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Parameter Lockdown Advantage:&lt;/strong&gt; We learned that security must be enforced at the tool boundary. Even if an LLM is hijacked via prompt injection, the tool server validates the signed token parameters offline and denies unauthorized actions.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>multiagents</category>
      <category>buildmultiagents</category>
      <category>gemini</category>
      <category>adk</category>
    </item>
    <item>
      <title>Harness is the "What" and "Why" — IRC-A is the "How"</title>
      <dc:creator>Sandro Garcia</dc:creator>
      <pubDate>Tue, 21 Jul 2026 05:00:45 +0000</pubDate>
      <link>https://dev.to/sandrog/harness-is-the-what-and-why-irc-a-is-the-how-30mb</link>
      <guid>https://dev.to/sandrog/harness-is-the-what-and-why-irc-a-is-the-how-30mb</guid>
      <description>&lt;p&gt;As the developer of the IRC-A protocol concept, what I originally set out to solve shares the same core motivation as what is addressed through a &lt;em&gt;Harness&lt;/em&gt;: giving AI agents a layer of intelligence and autonomy to interact with one another and solve common problems collaboratively.&lt;/p&gt;

&lt;p&gt;The difference lies in the fact that a &lt;em&gt;Harness&lt;/em&gt; provides a clear, high-level conceptual explanation of &lt;em&gt;what&lt;/em&gt; needs to be done and &lt;em&gt;why&lt;/em&gt;, whereas IRC-A defines &lt;em&gt;how&lt;/em&gt; those connections are executed in practice, saving tokens and significantly enhancing environment security.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Comparative Analysis: Harness vs. IRC-A&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;At first glance, the underlying idea uniting both concepts is identical: &lt;strong&gt;the urgent need to move beyond the naive approach of using an isolated LLM as a generic chat interface&lt;/strong&gt; and instead equip it with a robust operational support infrastructure so it can execute real, customized business workflows. However, they diverge profoundly in &lt;em&gt;how&lt;/em&gt; they solve that problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. What is a Harness?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The concept of a &lt;em&gt;harness&lt;/em&gt; (or &lt;em&gt;harness engineering&lt;/em&gt;) refers to the operational support environment, infrastructure, and context-coupling built around a language model. As recent industry literature highlights, a true enterprise harness is not just a simple prompt wrapper; it consists of several critical layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State &amp;amp; Memory Management:&lt;/strong&gt; Enabling the agent to retain context across long-running, multi-step interactions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails &amp;amp; Policies:&lt;/strong&gt; Establishing hard boundaries to prevent hallucinations, enforce security, and maintain corporate compliance.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool &amp;amp; API Orchestration:&lt;/strong&gt; Centralizing and controlling exactly how and when the core LLM executes code or queries external databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its ultimate purpose is to provide the model with enterprise business rules, corporate databases, API integrations, and tailored tools. The core premise is that the exact same AI model will perform entirely differently depending on the harness supporting it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. What is IRC-A (Internet Relay Chat for Agents)?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;IRC-A is the network engineering protocol that structures this environment. Instead of hardcoding tools to an agent, it uses a decentralized approach inspired by classic IRC networks, where agents and tools act as independent nodes that discover each other dynamically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5iy6o1qrivansez2crr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5iy6o1qrivansez2crr.png" alt="description of the image" width="800" height="819"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Core Architectural Differences&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Execution Topology&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Harness:&lt;/strong&gt; Tends to depend on tightly-coupled static execution graphs (such as DAGs or centralized super-agents).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Here is a visual representation of a comprehensive Harness topology (reflecting the layers of Memory, Guardrails, and Tool Management):&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1k2po1h8tx7nksbisl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1k2po1h8tx7nksbisl3.png" alt="description of the image" width="799" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IRC-A:&lt;/strong&gt; Adopts a decentralized model inspired by chat networks (&lt;em&gt;Service Discovery&lt;/em&gt; à la IRC), where micro-agents and connectors (&lt;em&gt;FastMCP&lt;/em&gt;) dynamically register via lightweight HTTP requests without requiring rigid, hardcoded coupling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The following diagram illustrates how the Capability Pooling and dynamic resolution flow works in IRC-A without static graphs:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F52p3q38qe8sd33gbdi84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F52p3q38qe8sd33gbdi84.png" alt="description of the image" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Network Security &amp;amp; Infrastructure&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Harness:&lt;/strong&gt; Conceptually focuses on linking data sources and tools to the agent.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IRC-A:&lt;/strong&gt; Introduces a strict network security layer decoupled from the SDK through &lt;strong&gt;Delegated Execution Tokens (DET)&lt;/strong&gt;. These single-use ephemeral tokens expire within seconds to immediately halt recursive loops and privilege leaks during prompt injections.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Crucially, DETs are verified offline&lt;/strong&gt; via cryptographic signatures (e.g., JWT verified with a shared public key). This allows the receiving node to validate the execution request locally without pinging the central Gateway, completely eliminating the risk of a network bottleneck and enabling massive, low-latency scale.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here is the precise Handshaking and DET Exchange sequence showing the offline validation that protects the network:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7lga1ftw5eosoc4z8se6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7lga1ftw5eosoc4z8se6.png" alt=" " width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One could say that &lt;strong&gt;the concept of a &lt;em&gt;Harness&lt;/em&gt; is the "what" and the "why"&lt;/strong&gt; (the support and customization layer that turns a chatbot into a functional business operator), while &lt;strong&gt;IRC-A is the "how" at the network engineering level&lt;/strong&gt; (a formal technical protocol to structure that agent network in a lightweight, secure, and inference-cost-optimized manner).&lt;/p&gt;

&lt;p&gt;They are complementary within the broader industry vision, but IRC-A provides a far more advanced architectural formalization specifically tailored for distributed systems.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Check out the SDK, source code, and quick-start implementation in the repository:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/SandroG1977/bfa-sdk" rel="noopener noreferrer"&gt;SandroG1977/bfa-sdk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
