<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[agentbuild.ai]]></title><description><![CDATA[AgentBuild is the practical publication for designing, governing, and operating AI agents that work in the real world.]]></description><link>https://newsletter.agentbuild.ai</link><image><url>https://substackcdn.com/image/fetch/$s_!OIBg!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png</url><title>agentbuild.ai</title><link>https://newsletter.agentbuild.ai</link></image><generator>Substack</generator><lastBuildDate>Tue, 10 Nov 2026 22:50:50 GMT</lastBuildDate><atom:link href="https://newsletter.agentbuild.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sandipan Bhaumik]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[sanbhaumik@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[sanbhaumik@substack.com]]></itunes:email><itunes:name><![CDATA[Sandipan Bhaumik]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sandipan Bhaumik]]></itunes:author><googleplay:owner><![CDATA[sanbhaumik@substack.com]]></googleplay:owner><googleplay:email><![CDATA[sanbhaumik@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sandipan Bhaumik]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Horrors Stories of AI Agents in Production]]></title><description><![CDATA[AgentBuild Halloween special: five failures that only show up after go-live]]></description><link>https://newsletter.agentbuild.ai/p/the-horrors-of-ai-agents-in-production</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/the-horrors-of-ai-agents-in-production</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 31 Oct 2026 12:39:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5ba4beac-695f-4c08-82a2-527fde80337b_2144x1204.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Spooky season is officially here. Between the sugar crashes and the constant fear of watching your autonomous systems run wild at midnight, I figured it was time for a proper ghost story. </p><p>Forget vampires and haunted houses, nothing quite matches the chill of logging into production on Halloween morning and watching an un-idempotent agent cheerfully execute a refund loop 120 times. Grab your spiced pumpkin tea and a blanket, because we are diving straight into the five real-world agent ghosts that only show up after go-live.</p><div><hr></div><p>Every agent demo I saw this year had this same pattern - the agent calls a tool, reads the result, decides what to do next, and everyone in the room just relaxes because it actually works.</p><p>Only problem is, nobody in that room is thinking about the midnight horror.</p><p>At 3 am (eewwww), the downstream API is fully sleeping or flaky. The person asking the question is having the wrong entitlements altogether. The memory store is holding onto some random fact that stopped being true back in July, and the tool schema completely changed in Tuesday&#8217;s deployment. The model is still the same one that impressed everybody in the demo room, but everything around it is totally different.</p><p>See, we all know how to reason about model quality and all that. But the failures that actually hurt you in production come from what we wire the model into, things like state, tools, permissions, memory, retries, and actions that carry real-life consequences.</p><p>Here are five of them. Each one is a design problem you can easily solve before go-live, which honestly makes them the least frightening thing in this whole issue.</p><div><hr></div><h3>1. The agent that would not stop running</h3><p>Picture an operations agent that resolves failed orders. Its loop is sensible: detect the failure, diagnose it, call the recovery tool, verify, retry if needed.</p><p>One night the recovery API starts timing out. The agent calls it and gets a timeout, so it assumes the call failed and tries again. The first call had gone through. So does the second. Then the verification endpoint times out as well, and the agent runs the whole sequence again.</p><p>By the time someone opens the dashboard, the same recovery operation has run dozens of times against the same orders.</p><p>Strip away the LLM and you have a textbook distributed systems failure: an at-least-once call with no idempotency. People were writing postmortems about this long before agents existed. Agents make it worse because a workflow engine retries the way you configured it, whereas an LLM can decide to retry, rephrase the request, or reach for a different tool that does the same thing. Your retry logic now lives inside a probabilistic component.</p><p><strong>What was missing:</strong> idempotency, retry budgets, tracked action state, execution receipts, duplicate detection, and a defined point at which the agent gives up.</p><p><strong>What to build:</strong> give every consequential tool call an execution identity, something like <code>action_id = hash(session, task, operation, target)</code>, and check it before anything executes. Have tools return explicit states (<code>REQUESTED &#8594; ACCEPTED &#8594; EXECUTING &#8594; SUCCEEDED | FAILED</code>) so the agent reads a status instead of interpreting a timeout. Enforce the retry budget outside the model. Retry twice, then escalate to a human.</p><blockquote><p>Whether a payment, a refund or a stock movement runs twice is a decision for your infrastructure. The model should never be the component making it.</p></blockquote><div><hr></div><h3>2. The agent that had too much power</h3><p>An internal employee agent can search the knowledge base, read the HR system, raise IT tickets, read CRM records and update a few systems. It authenticates with a service account that has broad access, because per-user permissions felt like a phase-two problem.</p><p>A team lead asks: <em>&#8220;Show me the compensation history for everyone in my team.&#8221;</em> </p><p>The agent finds an HR tool that can answer, the request succeeds, and the data comes back.</p><p>There was no prompt injection and no jailbreak. The model did what it was built to do. Security was bypassed at design time, weeks before anyone typed the question.</p><p>The HR system saw <code>Agent-Service-Account</code>. It never saw <em>the agent, acting for this team lead, who has no entitlement to salary data</em>. Identity stopped at the agent boundary.</p><p>Teams usually ask which tools the agent can access. The question that matters in a regulated firm is narrower: what can this agent access on behalf of this user, for this task, under these conditions?</p><p><strong>What to build:</strong> delegated identity carried end to end, <code>User &#8594; Agent &#8594; Tool &#8594; Resource</code>. On-behalf-of token flows exist for exactly this. Evaluate every action against the initiating user, the agent&#8217;s identity, the operation, the target resource, the data classification and the policy context. For high-impact actions, split the decision: the agent proposes, a policy engine evaluates, a human approves, the tool executes.</p><blockquote><p>The model can decide what it wants to do. Whether it is allowed to do it belongs to your policy layer.</p></blockquote><div><hr></div><h3>3. The memory that became a ghost</h3><p>A sales assistant keeps long-term memory to personalise its help. On a call in March, a customer says: <em>&#8220;We&#8217;re probably cancelling the expansion project.&#8221;</em> </p><p>The agent stores it.</p><p>By June the project is back on. Memory didn&#8217;t update.</p><p>A salesperson asks the agent to prepare them for tomorrow&#8217;s meeting. The agent replies, with full confidence, that the customer has cancelled the expansion and upsell should be avoided.</p><p>The agent didn&#8217;t hallucinate. It recalled, accurately, a fact that had expired. That is harder to catch than a hallucination, because every retrieval check passes: the source exists, the citation is real, the quote is verbatim.</p><p>Long-term memory gives truth a lifecycle. This is Data Debt turning up somewhere new. Memory is data, and most teams build memory stores with none of the governance they would insist on for a customer table.</p><p><strong>What to build:</strong> treat each memory as a governed record with provenance, a timestamp, a confidence level, an expiry, a scope (private to one user or shared across the organisation) and superseding relationships. <code>Customer considering cancelling expansion</code> should be able to become <code>SUPERSEDED BY: Customer approved expansion (CRM, 14 June)</code>. Before anything is written to memory, you should know who created it, where it came from, when it was last verified, and whether newer evidence can override it.</p><blockquote><p>We worry about agents that forget. In a sales meeting, the one that remembers too well and for too long does more damage.</p></blockquote><div><hr></div><h3>4. The tool that changed face underneath the agent</h3><p>For six months your agent has called <code>create_support_ticket()</code> without a problem. Then the API team ships v3. A field that used to be optional becomes mandatory, and <code>priority = "high"</code> becomes <code>severity = 1</code>.</p><p>A traditional integration fails loudly. An agent reads the error and improvises. It might retry, guess at a new payload, call a different tool, or route around the problem through an email workflow. Your production behaviour now depends on how a model interprets an error message that was never written for a model to read.</p><p>The API team did nothing wrong by their own standards. They versioned the API and updated the docs. They had no idea three agents depended on that field, because nothing recorded the dependency.</p><p>Tools are contracts, owned by teams who have never seen your agent. With MCP servers multiplying, a single agent can depend on dozens of tools owned by different teams, and every schema change is a potential behaviour change.</p><p><strong>What to build:</strong> versioned tool schemas, backward-compatibility windows, capability metadata and a deprecation policy. Contract tests in the tool&#8217;s own CI that exercise known agent usage. Agent regression suites that run when a tool releases, not only when the agent does. Before Tool v3 ships, someone should be able to say which agents depend on v2 and which of their behaviours will change.</p><blockquote><p>API management covers the interface. Most estates have nothing for agent-tool dependency management: knowing who breaks when the interface moves.</p></blockquote><div><hr></div><h3>5. The agent escaped the graveyard test</h3><p>This is the one that frightens me most.</p><p>A customer support agent clears its evaluation suite. Answer accuracy, policy adherence, tool selection and hallucination rate are all green. It launches.</p><p>A month later, customers have found that if they push back on an answer five or six times, the agent reverses its recommendation. Another user uploads a PDF with instructions buried in it, and the agent follows them. Starting two workflows at once leaks state from one into the other.</p><p>None of this was in the benchmark. The test set was written by people imagining how customers would behave. Production is customers actually behaving.</p><p>This is <strong>Evaluation Debt</strong>. The team treated evaluation as a gate (<code>TEST &#8594; PASS &#8594; DEPLOY</code>) when it needs to be a loop: <code>OBSERVE &#8594; FIND FAILURE &#8594; WRITE TEST &#8594; EVALUATE &#8594; IMPROVE</code>. Production traces feed the evaluation system continuously, and every new failure becomes a permanent test case. Over time the suite becomes a record of everything the system learned the hard way.</p><p><strong>What to build:</strong> evaluation at four layers.</p><ul><li><p><strong>Model:</strong> was the response accurate?</p></li><li><p><strong>Agent:</strong> did it choose the right tool and reasoning path?</p></li><li><p><strong>Workflow:</strong> did the task actually complete?</p></li><li><p><strong>System:</strong> did retries, permissions, latency, state and downstream dependencies behave?</p></li></ul><p>The best evaluation dataset you will ever own is the one built from your own incidents.</p><div><hr></div><h3>What the five have in common</h3><p>A better model fixes none of them. Duplicate execution, borrowed identity, stale memory, drifting tool contracts and missing production tests all live in the architecture around the model.</p><p>That is why building production agents looks less like prompt engineering every month and more like distributed systems engineering with a probabilistic component in the middle. The work is in identity, state, memory, tool contracts, policy, retries, observability, evaluation and human approval. The LLM is one component inside that system.</p><div><hr></div><h3>The scariest diagram this Halloween</h3><p>One mistake to note is relaxing the system around an agent because the agent behaves intelligently. It should run the other way. Every bit of autonomy you hand the model needs a matching deterministic control around it.</p><p>Your agent can reason probabilistically. Your permissions, financial transactions, audit trail, retry policy and identity model cannot.</p><p>So the architecture diagram that should frighten you this year has no monsters on it. It has one box labelled <strong>AI Agent</strong>, with an arrow from that box to every system in the enterprise.</p><p>Go and check what your agents did last night. </p><p>Happy Halloween. &#127875;</p><div><hr></div><h3>Share your perspective</h3><ul><li><p><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the Reader Survey</a> to shape upcoming deep dives on production agent architectures.</p></li><li><p><a href="https://newsletter.agentbuild.ai/publish/post/https://newsletter.agentbuild.ai/subscribe?">Subscribe to AgentBuild</a> for engineering blueprints delivered weekly.</p></li><li><p><a href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share">Share agentbuild.ai</a> with your technical peers.<br></p></li></ul><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Architecture Failure: The hidden decision dependency in multi-agent systems]]></title><description><![CDATA[Your IAM policies secure the network, but unmapped decision dependencies let low-privilege agents silently control high-risk actions. Here is how to build deterministic boundaries.]]></description><link>https://newsletter.agentbuild.ai/p/architecture-failure-the-hidden-decision</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/architecture-failure-the-hidden-decision</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sun, 25 Oct 2026 14:31:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3637a61c-e7ee-4ef4-9c3d-a48cf714bad5_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#8220;How do we let LLM agents touch production systems? What happens when an upstream agent&#8217;s probabilistic reasoning triggers an irreversible action downstream?&#8221;</em></p><p>Multi-agent architectures introduce the risks of unmapped decision dependencies. Architectures where authenticated, read-only agents exert unconstrained, transitive authority over high-risk execution layers without deterministic boundaries in between.</p><p>This is the last part of our series on what breaks when AI agents transition from prototypes to production:<br><br><em><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communication Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail">Part 2: Contract Failure: Why AI Agent Handoffs Fail</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><a href="https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare?r=36xwjn">Part 5: Agent Sprawl: The Hidden Nightmare of Your Next Agent Call</a><br><a href="https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in">Part 6: Decision Blindness: How to Fix &#8220;Decision Blindness&#8221; in AI Agents</a><br><a href="https://newsletter.agentbuild.ai/p/authority-failure-stop-giving-agents">Part 7: Authority Failure: Stop Giving Agents Tools. Start Giving Them Boundaries.</a><br><a href="https://newsletter.agentbuild.ai/p/complexity-failure-the-hidden-cost">Part 8: Complexity Failure: The Hidden Cost of Evaluation Debt in Multi-Agent Systems</a><br><a href="https://newsletter.agentbuild.ai/p/commitment-failure-handling-the-risks">Part 9: Commitment Failure: Handling the Risks of Agent Actions</a></em></p><p>Today, we look at the failure that is often overlooked: <strong>Architecture Failure</strong></p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>We have all stood in front of a whiteboard and drawn the exact same boxes and arrows. Users. Agents. Orchestrators. Vector databases. Tools. Target APIs. We map the data flow, define the component dependencies, and wrap it all in IAM policies. The architecture looks scalable, the boundaries look secure, and least privilege is demonstrably enforced.</p><p>But when you put this system into production, that diagram is lying to you.</p><p>It tells you how the system runs, but it completely obscures how the system <em>thinks</em>. As we transition from shipping deterministic microservices to deploying agentic systems, we are introducing a blind spot into our engineering practices. Standard component and permission graphs map system dependencies. They fail to map decision dependencies. And in a multi-agent architecture, decisions are the most critical dependencies you have.</p><div><hr></div><h3>The component graph is an illusion</h3><p>Consider a standard enterprise automation workflow:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sz1m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sz1m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 424w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 848w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 1272w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sz1m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png" width="1456" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183397,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/221970789?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Sz1m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 424w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 848w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 1272w, https://substackcdn.com/image/fetch/$s_!Sz1m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c2d7945-13e5-485a-b4e7-2002e34801ed_2042x858.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Standard multi-agent architecture diagram (high-level)</figcaption></figure></div><p>From a traditional systems architecture perspective, this is a solved problem. We understand how to secure it. We grant the Research Agent read-only access to customer data. We isolate the Recommendation Agent. We restrict the Payment API so that only the Execution Agent can invoke it.</p><p>If we audit the IAM graph, it looks impenetrable. The Research Agent cannot execute payments. It lacks the scope, the tokens, and the network path.</p><p>But the component graph and the IAM graph are hiding a third, undocumented architecture: the <strong>decision graph</strong>.</p><p>The operational reality looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GyWl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GyWl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 424w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 848w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 1272w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!GyWl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png" width="1456" height="537" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:537,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151307,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/221970789?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GyWl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 424w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 848w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 1272w, https://substackcdn.com/image/fetch/$s_!GyWl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ddc6900-cb78-4259-9d3b-cfe3fc087e6b_2024x746.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The decision architecture is hidden in component architecture diagrams</figcaption></figure></div><p>These are not the same graph. The first tells us which services can establish a TLS connection. The second tells us which decisions depend on prior probabilistic interpretations. In agentic systems, data isn&#8217;t simply passed; it is interpreted. </p><blockquote><p>When Agent B receives data from Agent A, it is often not receiving raw telemetry or immutable facts. It is receiving Agent A&#8217;s <em>conclusion</em>.</p></blockquote><div><hr></div><h3>The danger of transitive authority</h3><p>This decision lineage exposes a massive vulnerability in how we currently threat-model AI systems.</p><p>If you ask an infrastructure engineer where the high-risk boundary is in the scenario above, they will point to the Execution Agent. But if an attacker wants to steal &#163;2,000, they don&#8217;t need to compromise the Execution Agent or bypass the Payment API&#8217;s authentication. They just need to manipulate the unstructured data ingested by the read-only Research Agent.</p><p>If the Research Agent misinterprets a poisoned document and confidently outputs that a user is eligible for a refund, and the downstream agents simply accept that interpretation, the exploit succeeds. Every API call was authenticated. Every agent operated perfectly within its RBAC boundaries. Yet the system produced an unauthorized, catastrophic outcome.</p><blockquote><p>I call this <strong>transitive authority</strong>: permissions are not inherited, but <em>influence</em> is. </p></blockquote><p>A low-authority component that sits upstream of a high-authority decision effectively wields the power of that downstream system if there are no independent control boundaries in between. The risk profile of an agent is not defined solely by what it can access, but by what its outputs can materially influence.</p><div><hr></div><h3>JSON schemas are not strict enough</h3><p>The engineering instinct here is to tighten the interface. We force agents to communicate via strict JSON schemas:</p><p>JSON</p><pre><code><code>{
  "customer_id": "cust_8912",
  "recommendation": "REFUND",
  "amount": 2000,
  "confidence": 0.94,
  "reasoning": "Policy exception granted based on retrieved context."
}
</code></code></pre><p>This is syntactically robust and operationally useless as a security boundary. A valid schema tells the downstream agent nothing about whether it should <em>trust</em> the payload. A syntactically perfect handoff can still carry a fundamentally compromised decision.</p><p>To establish a real boundary, the receiving agent must validate the trust provenance, not just the data structure. </p><ul><li><p>What evidence supports this recommendation? </p></li><li><p>Was the amount calculated deterministically or hallucinated probabilistically? </p></li><li><p>Are we simply trusting an upstream LLM&#8217;s interpretation of a policy, or are we enforcing that policy in code?</p></li></ul><div><hr></div><h3>Adding a &#8220;Critic&#8221; agent is often not enough</h3><p>This leads to a common anti-pattern I see in early agentic implementations: attempting to solve probabilistic unreliability by adding more probabilistic reviewers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y1LT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y1LT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 424w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 848w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 1272w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!y1LT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png" width="1456" height="658" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:658,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:220658,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/221970789?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y1LT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 424w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 848w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 1272w, https://substackcdn.com/image/fetch/$s_!y1LT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9994a82-a8eb-463f-803c-6e9c58c86827_2058x930.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Adding a "Critic" agent creates the illusion of defense in depth</figcaption></figure></div><p>It looks like defense in depth. It is actually just trust propagation. Five reasoning steps do not equal five control boundaries. If the Critic Agent is simply prompted to &#8220;review the Analyst&#8217;s work&#8221; using the same underlying context, it will often confidently validate the Analyst&#8217;s hallucination.</p><p>A real control boundary changes the operational mechanics. It introduces friction where friction is required.</p><div><hr></div><h3>The blueprint: 4 steps to secure your Decision Graph</h3><p>To move from theoretical risks to production-grade resilience, engineering teams must implement a new set of architectural controls. </p><p>Here is how you build a secure decision graph in practice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ACr3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ACr3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 424w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 848w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ACr3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png" width="1456" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:403517,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/221970789?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ACr3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 424w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 848w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!ACr3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21564d55-11b9-4397-8cad-1e710ce8c299_2030x1180.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>1. Work backwards from authority:</strong> Do not start your threat modeling at the API gateway or the read-only agent. Start at the point of highest authority, the Execution Agent or the mutation API, and trace the decision dependencies backward. For every upstream input, ask: <em>Can this probabilistic interpretation materially change our final action?</em> If the answer is yes, you need a control boundary.</p><p><strong>2. Enforce deterministic control boundaries:</strong> Stop using an LLM to check another LLM. Build hybrid systems where probabilistic reasoning is constrained by deterministic code.</p><ul><li><p>Force downstream agents to re-fetch critical source data rather than trusting upstream summaries.</p></li><li><p>Let the LLM recommend the refund, but use standard Python/Go to evaluate the threshold (<code>if amount &gt; max_refund: require_human_approval()</code>).</p></li><li><p>Before an agent executes a command based on an entity&#8217;s status, cross-reference that status against an authoritative SQL database, not the agent&#8217;s memory.</p></li></ul><p><strong>3. Validate trust provenance, not just schemas:</strong> When Agent A hands off to Agent B, standardizing the JSON is only step one. Agent B must be engineered to verify <em>how</em> Agent A reached its conclusion. Pass the metadata of the decision, which policy was used, which documents were cited alongside the payload, and have the execution layer independently verify that those conditions justify the action.</p><p><strong>4. Upgrade to decision observability:</strong> Standard APM traces (like OpenTelemetry or Jaeger) are built for the component graph. They will tell you that Agent A called Tool C and returned a 200 OK. But if a regulator or auditor questions an automated financial decision six months from now, you need <strong>decision provenance</strong>. You must log the environment at the exact moment of inference: the specific context injected into the prompt, the exact version of the policy evaluated, the intermediate outputs that became downstream inputs, and the deterministic controls that were bypassed or satisfied.</p><p>Architecture for the AI era requires reasoning across three distinct dimensions. </p><ul><li><p>Component architecture defines communication. </p></li><li><p>Permission architecture defines access. </p></li><li><p>Decision architecture defines influence. </p></li></ul><p>Before you build your next autonomous workflow, trace that third dimension. You will likely find that your most critical security boundary isn&#8217;t the API gateway, it is an upstream prompt handling untrusted text.</p><div><hr></div><h3>Share your perspective</h3><ul><li><p><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the Reader Survey</a> to shape upcoming deep dives on production agent architectures.</p></li><li><p><a href="https://newsletter.agentbuild.ai/publish/post/https://newsletter.agentbuild.ai/subscribe?">Subscribe to AgentBuild</a> for engineering blueprints delivered weekly.</p></li><li><p><a href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share">Share agentbuild.ai</a> with your technical peers.<br></p></li></ul><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Commitment Failure: Handling the Risks of Agent Actions]]></title><description><![CDATA[Agents don&#8217;t fail in production because of the model. They fail when one timeout turns into two refunds. Here is how to make sure every agent action is idempotent, secure, and deterministic.]]></description><link>https://newsletter.agentbuild.ai/p/commitment-failure-handling-the-risks</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/commitment-failure-handling-the-risks</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 17 Oct 2026 13:03:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/26f72819-e6f4-4b69-8296-e7f97c18a56e_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This comes up often in my conversations during architecture workshops.</p><p><em>&#8220;How do we let LLM Agents touch production systems? How do we mitigate risks when agents would act on their desicions?&#8221;</em></p><p>When you sit down with engineering teams to debug what is genuinely stalling deployment, the issue is rarely that the foundation models are not capable enough. </p><p>We are continuing our series on what breaks when AI agents transition from prototypes to production:<br><br><em><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communication Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail">Part 2: Contract Failure: Why AI Agent Handoffs Fail</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><a href="https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare?r=36xwjn">Part 5: Agent Sprawl: The Hidden Nightmare of Your Next Agent Call</a><br><a href="https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in">Part 6: Decision Blindness: How to Fix &#8220;Decision Blindness&#8221; in AI Agents</a><br><a href="https://newsletter.agentbuild.ai/p/authority-failure-stop-giving-agents">Part 7: Authority Failure: Stop Giving Agents Tools. Start Giving Them Boundaries.</a><br><a href="https://newsletter.agentbuild.ai/p/complexity-failure-the-hidden-cost">Part 8: Complexity Failure: The Hidden Cost of Evaluation Debt in Multi-Agent Systems</a></em></p><p>Today, we look at the final frontier of operational risk: <strong>Commitment Failure</strong>.</p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h3>How an agent creates a duplicate refund</h3><p>A customer opens the banking app on a Tuesday evening. Salary got credited one day late, and the bank charged a $35 overdraft fee. The customer chats with the bank&#8217;s AI assistant.</p><blockquote><p><em>&#8220;I got charged $35 because my salary came one day late. Can you refund it?&#8221;</em></p></blockquote><p>The agent checks the account history and the fee waiver policy. The request looks valid. So it calls a tool:</p><p><code>issue_fee_credit(account_id="9482", amount=35.00)</code></p><p>Now see what happens/ could happen.</p><ol><li><p><strong>The network breaks at the wrong moment.</strong> The core banking system gets the call. It credits $35. But the response times out before it reaches the agent.</p></li><li><p><strong>The agent tries again.</strong> The framework gives the timeout error back to the model. The model thinks the credit did not happen. It plans again.</p></li><li><p><strong>The same write goes twice.</strong> It calls <code>issue_fee_credit(account_id="9482", amount=35.00)</code> one more time.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4SMe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4SMe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 424w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 848w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!4SMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png" width="1456" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172292,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/220828795?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4SMe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 424w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 848w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!4SMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03f20764-19d6-4c04-8dc7-8f150ef8f7a7_2052x1020.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">How the duplicate refund happens</figcaption></figure></div><p>One hour later, the customer logs in and sees two credits of $35.</p><p>For one customer, this is small. Now think of millions of chats where agents have write tools. The same bug can apply a credit limit change two times. It can cancel a subscription that was already cancelled. It can send the same payment twice.</p><p>The engineering team checks the logs. Audit trail is clean. Schema validation passed. Auth tokens are fine. Everything looks correct, and still the money went out twice.<br><br>Damn!</p><div><hr></div><h3>Answering is not same as <em>acting</em></h3><p>The risk of an AI system goes up sharply as it moves through four stages.</p><ul><li><p><strong>Answer:</strong> Gives text, summaries and search results. Failure is hallucination or old data. Small blast radius.</p></li><li><p><strong>Recommend:</strong> Gives options, drafts an email, fills a form for a human to check. Failure is bias, or the human approving without reading. Medium blast radius.</p></li><li><p><strong>Decide:</strong> Checks thresholds and triggers rules on its own. Failure is evaluation debt and errors that spread across agents. High blast radius.</p></li><li><p><strong>Act:</strong> Writes to APIs, ledgers and real systems. Failure is duplicate writes, half-done workflows and side effects you cannot undo. Critical blast radius.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NpKg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NpKg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 424w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 848w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!NpKg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png" width="1456" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/220828795?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NpKg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 424w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 848w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!NpKg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6a4ad3c-ce21-4d76-b55f-6465cb853518_2052x1002.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The four stages of agent risk</figcaption></figure></div><blockquote><p>Many teams are doing one mistake here. They build the Act stage with the same thinking they used for the Answer stage. They give the model a tool like <code>issue_fee_credit()</code> and hope normal exception handling will save them.</p></blockquote><div><hr></div><h3>Why AI agents break the rules idempotency depends on</h3><p>Look, duplicate writes is not a new problem, distributed systems solved it long back.</p><p>The client sends a unique key with every request. The server remembers which keys it has already processed. If a retry comes with the same key, the server returns the old result. It does not run the action again. Payment networks, card schemes and every serious core banking system work like this.</p><p>But this works only on one assumption. The retry must come from the same caller, with the same key. </p><p>AI Agents break this in three ways.</p><ol><li><p><strong>The model becomes the caller.</strong> When a tool call times out, most agent frameworks give the error back to the model. The model plans again and makes a new tool call. New call ID. No memory of the old key. Sometimes even different parameters. The downstream system sees it as a fresh request.<br></p></li><li><p><strong>The tool has no natural key.</strong> <code>issue_fee_credit(account_id, amount)</code> talks about an amount. It does not say which fee is being refunded. So nothing downstream can tell a retry apart from a second genuine request. Most duplicate write risk is coming from the tool design itself. The network failure only exposes it.<br></p></li><li><p><strong>Workflows mix steps you can undo with steps you can&#8217;t.</strong> Say an agent updates a CRM, a payment platform and an internal ledger. That is a saga pattern, whether anyone designed it like one or not. Saga design has always separated three kinds of steps. Some you can reverse, like a credit. Some you can safely retry. And some you can never take back, like an email to a regulator. These last ones are called pivot steps. Agents get all three as normal tools. Nothing makes the pivot step run last.</p></li></ol><p>So the old principles are still working fine. The problem is where we drew the boundary. We put a model that is not deterministic inside the transaction.</p><div><hr></div><h3>Moving the boundary outside the agent</h3><p>The fix is simple to say. The agent decides what should happen. A separate, deterministic layer makes it happen, and only once.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Akn3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Akn3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 424w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 848w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 1272w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Akn3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png" width="1446" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1446,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128168,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/220828795?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Akn3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 424w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 848w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 1272w, https://substackcdn.com/image/fetch/$s_!Akn3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c1be73e-e16e-48d4-83e4-0de6195d80c6_1446x728.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The intent gateway architecture</figcaption></figure></div><p>Let me go through each part.</p><h4>1. Design tools around business events, not amounts</h4><p>The cheapest fix is in the tool schema. Change <code>issue_fee_credit(account_id, amount)</code> to <code>reverse_fee(fee_transaction_id)</code>.</p><p>One fee can be reversed only one time. So the core system itself can reject the second reversal. The amount also comes from the ledger now, not from the model. That is one less thing the model can get wrong.</p><p>If there is no natural business key, the gateway creates one.</p><h4>2. The harness owns the key and the retry</h4><p>The gateway creates the idempotency key when the intent is first saved. The model never creates it. Every attempt to the downstream system carries the same key. Retries happen inside the executor, not inside the model&#8217;s planning loop.</p><p>The executor may send the request more than once. That is fine. The downstream system honours the key, so the action happens once only. This is how you get effectively-once execution.</p><p>What the agent gets back is also important. On a timeout, it should get <code>status: PENDING</code> with an intent ID. It should not get an exception. If the model knows the action is pending, there is nothing to plan again. If you give it a stack trace, it will mostly try again.</p><p>This also changes what the agent tells the customer. It says &#8220;your refund is being processed&#8221;. It does not say &#8220;done&#8221;.</p><p>One more thing. Don&#8217;t make the key from a hash of the payload. Two genuine requests can have the same payload, for example two different $35 fees on the same account. A hash key will quietly drop the second one. And if a parameter changes on retry, the hash also changes, so the duplicate goes through anyway. Use payload similarity only as an alert for near duplicates. Never as the key.</p><h4>3. Track the state no one wants to talk about</h4><p>Every intent goes through clear states. Each change is saved as an event in an append-only log.</p><p><code>STAGED &#8594; VALIDATED &#8594; SUBMITTED &#8594; SETTLED | FAILED | IN_DOUBT</code></p><p>IN_DOUBT is exactly where our refund story landed. The request went out. No response came back. Nobody knows if the core applied it or not. Most agent designs have no state for this. So the model fills the gap by guessing.</p><p>How you resolve IN_DOUBT depends on the downstream system.</p><ul><li><p><strong>It supports idempotency keys.</strong> Send again with the same key. Worst case, you get the old result back.</p></li><li><p><strong>It supports lookup by your reference ID.</strong> Keep checking the status till you get a clear answer.</p></li><li><p><strong>It supports neither.</strong> This is very common with old core systems. Hold the intent. Block any new intent on the same account. Then resolve it through reconciliation with the system of record, usually the end-of-day ledger match. It is slow. But it is honest.</p></li></ul><p>For every system your agent can touch, you must know which case applies. This belongs in the design review. You don&#8217;t want to find it out in the incident review.</p><h4>4. Label every step before you put it in order</h4><p>Before you give an agent a multi-step workflow, label each action. Is it compensatable, retryable or pivot?</p><p>Then the executor enforces the order. Compensatable and retryable steps go first. The pivot step is released only after everything before it is settled.</p><p>The pivot step is where maker-checker comes in. Banks are using this control since decades. The agent prepares the action. A second party approves it before release. That can be a human, or an independent automated check.</p><div><hr></div><h3>Three safeguards to stop Commitment Failure</h3><h4>1. Don&#8217;t provide write access for agents</h4><p>Agents should never write directly to a system of record. They should only create a typed intent. The gateway checks the schema and the policy. A separate executor, with no model inside it, does the actual write.</p><h4>2. Generate keys from the harness, never from the model</h4><p>Every intent gets one key when it is created. The same key goes on every retry. If the model tries the same action again, the gateway sees an open intent for the same business entity. It returns the status. It does not create a new write.</p><h4>3. Send decision to a human for risky actions</h4><p>Some actions cannot be undone. Large payments, data deletion, production deployments, messages to regulators. For these, hold the action in a pending state. Release it only after a human or an independent control approves.</p><p>For lower risk actions, a short hold window can work, say ten minutes. During that window, the action can still be cancelled.</p><div><hr></div><h3>Think about this</h3><p>Before you allow your next agent to write to production, ask your senior engineers this:</p><blockquote><p><em>If our agent sends a duplicate or wrong write during a network failure tomorrow, will we catch it and reconcile it before the customer finds it?</em></p></blockquote><p>If the answer is &#8220;the customer will tell us&#8221; (lol), then the system is not ready. Right now you are depending on hope.</p><p><strong>You have to govern the commitment.</strong></p><div><hr></div><h3>Share your perspective</h3><ul><li><p><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the Reader Survey</a> to shape upcoming deep dives on production agent architectures.</p></li><li><p><a href="https://newsletter.agentbuild.ai/publish/post/https://newsletter.agentbuild.ai/subscribe?">Subscribe to AgentBuild</a> for engineering blueprints delivered weekly.</p></li><li><p><a href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share">Share agentbuild.ai</a> with your technical peers.<br></p></li></ul><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Complexity Failure: The Hidden Cost of Evaluation Debt in Multi-Agent Systems]]></title><description><![CDATA[When a multi-agent decision goes wrong, most teams cannot prove which agent caused it. Every agent you add makes that harder. What do you do?]]></description><link>https://newsletter.agentbuild.ai/p/complexity-failure-the-hidden-cost</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/complexity-failure-the-hidden-cost</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 10 Oct 2026 13:01:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/df438893-df30-427a-b6ad-1d8b4d6077bc_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In almost every architecture review and leadership sync these days, the story is remarkably consistent:</p><p><em>&#8220;The pilot was a huge success. Stakeholders loved the demo. But how do we actually run this reliably in production?&#8221;</em></p><p>When you sit down with engineering teams to debug what is genuinely stalling deployment, the issue is rarely that the foundation models are not capable enough. </p><p>We are continuing our series on what breaks when AI agents transition from prototypes to production:<br><br><em><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communication Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail">Part 2: Contract Failure: Why AI Agent Handoffs Fail</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><a href="https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare?r=36xwjn">Part 5: Agent Sprawl: The Hidden Nightmare of Your Next Agent Call</a><br><a href="https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in">Part 6: Decision Blindness: How to Fix &#8220;Decision Blindness&#8221; in AI Agents</a><br><a href="https://newsletter.agentbuild.ai/p/authority-failure-stop-giving-agents">Part 7: Authority Failure: Stop Giving Agents Tools. Start Giving Them Boundaries.</a></em></p><p>Today, we look at why every agent you add to a pipeline creates an <strong>exponential evaluation problem.</strong></p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h3>Valid payloads hide broken logic</h3><p>Consider a composite scenario drawn from patterns across enterprise deployments:</p><p>A tier-one bank builds an SME lending pipeline orchestrated across four specialized agents:</p><ol><li><p>An <strong>Intake Agent</strong> parses the unstructured application packet and produces an executive summary.</p></li><li><p>A <strong>KYC Agent</strong> ingests that summary to screen company directors against sanctions and registries.</p></li><li><p>A <strong>Credit Agent</strong> scores financial risk based on the KYC confirmation and application data.</p></li><li><p>A <strong>Decision Agent</strong> commits the final approval directly to core banking systems.</p></li></ol><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GMTG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GMTG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!GMTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg" width="1024" height="661" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:661,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114915,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/219179729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc26ce28a-0d70-4af1-b122-4e4b809f266d_1024x765.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GMTG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GMTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7370eb71-8faa-4cc0-854c-ccfcf45fb7b1_1024x661.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 1: Silent Failure vs Evaluated at the seams</figcaption></figure></div><p>During testing, every agent passed its isolated unit tests with flying colors. In runtime, every handoff between them was syntactically correct, schema-validated JSON.</p><p>Deep inside the application pack, a Companies House filing recorded that one of the three founding directors had resigned in March, replaced by an appointed successor. When the Intake Agent generated its 300-token summary, it hallucinated the historical board makeup, listing the original three directors instead.</p><p>From there, the failure cascaded silently:</p><ul><li><p>The KYC Agent screened the three outdated names passed to it and all three returned completely clear.</p></li><li><p>The Credit Agent received a clean KYC clearance and scored the loan as low risk.</p></li><li><p>The Decision Agent stamped the approval and wrote the transaction to the ledger.</p></li></ul><p>Six months later, internal audit sampled the file and asked a fundamental governance question: <em>Why was an enterprise credit facility approved without running compliance checks on the active director?</em></p><p><strong>The engineering team pulled the logs and found the final approval record. What they could not explain was where the truth broke down. </strong></p><p>Every agent returned a status code of 200, no exceptions were thrown, and every schema check passed. In traditional software, broken logic triggers a stack trace or a 500 error staring you in the face. Here, the pipeline failed silently with perfectly formatted output.</p><div><hr></div><h3>The hidden cost of evaluation debt</h3><p>This breakdown illustrates <strong>Evaluation Debt</strong>, the operational deficit teams accumulate when they assume independent agent quality equals systemic reliability.</p><p>The trap lies in treating multi-agent workflows as additive. If Agent A works and Agent B works, teams assume they have two units to evaluate. In practice, agent architectures are multiplicative. Each additional agent introduces <em>seams</em>, and every seam is a boundary where intent and semantic fidelity can degrade without throwing an exception.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fhMs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fhMs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 424w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 848w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 1272w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!fhMs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png" width="1456" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:268328,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/219179729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fhMs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 424w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 848w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 1272w, https://substackcdn.com/image/fetch/$s_!fhMs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4127e146-a115-490b-a8ba-56524b06a6d2_1872x920.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 2: Multi-agent interaction topologies and testability boundaries.</figcaption></figure></div><p>The combinatorial explosion happens quickly across different agent topologies:</p><ul><li><p><strong>Linear Path (A &#8594; B):</strong> 1 seam. Easier to test, though output still varies run to run. You only need to test the single handoff.</p></li><li><p><strong>Full Mesh (Quadratic Growth):</strong> 4 agents create 6 pairs and 12 directed handoffs <em>(n(n-1) directed handoffs)</em>. At 8 agents, that expands to 28 pairs and 56 handoffs, requiring testing across every edge contract.</p></li><li><p><strong>Dynamic Routing (Combinatorial Explosion):</strong> With unconstrained routing across 8 agents over 5 hops <em>(n^k)</em>, execution can branch into roughly 32,768 paths, becoming unbounded once loops have no cap. You cannot test this exhaustively with static datasets.</p></li><li><p><strong>Constrained Orchestration (Bounded by Design):</strong> By routing through a central orchestrator across 4 agents, complexity drops to 4 edge contracts that grow linearly with <em>n</em> rather than <em>n^k</em>. A step budget (e.g., &lt;= 5 steps) caps loops, letting you test edge contracts statically while monitoring paths at runtime.</p></li></ul><p>You cannot construct a static golden test dataset to cover that topology.</p><div><hr></div><h3>Why this lands on the board&#8217;s desk</h3><p>For regulated enterprises, unmonitored agent seams present immediate compliance exposure.</p><p>Model risk committees and regulators do not simply inspect the final decision; they mandate explainability across the entire decision lifecycle. Whether operating under the PRA&#8217;s SS1/23 supervisory statement on model risk management or the EU AI Act&#8217;s traceability and logging requirements, the baseline standard remains identical: <strong>you must demonstrate the precise chain of custody behind automated outcomes.</strong></p><p>A testing harness that evaluates only final model responses cannot satisfy these requirements. If you cannot produce auditable runtime signals from every intermediary hop, the pipeline is fundamentally unscalable.</p><div><hr></div><h3>Engineering the solution: evaluate the <em>seams</em></h3><p>To guarantee runtime visibility, organizations must deploy an <strong>Evaluation Graph</strong>: continuous quality verification running at every seam, stitched together by a shared correlation identifier.</p><p>Three architectural controls make this operational:</p><h4>1. Enforce typed fact preservation over raw summaries</h4><p>Schema validation guarantees only structural compliance; it tells you nothing about semantic truth. Identify the core facts that dictate business outcomes, such as director registries, beneficial ownership thresholds, and risk factors, and isolate them into strongly typed fields extracted directly from authoritative sources. Assert at every hop that these typed fields remain immutable. If a director list drifts between intake and screening, the run aborts immediately.</p><h4>2. Stage state changes and define compensating actions</h4><p>Autonomous agents should rarely execute irrevocable writes to core databases. Where possible, decouple intermediate operations from state modifications, staging writes until upstream validations pass. Where immediate operations are required, implement idempotency keys to guard against duplicate execution on retries, and mandate pre-configured compensating transactions (rollbacks) for every mutation.</p><h4>3. Pair runtime determinism with offline model judges</h4><p>Do not inspect agent handoffs at runtime using secondary LLM evaluations. Stacking model calls in the critical path introduces compounding latency, cost, and non-deterministic error rates.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zydH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zydH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zydH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zydH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zydH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!zydH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg" width="991" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:991,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124463,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/219179729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99a8dacc-c17d-4514-928a-e21211e861a4_1024x765.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zydH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zydH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zydH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zydH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef8fc7ef-3181-4349-b602-0d3fbe7fcee1_991x680.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 3: Anatomy of an evaluated seam</figcaption></figure></div><p></p><p>Use standard software assertions at runtime:</p><ul><li><p>Deterministic business logic and hard schema boundaries.</p></li><li><p>PII tokenisation and compliance filters.</p></li><li><p>Citation verification that proves claims resolve to stored vectors.</p></li></ul><p>Reserve model-graded evaluations for asynchronous, offline inspection across sampled execution traces.</p><p>Underpinning these three controls is a single, non-negotiable requirement: <strong>a distributed trace ID passed across every prompt, vector lookup, tool execution, and state change.</strong> Without a shared trace context, your engineers spend outages guessing across disconnected log files. With it, a team can isolate a data corruption event to a specific hop in seconds.</p><p>Read more about Evaluation Graph here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;8bc3c16c-6e77-46f8-9230-27db9dea2826&quot;,&quot;caption&quot;:&quot;Picture yourself in a restaurant where the menu changes daily. You order &#8220;the soup.&#8221; The chef makes whatever&#8217;s on today&#8217;s board. After few hours you&#8217;re not feeling great, and you go back and ask what was in the soup. The waiter pulls your order slip. It says &#8220;soup.&#8221; And yes, the kitchen did make the soup. But nobody wrote down which soup, made with what&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Context Graph vs Evaluation Graph&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-27T09:59:32.110Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ab3800f-88ac-403b-8933-fdebb3e97fb9_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/context-graph-vs-evaluation-graph&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:203809402,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:2,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h3>The lending flow with seams evaluated</h3><p>Consider how that same lending pipeline behaves when evaluated at the seams:</p><ol><li><p><strong>Intake:</strong> The Intake Agent extracts the director registry from the official filing into a typed field separate from the narrative context. A deterministic preservation assertion compares the extraction against the source document, flags the resignation discrepancy, and halts the pipeline at hop one. No screening executes, no database state changes, and the task routes to an underwriter with the trace context attached.</p></li><li><p><strong>KYC Verification:</strong> If the extraction passes, the KYC Agent must explicitly declare which entities it verified. A runtime rule cross-checks that output against the ingested typed fields. Any discrepancy halts downstream progression.</p></li><li><p><strong>Credit Verification:</strong> The scoring model must demonstrate that its inputs align with upstream facts rather than ungrounded narrative text.</p></li><li><p><strong>Staged Commitment:</strong> The Decision Agent writes to the core ledger only after every upstream verification on the trace context passes.</p></li></ol><p>When internal audit reviews the transaction six months later, the platform team does not present an opaque log dump. They present a complete, multi-hop audit trail documenting what was asserted, when it was verified, and the exact evidence that supported the decision.</p><div><hr></div><h3>Cap the autonomy surface area</h3><p>Unbounded agent autonomy translates directly into an unmanageable evaluation perimeter.</p><p>This is why architectures must move to <strong>Constrained Orchestration</strong> (as shown in Figure 2). Do not allow agents to dynamically select downstream tools or decide next steps without rigid boundaries. Enforce deterministic state transitions at the orchestration layer, restrict autonomous execution paths, and set a hard step budget (e.g., &lt;= 5 steps). By pairing static edge testing with runtime evaluation and tracing on the path taken, the evaluation footprint stays bounded by design.</p><div><hr></div><h3>Implementation playbook: where to start</h3><p>You do not need to pause production development to fix runtime visibility. Begin with a single critical workflow:</p><ol><li><p><strong>Target high blast-radius flows:</strong> Identify workflows where errors incur material regulatory or financial cost, primarily flows that commit writes to systems of record.</p></li><li><p><strong>Map intermediate handoffs:</strong> Diagram every explicit and implicit boundary between models, retrieval steps, and APIs.</p></li><li><p><strong>Isolate ground-truth facts:</strong> Convert narrative dependencies into strongly typed, immutable schemas enforced across hops.</p></li><li><p><strong>Implement correlation IDs before scaling:</strong> Standardise on OpenTelemetry-compatible tracing across the entire pipeline before onboarding additional agents.</p></li><li><p><strong>Replay historical production traffic:</strong> Run a sampled dataset of prior production runs against your new boundary assertions to quantify existing Evaluation Debt.</p></li></ol><div><hr></div><h3>The operational litmus test</h3><p>Before authorizing your next multi-agent release into production, present your engineering leadership with a direct question:</p><blockquote><p><em>If this agent system produces an ungrounded or non-compliant outcome in front of an enterprise client tomorrow, can we trace the exact failure hop within two minutes using deterministic evidence?</em></p></blockquote><p>If the answer requires manually aggregating disjointed log files, observability is not an item for the backlog. It is your primary operational risk.</p><p>You have to evaluate the seams.<br><br><em><strong>Next week: </strong>The risk changes dramatically as an agent moves from <strong>answer &#8594; recommend &#8594; decide &#8594; act</strong>. What do you do about it?</em></p><div><hr></div><h3>Share your perspective</h3><ul><li><p><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the Reader Survey</a> to shape upcoming deep dives on production agent architectures.</p></li><li><p><a href="https://newsletter.agentbuild.ai/publish/post/https://newsletter.agentbuild.ai/subscribe?">Subscribe to AgentBuild</a> for engineering blueprints delivered weekly.</p></li><li><p><a href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share">Share agentbuild.ai</a> with your technical peers.<br></p></li></ul><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Authority Failure: Stop Giving Agents Tools. Start Giving Them Boundaries.]]></title><description><![CDATA[Design production agents around explicit identity, least-privilege permissions and enforceable action policies. So they can operate usefully without exceeding their authority.]]></description><link>https://newsletter.agentbuild.ai/p/authority-failure-stop-giving-agents</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/authority-failure-stop-giving-agents</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sun, 27 Sep 2026 11:24:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/adc56216-dee3-42a3-b939-937b58068758_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>We&#8217;re continuing our series on what really breaks when AI agents move from demos to production.<br><br><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communication Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 2: Contract Failure: Why AI Agent Handoffs Fail</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><a href="https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare?r=36xwjn">Part 5: Agent Sprawl: The Hidden Nightmare of Your Next Agent Call</a><br><a href="https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in">Part 6: Decision Blindness: How to Fix &#8220;Decision Blindness&#8221; in AI Agents</a><br><br>Today, we&#8217;re tackling a critical risk in agent design: the gap between what an agent can do and what it is authorised to do.</em></p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>A common mistake in agentic implementations is confusing technical execution with enterprise authorisation. Just because an LLM has the technical capability to output a function call doesn&#8217;t mean the agent has the entitlement to actually perform the action. If we treat &#8220;the model can invoke this function&#8221; as equivalent to &#8220;the agent is authorised to perform this action&#8221;, we confuse capability with authority and create a path from a mistaken or manipulated response to a real-world consequence.</p><blockquote><p>If you are building production agents, the design question is not simply <em>which tools should we connect?</em> It is <em>under what conditions may this agent perform this specific action, for this user, on this resource, right now?</em></p></blockquote><div><hr></div><h3>The tool list is not the policy</h3><p>A common architecture exposes a set of functions to an agent: search a knowledge base, read a customer record, issue a refund, update a case, send an email. The model chooses which function to call and supplies its arguments.</p><p>That is a useful interaction pattern, but not an authorisation model.</p><p>The model may be wrong. It may misread the user&#8217;s intent, act on stale context, or be steered by instructions hidden in a document, email or tool response. <a href="https://genai.owasp.org/llmrisk/llm062025-excessive-agency/">OWASP</a> describes &#8220;excessive agency&#8221; as the risk that unexpected, ambiguous or manipulated model outputs trigger damaging actions. It identifies three recurring causes: </p><ul><li><p>excessive functionality</p></li><li><p>excessive permissions</p></li><li><p>excessive autonomy</p></li></ul><p>Consider a customer-service agent that can look up orders and issue refunds. A request to <em>&#8220;sort this out&#8221;</em> might reasonably lead the agent to inspect an order, but it should not automatically give the agent authority to refund the full purchase price. The model&#8217;s judgement can help interpret the request; it should not be the final authority on whether the action is permitted.</p><div><hr></div><h3>Define authority as a boundary</h3><p>A robust design separates the agent&#8217;s ability to propose an action from the system&#8217;s decision to authorise and execute it.</p><p>Before a tool call reaches a business system, evaluate it against explicit constraints:</p><ul><li><p><strong>Agent identity:</strong> Which registered agent is making the request, and what is it intended to do?</p></li><li><p><strong>User context:</strong> Who initiated the task, and what may that person do?</p></li><li><p><strong>Action and resource:</strong> Is this agent allowed to perform this operation on this specific record or account?</p></li><li><p><strong>Conditions:</strong> Are the request, value, status, location, time or other relevant attributes within policy?</p></li><li><p><strong>Approval:</strong> Does the action require a person to review and approve it before execution?</p></li></ul><p>The exact policy will vary by use case, but the principle is consistent: authority must be checked for the action and not inferred from the fact that a tool is available.</p><p>This distinction is becoming a more explicit part of the agent-security conversation. <a href="https://www.nist.gov/artificial-intelligence/ai-agent-standards-initiative">NIST&#8217;s AI Agent Standards Initiative</a> identifies agent authentication and identity infrastructure as areas of research, and points to work on identity and authorisation for enterprise agents.</p><div><hr></div><h3>Make the tools narrower</h3><p>A broad tool gives the agent room to do more than the task requires. A function such as <code>run_sql(query)</code> or <code>execute_shell(command)</code> is flexible, but flexibility expands the set of possible actions and the consequences of misuse.</p><p>Prefer tools that express a specific business operation:</p><ul><li><p>Instead of arbitrary SQL, provide <code>get_order_status(order_id)</code>.</p></li><li><p>Instead of a general email interface, provide <code>draft_reply(case_id)</code>.</p></li><li><p>Instead of <code>update_customer_record(fields)</code>, expose a narrowly scoped operation such as <code>update_delivery_preference(customer_id, preference)</code>.</p></li></ul><p>This does not make the model infallible. It reduces the damage a bad decision can cause. OWASP recommends limiting extensions to what is necessary, avoiding open-ended functions where possible, and enforcing minimum permissions in the downstream system.</p><blockquote><p>A practical test is: <em>If an attacker-controlled instruction reached the agent, what is the most damaging thing the exposed tools would let it do?</em> If the answer includes actions unrelated to the agent&#8217;s purpose, the tool boundary is too broad.</p></blockquote><div><hr></div><h3>Check every action, in the right context</h3><p>Tool access should not be a one-time decision made when a session starts. Each invocation should be authorised against the current request, identity, resource and policy.</p><p>Where an agent acts on behalf of a user, preserve that user&#8217;s security context downstream. A shared service identity with broad access can silently turn a user-scoped task into an organisation-wide privilege. Instead, rely on user-delegated scoped tokens or implement mechanisms like RFC 8693 (OAuth 2.0 Token Exchange) to pass the initiating user&#8217;s precise context securely to the downstream service.</p><p>And do not rely on the model to decide whether it is allowed to act. Put the authorisation check in the tool service, API gateway, or downstream application. Architecting this component as a strict Policy Enforcement Point (PEP) backed by a Policy Decision Point (PDP), such as Open Policy Agent or Cedar. This ensures you have a component that enforces the rule regardless of what the model says. OWASP calls this &#8220;complete mediation&#8221;: validate requests against policy at the point where they reach the protected system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BL_W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BL_W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 424w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 848w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 1272w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!BL_W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png" width="1693" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1693,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1615826,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/217650613?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83c54598-421d-40f8-82bc-615d79df1582_1693x929.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BL_W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 424w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 848w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 1272w, https://substackcdn.com/image/fetch/$s_!BL_W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff356abea-2853-46ed-8bb6-99e6f6966873_1693x819.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Practical flow diagram of &#8220;complete mediation&#8220; of agent actions</figcaption></figure></div><p>In practice, the flow might look like this:</p><ol><li><p>The agent proposes an action and supplies structured arguments.</p></li><li><p>The action service authenticates the agent and establishes the initiating user&#8217;s context.</p></li><li><p>A policy check evaluates the operation, target resource and relevant conditions.</p></li><li><p>The service denies, permits or routes the action for approval.</p></li><li><p>The downstream system enforces its own permissions when the operation executes.</p></li></ol><p>The model can initiate this flow and it should not be able to bypass it.</p><div><hr></div><h3>Treat approval as an execution gate</h3><p>&#8220;Ask the user to confirm&#8221; is not enough if the model can still call the tool without confirmation. A meaningful approval gate is enforced outside the model&#8217;s control and tied to the specific action being approved.</p><p>For example, an approval request should make clear exactly what will happen: which customer or record is affected, what value will change, and what the result is expected to be. Beware of state drift and the classic TOCTOU (Time-of-Check to Time-of-Use) vulnerability. If the agent modifies the proposed action after the human approves it, or if the underlying context changes, the authorisation must be evaluated again. To prevent this, tie approved actions to cryptographic hashes of the payload or require signed execution tokens to guarantee that the action executed is identical to the action approved.</p><p>Not every action needs a human in the loop. A low-impact, reversible update may be handled automatically within a clear policy. A high-impact or difficult-to-reverse action may require approval. The decision should be based on the consequences and risk of the operation, not on a blanket assumption that either all autonomy is safe or none of it is.</p><div><hr></div><h3>Log the decision, not just the call</h3><p>A tool log that says &#8220;agent called <code>issue_refund</code>&#8221; is a start, but it does not explain whether the action was authorised or why.</p><p>For each decision, record enough to reconstruct the event: the agent and user identities, the requested action and target, the policy decision, any approval, the downstream result and the relevant correlation identifiers. Keep sensitive information within your retention and access policies, but make the authorisation path investigable.</p><p>Monitoring and rate limits can help detect or contain unwanted activity. They are useful safeguards, but they do not replace preventative controls: once an unauthorised write has happened, a log can show what went wrong without undoing it. </p><div><hr></div><h3>A production question worth asking</h3><p>When reviewing an agent design, do not stop at &#8220;Which tools can it call?&#8221; Ask:</p><blockquote><p>What boundary prevents this agent from taking an action that is outside its authority, even when the model is mistaken, the input is adversarial, or the tool call is technically valid?</p></blockquote><p>You cannot just have this information in the system prompt, that&#8217;s just an instruction, not an enforcement boundary.</p><p>Agents will need capabilities to be useful. But capability should be granted narrowly, authority should be checked per action, and consequential operations should have controls the model cannot bypass. </p><p>Ultimately the goal is not to make agents powerless. It is to make their power explicit, scoped and enforceable.</p><div><hr></div><p>How are you defining authority for the agents you&#8217;re building? Share the boundary you&#8217;ve found hardest to design: identity, permissions, approvals or execution, and what you&#8217;re doing to make it enforceable.</p><p></p><p>Thanks for reading,<br>Sandi.<br><br><em><strong>Next week:</strong> We will talk about the Complexity of the Evaluation Surface Area.</em></p><div><hr></div><p><strong>One request:</strong><br><br>Please take the survey.<br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Fix "Decision Blindness" in AI Agents]]></title><description><![CDATA[Traditional event logs only tell you what your system did. Here is how to use decision traces to capture the context, evidence, and logic behind why it made a choice.]]></description><link>https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/how-to-fix-decision-blindness-in</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 19 Sep 2026 13:03:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ca9fb558-38ec-4fbe-ac64-374f9b7a02fe_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>We&#8217;re continuing our series on what really breaks when AI agents move from demos to production. <br><br><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communcation Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 2: Contract Failure: Why AI Agent Handoffs Fails</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><a href="https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare?r=36xwjn">Part 5: Agent Sprawl: The Hidden Nightmare of Your Next Agent Call</a><br><br>Today, we are tackling the direct consequence of the agent sprawl: <strong>Decision Blindness</strong>.</em></p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>When you have multiple agents talking to each other, passing data, and executing tasks, you eventually hit a deeply uncomfortable moment. Nope, it&#8217;s not when the system crashes, crashing is easy to debug. It&#8217;s when the system <em>succeeds</em>, and absolutely nobody in the room can explain why. Trust me, it happens a lot.</p><p>Let&#8217;s say a customer gets approved for a loan, or an automated fraud investigation escalates a case. You open your observability dashboard, and technically, everything looks perfect. The agent called a model, retrieved some documents, fired off a few tools, and returned a result. </p><p>But then a compliance officer taps you on the shoulder and asks, </p><p>&#8220;Why did the AI make that decision?&#8221; </p><p>And no one in the team knows why.</p><p>I call this <strong>decision blindness</strong>. Your logs are telling you exactly what happened, but you have absolutely no idea why. To fix it, we have to rethink how we monitor these systems from the ground up.</p><div><hr></div><h2>Standard telemetry has limitations</h2><p>When we start building agentic systems, we naturally reach for conventional software observability. We track the standard APM (Application Performance Monitoring) metrics: model calls, API requests, token usage, and latency. That&#8217;s a great baseline, but a decision is fundamentally more than a sequence of network events.</p><p>Imagine an agent deciding whether to approve a customer request. Your event log might show that it retrieved a customer profile, pulled a policy document, called an LLM, and approved the request. You can see the execution pathway clearly, but the reasoning context is completely hidden. </p><ul><li><p>Which specific facts about that customer actually triggered the approval? </p></li><li><p>What alternative choices did the agent weigh before it crossed the threshold to act? </p></li></ul><blockquote><p>Traditional event logs tell you what the infrastructure did, whereas a decision trace tells you how the system actually arrived at its conclusion.</p></blockquote><div><hr></div><h2>Agents break traditional tracing</h2><p>In traditional software, execution is deterministic enough that we can trace a decision straight through the code. If condition A is true, the system executes branch B. You can read the logic like a map.</p><p>Agents simply don&#8217;t work like that. Their decisions emerge from a messy, highly dynamic interaction between context, retrieved data, shifting policies, tool outputs, and the models themselves. All of those variables can change independently. The underlying foundation model might get an unseen update, your vector database might return slightly different context due to a new embedding, or a policy document might be rewritten. Because of this fluidity, just recording the final answer and the API calls isn&#8217;t enough. You have to capture the exact state of the world at the exact moment the decision was made.</p><div><hr></div><h2>Architecting a decision trace</h2><p>A useful way to solve this is to treat every consequential agent decision as something that produces a structured trace. Instead of just tracking timestamps and API spans, you track the flow of logic.</p><p>The architecture of a good decision trace looks like this: Decision, Evidence, Context, Policy, Actions, and finally, the Outcome.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kpGT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kpGT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!kpGT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg" width="2694" height="1339" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1339,&quot;width&quot;:2694,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:491228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/216346546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90efd413-0d69-438c-bc32-dd4abadf1077_2752x1536.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kpGT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kpGT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4606853-9bb2-414e-8462-beeb40d358bb_2694x1339.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Simplified Decision Tracing Architecture</em></figcaption></figure></div><p>So, if an agent declines a transaction, the trace shouldn&#8217;t just record a &#8220;Declined&#8221; state in the database. It should explicitly show that it declined the transaction because of an unusual amount and a geographic inconsistency (<strong>the evidence</strong>), based on the current account state (<strong>the context</strong>), using Fraud Policy v3.8 (<strong>the constraints</strong>), after querying the transaction history and a sanctions API (<strong>the actions</strong>). Now you have a tangible, serialized record that another engineer, an auditor, or an investigator can actually reconstruct.</p><p>For a deeper dive read this article:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;8c10af95-9cd8-495c-b396-369a631dd0b8&quot;,&quot;caption&quot;:&quot;Hey everyone,&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Decision Traces: The Missing Black Box &#9992;&#65039; for AI Agents&quot;,&quot;publishedBylines&quot;:[],&quot;post_date&quot;:&quot;2026-04-18T13:31:15.873Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d180d4d2-5f06-49f5-986e-d83ffdedf651_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/decision-traces-the-missing-black&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:194595643,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>RAG has a provenance problem</h2><p>I have seen this technical trap here that caught me off guard a number of times, especially when using Retrieval-Augmented Generation (RAG). Suppose your agent outputs a note saying, <em>&#8220;The customer appears to have breached policy X.&#8221;</em> Where exactly did that conclusion come from?</p><p>If the agent pulled that from a retrieved document, you need absolute provenance. You need to log the document ID, the exact version hash of that document, the specific chunk that was retrieved, and the timestamp. Without this kind of provenance, your evidence is basically ephemeral. Six months from now, you might still have the agent&#8217;s answer saved, but if that policy document has been updated three times since then, you&#8217;ll have no reliable way to prove what information the agent was actually looking at when it made the call. For production AI in regulated environments, that missing link is a massive liability.</p><div><hr></div><h2>How to implement this - few tricks</h2><p>So, how do you practically wire this up? You don&#8217;t need to invent a new database, but you do need to change how you prompt your models and how you pass data.</p><p><strong>1. Force structured outputs.</strong> Stop letting your agents reply with free-text paragraphs. Instead, force the LLM to return a rigid JSON object for every significant move. Alongside the final <code>action</code>, require fields for <code>evidence_used</code>, <code>policy_version</code>, and <code>alternative_rejected</code>. By making the model explicitly output its dependencies, you instantly generate the data for your decision trace right at the source.</p><p><strong>2. Leverage OpenTelemetry &#8220;baggage.&#8221;</strong> When Agent A (the Researcher) finds a piece of evidence and passes the job to Agent B (the Executor), that evidence needs to travel with the request. Use standard distributed tracing features like <strong>OpenTelemetry baggage</strong> to pass this reasoning context along the chain. That way, when the final Executor agent makes a move, your trace contains the entire inherited history of <em>why</em>.</p><p><strong>3. Hijack your LLM observability tools.</strong> Platforms like LangSmith, Langfuse, Braintrust, or Datadog LLM are great for capturing prompts and latencies. But don&#8217;t just use their defaults. Push your structured decision JSON into their custom metadata tags. You want to be able to query your dashboard for <em>&#8220;Show me all decisions where Fraud Policy v3.8 was applied,&#8221;</em> not just <em>&#8220;Show me traces that took longer than 2 seconds.&#8221;</em></p><div><hr></div><h2>Evaluating integrity over outcomes</h2><p>To be clear, I&#8217;m not suggesting we need to capture the model&#8217;s private, rambling chain-of-thought. We don&#8217;t need a massive text dump of the LLM talking to itself in the logs. What we really need is a structured, machine-readable record of the decision pathway.</p><p>This shift changes how we evaluate agents entirely. Right now, most evals just ask if the final answer was correct, which only measures outcome correctness. With decision traces, we can finally start asking if the agent arrived at that decision using acceptable evidence, authorized policies, and permitted actions. We can measure decision integrity. An agent can stumble into the right answer using completely hallucinated policies, and if you&#8217;re only checking the final output, you&#8217;d never know your system is hallucinating its logic.<br><br>Read my article below where I talk about Evaluation Graph:</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:193583020,&quot;url&quot;:&quot;https://contextandchaos.substack.com/p/context-graphs-as-ai-evaluation-infrastructure&quot;,&quot;publication_id&quot;:585908,&quot;embedding_publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;Context &amp; Chaos&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!q3WY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d54bd2c-07b0-430f-9c05-9c349d9bf3d0_300x300.png&quot;,&quot;title&quot;:&quot;Context Graphs as AI Evaluation Infrastructure&quot;,&quot;truncated_body_text&quot;:&quot;About the Author: Sandipan Bhaumik have spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, he shares how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;date&quot;:&quot;2026-04-09T14:05:59.146Z&quot;,&quot;like_count&quot;:20,&quot;comment_count&quot;:2,&quot;bylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;handle&quot;:&quot;sanbhaumik&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;profile_set_up_at&quot;:&quot;2023-12-29T14:48:55.893Z&quot;,&quot;reader_installed_at&quot;:&quot;2024-02-15T19:29:15.029Z&quot;,&quot;is_guest&quot;:true,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:null,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:null,&quot;subscriber&quot;:null},&quot;primaryPublicationId&quot;:2211527,&quot;primaryPublicationName&quot;:&quot;agentbuild.ai&quot;,&quot;primaryPublicationUrl&quot;:&quot;https://newsletter.agentbuild.ai&quot;,&quot;primaryPublicationSubscribeUrl&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;,&quot;source&quot;:null}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://contextandchaos.substack.com/p/context-graphs-as-ai-evaluation-infrastructure?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web&amp;embedding_publication_id=2211527"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!q3WY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d54bd2c-07b0-430f-9c05-9c349d9bf3d0_300x300.png" loading="lazy"><span class="embedded-post-publication-name">Context &amp; Chaos</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Context Graphs as AI Evaluation Infrastructure</div></div><div class="embedded-post-body">About the Author: Sandipan Bhaumik have spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, he shares how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">7 months ago &#183; 20 likes &#183; 2 comments &#183; Sandipan Bhaumik</div></a></div><div><hr></div><h2>The Multi-Agent cascading failure</h2><p>Take this exact problem and scale it up to a multi-agent architecture where you have a Planner, a Researcher, an Analyst, and an Executor all working together. The Executor makes the final call, but which agent introduced the critical piece of evidence? Which one decided to discard a valid constraint, and where did a flawed assumption enter the pipeline?</p><p>Traditional distributed tracing tools like Jaeger or OpenTelemetry will gladly tell you that Agent A called Agent B, and how many milliseconds it took. It won&#8217;t tell you that Agent A&#8217;s decision was based on stale evidence that Agent B then treated as indisputable fact. That is the dangerous gap between workflow observability and decision observability.</p><p>Ultimately, we need to change the fundamental question we ask when designing these systems. Don&#8217;t just ask if you can see what the agent did. Ask if you can reconstruct why it happened. A bad decision is highly visible, but decision blindness is silent. Having a log that just reads &#8220;LLM call, tool call, response&#8221; isn&#8217;t true observability. It&#8217;s just a receipt. And when a serious audit comes around, a receipt isn&#8217;t going to save you.</p><div><hr></div><h2>Stop printing receipts</h2><p>Ultimately, we need to change the fundamental question we ask when designing these systems. The next time you&#8217;re reviewing a new agent architecture with your team, don&#8217;t just ask, <em>&#8220;Can we see what the agent did?&#8221;</em> </p><blockquote><p>Ask, <em>&#8220;Can we prove exactly why it did it?&#8221;</em></p></blockquote><p>A bad decision in production is highly visible. The business usually feels it immediately. But decision blindness is silent. It sits hidden in your system, just waiting for the worst possible moment - an audit, a customer complaint, a compliance review to reveal that nobody actually knows how your AI works.</p><p>Having an observability dashboard that just reads &#8220;LLM call -&gt; tool call -&gt; response&#8221; isn&#8217;t true observability. It&#8217;s just a receipt. It tells you the transaction happened, but it tells you absolutely nothing about the logic behind the purchase. And when a serious audit comes around, a receipt isn&#8217;t going to save you.</p><div><hr></div><p><strong>One request:</strong><br><br>Please take the survey.</p><p><br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thanks for reading,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent Sprawl: The Hidden Nightmare of Your Next Agent Call]]></title><description><![CDATA[Think adding another AI agent will solve your workflow problems? Think again. We explore the hidden nightmare of "agent sprawl" and the four boundaries you must verify before scaling up.]]></description><link>https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/agent-sprawl-the-hidden-nightmare</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 12 Sep 2026 13:03:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/017978e4-7e54-4baf-8fce-b8c972f0a2f5_1792x1002.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>We&#8217;re continuing our series on what really breaks when AI agents move from demos to production. <br><br><a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication?r=36xwjn">Part 1: Communcation Failure: Why Agent-to-Agent Communication Fails</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 2: Contract Failure: Why AI Agent Handoffs Fails</a><br><a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its?r=36xwjn">Part 3: Context Failure: Your Agent Isn&#8217;t Hallucinating&#8230;</a><br><a href="https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just?r=36xwjn">Part 4: Evaluation Failure: Evaluating AI Agent Handoffs</a><br><br>Today in we explore <strong>Agent Sprawl</strong> - why using too many agents become a nightmare.</em></p><div class="callout-block" data-callout="true"><p style="text-align: center;"><em>&#128073; <strong>Request</strong>: I'd love to hear from you. Take the short survey at the bottom of this article and tell me what you'd like to learn more about.</em></p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>There is a moment in almost every agent architecture where the diagram starts looking impressive.</p><p>It begins simply:</p><div class="callout-block" data-callout="true"><p>User &#8594; Agent &#8594; Tools</p></div><p>Then someone asks:</p><p>&#8220;What if we add a planner?&#8221;</p><p>So it becomes:</p><div class="callout-block" data-callout="true"><p>User &#8594; <strong>Planner</strong> &#8594; Agent &#8594; Tools</p></div><p>Then:</p><p>&#8220;What if we add a researcher?&#8221;</p><p>Now we have:</p><div class="callout-block" data-callout="true"><p>Planner &#8594; <strong>Researcher</strong> &#8594; Analyst &#8594; Executor</p></div><p>Then someone adds a critic.</p><p>Then a reviewer.</p><p>Then a verifier.</p><p>Before long, the architecture looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6kQG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6kQG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!6kQG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg" width="2669" height="1301" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1301,&quot;width&quot;:2669,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:496992,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/215340520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fc4f785-2166-45f6-978b-2af80483e526_2814x1536.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6kQG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6kQG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71fb252c-7f74-49b7-9396-a18d5422de7a_2669x1301.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The sophisticated Agentic Workflow Arechitecture on a slide Deck <em>(often created using AI nowadays)</em></figcaption></figure></div><p>It looks sophisticated.</p><p>It looks like a system built for serious work.</p><p>But there is an uncomfortable question we don&#8217;t ask often enough:</p><blockquote><p><strong>Did we actually make the system better?</strong></p></blockquote><p>Or did we just create six systems we now have to operate?</p><div><hr></div><h2>Every agent is another boundary</h2><p>Adding an agent doesn&#8217;t just add another capability.</p><p>It adds another <strong>system boundary</strong>.</p><p>And every boundary creates work.</p><p>A new agent usually means:</p><ul><li><p>another context boundary</p></li><li><p>another handoff</p></li><li><p>another interface</p></li><li><p>another failure mode</p></li><li><p>another thing to evaluate</p></li><li><p>another component to observe</p></li><li><p>another source of latency</p></li><li><p>another source of cost</p></li></ul><p>And the problem compounds.</p><p>Imagine a simple workflow:</p><div class="callout-block" data-callout="true"><p>Agent A &#8594; Agent B &#8594; Agent C</p></div><p>Agent A produces something that B needs to understand.</p><p>B transforms it and passes something to C.</p><p>Now suppose A is changed.</p><p>The output changes slightly.</p><p>B still works.</p><p>Its own evaluation still passes.</p><p><strong>But C starts failing because B&#8217;s interpretation of A&#8217;s output has changed.</strong></p><p>Nothing is necessarily &#8220;broken&#8221; inside any individual agent.</p><p>The <strong>boundary</strong> is broken.</p><p>This is exactly the kind of problem we&#8217;ve spent decades dealing with in distributed systems.</p><p>Except now the components aren&#8217;t deterministic services.</p><p>They are probabilistic systems interpreting language, context and intent.</p><p>That&#8217;s a very different kind of boundary.</p><div><hr></div><h2>Agent Sprawl</h2><p>This is <strong>Agent Sprawl</strong>.</p><p>It is the tendency to turn every capability into another autonomous agent without first proving that the boundary adds value.</p><blockquote><p>It is the agent equivalent of creating a microservice for every function in a codebase.</p></blockquote><p>Microservices taught us an important lesson:</p><p><strong>Decomposition is not automatically architecture.</strong></p><p>You don&#8217;t create a service because you just can.</p><p>You create one because a boundary gives you something valuable.</p><p>Perhaps it gives you:</p><ul><li><p>independent scaling</p></li><li><p>independent deployment</p></li><li><p>ownership</p></li><li><p>security isolation</p></li><li><p>fault isolation</p></li><li><p>a different data lifecycle</p></li></ul><p>The same principle should apply to agents.</p><p>The question should be:</p><blockquote><p><strong>&#8220;What boundary does making this another agent give us?&#8221;</strong></p></blockquote><div><hr></div><h2>Not every role needs to be an agent</h2><p>Consider a research workflow.</p><p>You might design it as:</p><div class="callout-block" data-callout="true"><p>Planner &#8594; Researcher &#8594; Analyst &#8594; Critic &#8594; Reviewer &#8594; Writer</p></div><p>That&#8217;s six agents.</p><p>But perhaps the actual requirements are much simpler.</p><p>The planner might just be a structured planning step.</p><p>The researcher might be a tool-calling capability.</p><p>The critic might be an evaluation step.</p><p>The reviewer might be a deterministic validation process.</p><p>And perhaps only the analyst and writer actually need autonomous reasoning.</p><p>Suddenly the architecture becomes:</p><div class="callout-block" data-callout="true"><p>Planner (strutured code) &#8594; Researcher (tool call) &#8594; <strong>Analyst</strong> &#8594; Critic (Eval)&#8594; Reviewer (coded validation) &#8594; <strong>Writer</strong></p></div><p>That&#8217;s not necessarily less sophisticated.</p><p>It may be <strong>more engineered</strong>.</p><blockquote><p>The mistake is assuming that every logical role in a workflow deserves an autonomous identity.</p></blockquote><p>A function isn&#8217;t automatically an agent.</p><p>A prompt isn&#8217;t automatically an agent.</p><p>A tool isn&#8217;t automatically an agent.</p><p>A validation step certainly doesn&#8217;t need to become an agent just because an LLM could perform it.</p><p>The best agent architecture usually has fewer AI agents.</p><div><hr></div><h2>So when should you create another agent?</h2><p>I use a simple test.</p><p>A new agent should introduce at least one meaningful boundary.</p><p>The following framework helps:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!su03!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!su03!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 424w, https://substackcdn.com/image/fetch/$s_!su03!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 848w, https://substackcdn.com/image/fetch/$s_!su03!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!su03!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!su03!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg" width="2665" height="1309" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1309,&quot;width&quot;:2665,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:598004,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/215340520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f1ad7e-5a7b-4980-9837-8e5c59a2362e_2816x1536.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!su03!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 424w, https://substackcdn.com/image/fetch/$s_!su03!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 848w, https://substackcdn.com/image/fetch/$s_!su03!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!su03!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08773d9b-7565-49a7-b817-86394b85230c_2665x1309.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Decision Framework to control Agent Sprawl in a Multi-Agent Workflow.</figcaption></figure></div><h4>1. Capability boundary</h4><p>The new agent does something fundamentally different from the existing agent.</p><p>For example, a specialised coding agent may have different reasoning patterns, tools and execution environments from a customer-service agent.</p><h4>2. Data boundary</h4><p>The new agent operates on a different data domain or requires different access.</p><p>For example, separating customer-facing reasoning from an internal risk-data environment may be a meaningful boundary.</p><h4>3. Authority boundary</h4><p>The new agent has a different level of permission.</p><p>An agent that recommends a transaction and an agent that can actually execute it may need to be separate because their authority is fundamentally different.</p><h4>4. Failure-isolation boundary</h4><p>The new agent can fail independently without taking down the rest of the workflow.</p><p>This can be particularly valuable for expensive or unpredictable operations.</p><p>If creating the agent doesn&#8217;t give you one of these boundaries, ask yourself why it exists.</p><p>Maybe it shouldn&#8217;t.</p><div><hr></div><h2>The hidden cost of adding another agent</h2><p>Suppose a customer asks:</p><blockquote><p>&#8220;Can I increase my credit limit?&#8221;</p></blockquote><p>The request passes through:</p><div class="callout-block" data-callout="true"><p>Router &#8594; Customer Agent &#8594; Policy Agent &#8594; Risk Agent &#8594; Decision Agent</p></div><p>The final answer is wrong.</p><p>Where do you look?</p><p>The model?</p><p>The prompt?</p><p>The context?</p><p>The handoff?</p><p>The policy?</p><p>The retrieved data?</p><p>The risk calculation?</p><p>The decision?</p><p>The interaction between two of them?</p><p>The more agents you add, the more possible places there are for something to go wrong.</p><p>And importantly, the failure may not belong to any one agent.</p><p>It can emerge <strong>between agents</strong>.</p><p>That&#8217;s the real cost of decomposition.</p><p>Not just more boxes.</p><p>More <strong>arrows</strong>, more interactions.</p><div><hr></div><h2>The architecture diagram hides this</h2><p>This is where agent architecture can become deceptive.</p><p>On the diagram, adding another agent is easy.</p><p>You draw another box.</p><p>Connect with arrows.</p><p>Done.</p><p>But the production system doesn&#8217;t see boxes.</p><p>It sees:</p><ul><li><p><strong>state</strong></p></li><li><p><strong>context</strong></p></li><li><p><strong>messages</strong></p></li><li><p><strong>permissions</strong></p></li><li><p><strong>tool calls</strong></p></li><li><p><strong>timeouts</strong></p></li><li><p><strong>retries</strong></p></li><li><p><strong>model versions</strong></p></li><li><p><strong>handoffs</strong></p></li><li><p><strong>failures</strong></p></li><li><p><strong>evaluations</strong></p></li></ul><p>And humans trying to figure out what happened when the workflow produced the wrong answer.</p><blockquote><p>The diagram gets more impressive.</p><p>The operating model gets harder.</p></blockquote><p>That&#8217;s why I think we need to change how we talk about multi-agent architecture.</p><p>The goal shouldn&#8217;t be to maximise the number of agents.</p><p>The goal should be to create <strong>useful boundaries</strong>.</p><div><hr></div><h2>Decompose for boundaries</h2><p>The same principle applies whether you&#8217;re designing microservices, data platforms or agentic systems.</p><p>A boundary should earn its place.</p><p>If it gives you independent capability, data isolation, authority separation or failure isolation, it may be worth the complexity.</p><p>If it exists because someone thought:</p><blockquote><p>&#8220;Wouldn&#8217;t it be cool if we had another agent?&#8221;</p></blockquote><p>It probably doesn&#8217;t.</p><p>Because every agent you add creates another system boundary you now have to operate.</p><p>And eventually, the question stops being:</p><p><strong>&#8220;How many agents do we need?&#8221;</strong></p><p>It becomes:</p><p><strong>&#8220;How many boundaries can we afford to operate?&#8221;</strong></p><p>That&#8217;s a much more useful architectural question.</p><div><hr></div><p><em> See you in Part 6, where we'll look at <strong>Decision Blindless</strong></em></p><div><hr></div><p>If you are interested in multi-agent system architectures, you might like this video.</p><div id="youtube2-2czYyrTzILg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;2czYyrTzILg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/2czYyrTzILg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p><strong>One request:</strong><br><br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thanks for reading,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Evaluating Agent Handoffs, not just the Agents]]></title><description><![CDATA[How to ev aluate AI Agent handoff, why this needs ot be a part of the architecuture, what could go wrong and how to plan for it.]]></description><link>https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/evaluating-agent-handoffs-not-just</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 05 Sep 2026 13:03:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/78ef92e9-4fe1-47bb-b53d-34801439ebc1_2752x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>We&#8217;re continuing our series on what really breaks when AI agents move from demos to production. In Part 1 we explored <a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication">why agent-to-agent communication fails</a>, and in Part 2 we looked at <a href="https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail?r=36xwjn">why the agent handoff fails</a>, Part 3 takes us one layer deeper, <a href="https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its">what happens when an agent has the right information, but the wrong context?</a>.<br><br>Today we explore why Agent Handoffs need to be evaluated differently than the converntional evaluation mechanics.</em></p><div><hr></div><blockquote><p><span>This is the fourth piece in a series I&#8217;m running, </span><em>Things That Break When Agents Meet Reality</em><span>. It&#8217;s about the engineering problems that only surface once agentic systems leave the demo and have to survive production.</span></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8IKQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png" width="6912" height="3111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3111,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2372433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34f70d4d-addd-4a54-9a14-61b374ec7ae2_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8IKQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 424w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 848w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1272w, https://substackcdn.com/image/fetch/$s_!8IKQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6633ed-f245-43e2-89e6-e331b418cb4d_6912x3111.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>I&#8217;ve been thinking about a failure mode that is going to become increasingly common as we build bigger agentic workflows.</p><p>You evaluate an agent.</p><p>It passes.</p><p>You evaluate the next agent.</p><p>It passes too.</p><p>You wire them together.</p><p>Then something goes wrong.</p><p>I&#8217;ve seen variations of this in distributed systems for years. A service can work perfectly when you test it on its own and still cause problems when it becomes part of a larger system.</p><p>Agents make this harder because the boundary between two components isn&#8217;t always a clean API.</p><ul><li><p>Sometimes it&#8217;s JSON.</p></li><li><p>Sometimes it&#8217;s a message.</p></li><li><p>Sometimes it&#8217;s a chunk of retrieved context.</p></li><li><p>Sometimes it&#8217;s an instruction that one model has generated for another model.</p></li><li><p>And sometimes it&#8217;s all of those things at once.</p></li></ul><p>That makes a simple question surprisingly difficult:</p><p><strong>What exactly are we evaluating?</strong></p><div><hr></div><h2>Let&#8217;s say we have three agents</h2><p>Take a fairly ordinary enterprise workflow.</p><p>A customer asks for a refund.</p><p>We have:</p><ul><li><p>a <strong>Researcher</strong> that looks up the customer and relevant policy</p></li><li><p>a <strong>Decision Agent</strong> that determines whether the refund should be approved</p></li><li><p>an <strong>Executor</strong> that updates the CRM and triggers the appropriate action</p></li></ul><p>Individually, they look good.</p><p>The Researcher retrieves the right information.</p><p>The Decision Agent makes the right decision.</p><p>The Executor calls the right API.</p><p>You run your evaluation suite and get something like:</p><pre><code><code>Researcher       96%
Decision Agent   95%
Executor         99%</code></code></pre><p>You&#8217;d be pretty comfortable taking those numbers to a review meeting.</p><p>Then you run the complete workflow.</p><p>And the success rate is much lower than expected.</p><p>The obvious reaction is to go back and look for the &#8220;bad agent&#8221;.</p><p>But that may be the wrong place to look.</p><p>Consider the handoff between the Researcher and the Decision Agent.</p><p>The Researcher might return:</p><pre><code><code>{
  "customer_id": "12345",
  "issue": "refund",
  "eligibility": "uncertain",
  "policy": "refund_policy_v3",
  "evidence": [
    "Purchased 41 days ago",
    "Product was returned"
  ]
}</code></code></pre><p>Looks fine.</p><p>But on another the same Researcher agent returns:</p><pre><code><code>{
  "customer_id": "12345",
  "issue": "refund",
  "eligibility": "likely",
  "policy": "refund_policy_v3",
  "evidence": [
    "Purchased 41 days ago"
  ]
}</code></code></pre><p>Still valid JSON.</p><p>Still all the expected fields.</p><p>The Researcher may even get a good score for this output.</p><p>But now the Decision Agent has to decide what &#8220;likely&#8221; means.</p><p>Is that enough to approve the refund?</p><p>Does it mean more evidence is required?</p><p>Should it send the case to a human?</p><p>We&#8217;ve got a perfectly reasonable agent talking to another perfectly reasonable agent, and <strong>the system can still make the wrong decision.</strong></p><p>That&#8217;s the bit that tends to get missed.</p><p>The <strong>handoff</strong> itself is part of the system.</p><div><hr></div><h2>This is where I think our testing habits need to change</h2><p>We&#8217;ve been doing this in software engineering for a long time.</p><p>We unit test components.</p><p>Then we test the interfaces between them.</p><p>Then we test the complete application.</p><p>Then, if we&#8217;re serious about production reliability, we deliberately make things fail.</p><p>Agent systems need the same treatment.</p><p>So yes, evaluate the individual agents.</p><p>But also evaluate:</p><pre><code><code>Agent A &#8594; Agent B</code></code></pre><p>and:</p><pre><code><code>Agent B &#8594; Agent C</code></code></pre><p>and eventually:</p><pre><code><code>Agent A &#8594; Agent B &#8594; Agent C</code></code></pre><p>The first tells you whether an agent can perform its job.</p><p>The second tells you whether two agents can actually work together.</p><p>The third tells you whether the workflow achieves what you intended.</p><p>Those are different tests.</p><p>I&#8217;ve seen teams put a lot of effort into the first one and surprisingly little into the other two.</p><div><hr></div><h1>The handoff needs a contract</h1><p>When we talk about APIs, we&#8217;re comfortable with the idea of a contract.</p><p>The producer knows what it has to send.</p><p>The consumer knows what it is going to receive.</p><p>We can test that contract.</p><p>Agent handoffs need something similar.</p><p>And I don&#8217;t mean simply checking that the output conforms to a JSON schema.</p><p>A schema can be perfectly valid while the meaning is wrong.</p><p>I&#8217;d want to test things such as:</p><ul><li><p>Is the required information present?</p></li><li><p>Is the information current?</p></li><li><p>Is uncertainty represented?</p></li><li><p>Can the receiving agent distinguish &#8220;unknown&#8221; from &#8220;no&#8221;?</p></li><li><p>Is the evidence attached?</p></li><li><p>Can we trace where the information came from?</p></li><li><p>Is there enough context for the next decision?</p></li><li><p>What happens when something is missing?</p></li></ul><p>That last question is particularly important.</p><p>A production system will eventually receive an incomplete handoff.</p><p>The interesting question isn&#8217;t whether that can happen. It will.</p><p>The question is what the next agent does when it does.</p><ul><li><p>Does it stop?</p></li><li><p>Does it ask for more information?</p></li><li><p>Does it make a guess?</p></li><li><p>Does it escalate?</p></li><li><p>Does it quietly continue?</p></li></ul><p>That&#8217;s an evaluation case.</p><div><hr></div><h1>Then there is the workflow itself</h1><p>Let&#8217;s say we&#8217;ve done all of that.</p><p>A is good.</p><p>A &#8594; B is good.</p><p>B is good.</p><p>B &#8594; C is good.</p><p>We still haven&#8217;t proved that:</p><p><strong>A &#8594; B &#8594; C</strong></p><p>works.</p><p>Why?</p><p>Because the workflow has a state.</p><p>And that state changes.</p><p>Imagine the Researcher retrieves a customer&#8217;s account at 10:01.</p><p>The Decision Agent makes its decision at 10:02.</p><p>At 10:03, the Executor performs the action.</p><p>What if something changed between those steps?</p><p>The account was updated.</p><p>A policy changed.</p><p>A previous transaction appeared.</p><p>A permission was revoked.</p><p>Another process modified the same record.</p><p>The information passed between the agents might have been correct when it was produced and wrong when it was acted upon.</p><p>That&#8217;s not really an LLM problem.</p><p>It&#8217;s a distributed-systems problem.</p><p>And I think that&#8217;s a useful way of looking at agentic architectures.</p><p>Here, we&#8217;re just building systems where some of the components happen to be probabilistic.</p><div><hr></div><h1>The evaluation needs to know what was true at the time</h1><p>This is where I&#8217;ve become increasingly interested in the idea of an <strong>Evaluation Graph</strong>.<br><br>I have writiten about it here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;015cdfbf-7c3e-4af9-b8fd-c1dff674c5d7&quot;,&quot;caption&quot;:&quot;Picture yourself in a restaurant where the menu changes daily. You order &#8220;the soup.&#8221; The chef makes whatever&#8217;s on today&#8217;s board. After few hours you&#8217;re not feeling great, and you go back and ask what was in the soup. The waiter pulls your order slip. It says &#8220;soup.&#8221; And yes, the kitchen did make the soup. But nobody wrote down which soup, made with what&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Context Graph vs Evaluation Graph&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-27T09:59:32.110Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ab3800f-88ac-403b-8933-fdebb3e97fb9_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/context-graph-vs-evaluation-graph&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:203809402,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:2,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><p>Suppose an evaluation says:</p><pre><code><code>Evaluation #1842

Score: 0.94</code></code></pre><p>Fine.</p><p>But what does that score actually mean six months later?</p><ul><li><p>Which model produced it?</p></li><li><p>Which prompt?</p></li><li><p>Which data?</p></li><li><p>Which policy?</p></li><li><p>Which business definition?</p></li><li><p>Which retrieved documents?</p></li><li><p>Which agent version?</p></li><li><p>Which context?</p></li><li><p>Which permissions?</p></li></ul><p>If you can&#8217;t answer those questions, you have a score, but you don&#8217;t necessarily have a reproducible evaluation.</p><p>Now imagine recording the evaluation together with the context surrounding it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1fTO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1fTO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!1fTO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg" width="1456" height="1887" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1887,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2241900,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/213779764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1fTO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1fTO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c2a0593-afe8-44dc-b2b6-54c8ac53b839_1824x2364.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now the evaluation isn&#8217;t floating on its own.</p><p>It has relationships.</p><p>You can trace the result back to the conditions under which it was produced.</p><p>That&#8217;s a much more useful thing to have when you&#8217;re running a production system.</p><div><hr></div><h1>The world changes underneath your evals</h1><p>Here&#8217;s a simple example.</p><p>You run the same evaluation today and tomorrow.</p><p>The test input hasn&#8217;t changed.</p><p>The workflow hasn&#8217;t changed.</p><p>The model hasn&#8217;t changed.</p><p>Today it passes.</p><p>Tomorrow it fails.</p><p>What happened?</p><p>Maybe the model changed.</p><p>But maybe the underlying data changed.</p><p>Maybe the policy changed.</p><p>Maybe a business definition changed.</p><p>Maybe a retrieved document was updated.</p><p>Maybe the context supplied to the agent was different.</p><p>Without that information, it&#8217;s very easy to blame the model for a failure that actually came from somewhere else.</p><p>This is why I don&#8217;t think evaluation should be treated as a snapshot.</p><p>For production systems, an evaluation is really a statement about a system <strong>at a particular point in time, under particular conditions</strong>.</p><p>Those conditions need to be part of the evaluation record.</p><div><hr></div><h1>This is where the evaluation surface starts getting large</h1><p>Now add another agent.</p><p>Then a verifier.</p><p>Then a router.</p><p>Then a fallback.</p><p>Then shared memory.</p><p>Then a human approval step.</p><p>Then a couple of external tools.</p><p>The architecture starts looking something like this:</p><pre><code><code>                  &#9484;&#9472;&#9472;&#8594; Planner &#9472;&#9472;&#8594; Executor
Researcher &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
                  &#9492;&#9472;&#9472;&#8594; Verifier &#9472;&#9472;&#8594; Planner</code></code></pre><p>Every new component adds another thing to evaluate.</p><p>But that&#8217;s only half of it.</p><p>Every new connection adds another boundary.</p><p>And every boundary can carry:</p><ul><li><p>context</p></li><li><p>state</p></li><li><p>instructions</p></li><li><p>uncertainty</p></li><li><p>data</p></li><li><p>assumptions</p></li></ul><p>That&#8217;s what I mean by <strong>Evaluation Surface Area</strong>.</p><p>It isn&#8217;t simply the number of agents in your architecture.</p><p>It&#8217;s everything that can influence the outcome.</p><p>Once you see it this way, adding another agent isn&#8217;t a free architectural decision.</p><p>You&#8217;re also adding more behaviour that needs to be understood and tested.</p><p>Now you see, there is so much underneath you need to engineer for.</p><p><em>(And you see posts claiming to &#8220;replace &lt;insert job title&gt; with AI Agents&#8221;, it is not that easy.)</em></p><div><hr></div><h1>What I want in the production trace</h1><p>This changes the telemetry I&#8217;d want from an agent system too.</p><p>A final answer isn&#8217;t enough.</p><p>If the workflow failed, I want to be able to walk backwards through it.</p><p>Something like:</p><pre><code><code>Workflow: 84721

Input
  &#8595;
Agent A
  &#9500;&#9472; model/version
  &#9500;&#9472; prompt/version
  &#9500;&#9472; retrieved data
  &#9500;&#9472; context
  &#9500;&#9472; tool calls
  &#9492;&#9472; output
       &#8595;
A &#8594; B
  &#9500;&#9472; payload
  &#9500;&#9472; context
  &#9492;&#9472; validation
       &#8595;
Agent B
  &#9500;&#9472; decision
  &#9492;&#9472; output
       &#8595;
B &#8594; C
  &#9500;&#9472; payload
  &#9492;&#9472; context
       &#8595;
Agent C
  &#9500;&#9472; tool calls
  &#9492;&#9472; action
       &#8595;
Outcome</code></code></pre><p>If something went wrong, I want to find the <strong>first place the system deviated from the expected path</strong>.</p><p>Maybe retrieval was wrong.</p><p>Maybe the handoff dropped some context.</p><p>Maybe the policy was stale.</p><p>Maybe the Decision Agent made a bad call.</p><p>Maybe the Executor received a valid instruction that was no longer safe to execute.</p><p>Maybe a retry caused the action to happen twice.</p><p>The trace should let me work that out.</p><p>Otherwise we&#8217;re left staring at the final answer and asking the model why it did something.</p><p>That&#8217;s not a particularly good debugging strategy.</p><div><hr></div><h1>So what should we actually evaluate?</h1><p>For a production workflow, I&#8217;d think about it this way.</p><blockquote><p><strong>The agent</strong></p><p>Can it do its job?</p><p><strong>The handoff</strong></p><p>Can the next agent reliably understand what it received?</p><p><strong>The workflow</strong></p><p>Does the complete sequence produce the right outcome?</p><p><strong>The failure path</strong></p><p>What happens when something is missing, stale, delayed or broken?</p><p><strong>The context</strong></p><p>What data, policy, model, prompt and state were in force when the evaluation happened?</p></blockquote><p>That last one is easy to overlook.</p><p>But it becomes incredibly important once your system is changing underneath you.</p><div><hr></div><h1>Evaluation has to become part of the architecture</h1><p>This is probably the biggest shift in thinking for me.</p><p>Evaluation shouldn&#8217;t sit at the end of the development process as a test suite we run before deployment.</p><p><strong>For an agentic system, evaluation needs to sit alongside the architecture.</strong></p><p>The agent graph tells us how work moves through the system.</p><p>The evaluation graph tells us how we understand and explain that behaviour.</p><p>And the two need to stay connected.</p><p>Because eventually someone is going to ask:</p><blockquote><p>Why did this agent make that decision?</p></blockquote><p>And &#8220;because it scored 94% on our eval set&#8221; isn&#8217;t going to be a satisfactory answer.</p><p>We need to be able to trace that decision back through the agent, the handoff, the context, the data, the policy, the model and the state of the system at that moment.</p><p>That&#8217;s the level of evaluation I think production agent systems are going to need.</p><p>Not just:</p><p><strong>Did it pass?</strong></p><p>But:</p><p><strong>What happened, under what conditions, and can we prove it?</strong></p><p>That&#8217;s a much harder engineering problem.</p><p>It&#8217;s also a much more interesting one.</p><blockquote><p><strong>Evaluate the nodes. Evaluate the edges. And keep the context that makes the evaluation meaningful.</strong></p></blockquote><div><hr></div><p><em> See you in Part 5, where we'll look at <strong>why your agent can pass every evaluation and still fail in production.</strong></em></p><div><hr></div><p><strong>One request:</strong><br><br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thanks for reading,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your Agent Isn’t Hallucinating. It’s Operating With the Wrong Context.]]></title><description><![CDATA[Why production AI agents return convincing answers that turn out to be completely wrong, and how state drift, stale data, and missing operational context cause silent failures in the enterprise.]]></description><link>https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/your-agent-isnt-hallucinating-its</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 22 Aug 2026 13:03:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5975d8e7-1efd-406e-b71f-def9ee07f372_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>We&#8217;re continuing our series on what really breaks when AI agents move from demos to production. In Part 1 we explored <a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication">why agent-to-agent communication fails</a>, and in Part 2 we looked at <a href="https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail?r=36xwjn">why the agent handoff fails</a>, Part 3 takes us one layer deeper: <strong>what happens when an agent has the right information, but the wrong context?</strong></em></p><div><hr></div><p>A few months ago, I was digging into why some AI systems return completely convincing answers that turn out to be dead wrong.</p><p>The interesting failures aren&#8217;t obvious hallucinations. The tricky cases look airtight on paper: the document is real, the customer is real, the policy is accurate, and the text was interpreted faithfully. Yet the final output is completely broken.</p><p>The problem isn&#8217;t the data itself. The agent simply has the right information applied to the wrong context.</p><div><hr></div><h2>Think about cooking dinner</h2><p>Imagine preparing a meal for friends. You have chicken, vegetables, rice, spices, and a recipe you&#8217;ve made dozens of times. Halfway through prep, someone mentions that one of the guests is vegetarian.</p><p>Nothing in your kitchen failed. The chicken was fresh, the recipe was solid, and your technique was fine. You just lacked a crucial constraint about the people you were cooking for, and that missing detail invalidates the rest of your plan.</p><p>Enterprise AI agents run into this constantly.</p><div><hr></div><h2>When a good RAG response isn&#8217;t enough</h2><p>Suppose an employee asks an HR bot: <em>&#8220;How much parental leave am I entitled to?&#8221;</em></p><p>The system queries the internal knowledge base, pulls a valid policy document citing 26 weeks, quotes it accurately, and references the source. It looks flawless.</p><p>Except the employee is based in another region, works on a contractor agreement rather than permanent staff, or the policy was revised last week and the search index hasn&#8217;t refreshed.</p><p>The document wasn&#8217;t fabricated, retrieval didn&#8217;t crash, and the model didn&#8217;t misread the text. The agent simply had no awareness of the situation surrounding the query.</p><p>We&#8217;ve gotten quite good at feeding documents into LLMs. What we haven&#8217;t nailed is ensuring that data applies to this specific user, task, and moment in time.</p><div><hr></div><h2>RAG answers &#8220;what looks relevant?&#8221;</h2><p>Standard RAG follows a predictable loop: user asks a question, the engine retrieves matching snippets, feeds them into the prompt, and the model outputs an answer.</p><p>The weak point is semantic relevance.</p><p>A search index will easily identify an SLA document for a question about service levels. But that document might be superseded by an addendum signed six months later, an unindexed regional policy, or an active exception logged in Salesforce.</p><p>The document is semantically relevant, but operationally invalid for that specific scenario.</p><div><hr></div><blockquote><p><span>This is the third piece in a series I&#8217;m running, </span><em>Things That Break When Agents Meet Reality</em><span>. It&#8217;s about the engineering problems that only surface once agentic systems leave the demo and have to survive production. </span></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xNIg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xNIg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 424w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 848w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 1272w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!xNIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png" width="6912" height="3130" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3130,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2377892,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/212218556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc971d684-d2b1-4099-9cbb-2703a561cce8_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xNIg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 424w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 848w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 1272w, https://substackcdn.com/image/fetch/$s_!xNIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f26814d-4bd5-4533-8f9b-59b13f9d06fa_6912x3130.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Context is scattered across systems</h2><p>In production environments, the data required to resolve a single interaction rarely lives in one place.</p><p>A routine customer query might pull identity from the CRM, subscription tiers from Stripe, negotiated terms from the contract repo, open tickets from Zendesk, historical usage from Snowflake, and real-time events from Kafka.</p><p>The agent doesn&#8217;t need a dump of everything, in fact, dumping raw state degrades performance. It needs the exact slice of state governing that specific decision.</p><div><hr></div><h2>Context goes stale</h2><p>Systems drift out of sync all the time.</p><p>If a company shortens its cancellation window from 30 days to 14 days, the source database might update immediately while the vector store lags behind. The agent keeps quoting the 30-day policy. The model didn&#8217;t hallucinate, semantic search didn&#8217;t fail, and the pipeline ran as designed. The data was simply historically true, but currently false.</p><p>This creates a core infrastructure challenge: is a document valid because it matches search terms, or because it reflects the current operational state?</p><p>Basic metadata like <code>created_at</code> and <code>updated_at</code> rarely cuts it. Systems need fields like <code>valid_from</code>, <code>valid_until</code>, <code>supersedes</code>, <code>source_system</code>, and <code>scope</code>, because <em>last updated</em> and <em>currently applicable</em> are entirely different concepts.</p><div><hr></div><h2>Multi-agent compounding errors</h2><p>This gets significantly messier across multi-agent workflows.</p><pre><code><code>Customer Agent -&gt; Pricing Agent -&gt; Compliance Agent -&gt; Execution Agent
</code></code></pre><p>Each service queries its own domain: the customer agent reads the CRM, the pricing agent checks billing tiers, compliance reads policy docs, and execution writes to the transactional database.</p><p>Each agent executes its sub-task correctly, but they might operate on mismatched snapshots of state. One sees a legacy plan, another reads an updated tier, and compliance applies an exception logged yesterday that the execution worker never receives.</p><p>By the end of the chain, nobody hallucinated, but the pipeline failed due to <strong>context fragmentation</strong>. It&#8217;s an insidious failure mode because every individual log looks green in isolation.</p><div><hr></div><h2>The missing source of truth</h2><p>Enterprise systems frequently have conflicting definitions of basic terms.</p><p>If an account is marked <code>Active</code> in HubSpot, <code>Past Due</code> in Stripe, and <code>At Risk</code> in Zendesk, which one does the agent rely on?</p><p>A human operator knows that Stripe owns payment state while HubSpot owns account lifecycle. An LLM lacks that institutional intuition unless it is explicitly engineered into the pipeline.</p><p>Teams need clear ownership around business objects:</p><ul><li><p>What the field represents</p></li><li><p>Which system owns authoritative write access</p></li><li><p>Update latency and sync schedules</p></li><li><p>Entity boundaries and constraints</p></li></ul><p>Prompt engineering cannot fix underlying data governance gaps.</p><div><hr></div><h2>The handoff dilemma</h2><p>When a research agent finishes a task and passes output to an analyst agent, what should that payload contain?</p><p>Passing the entire raw dialogue blows up the context window with conversational noise, token bloat, and stale assumptions. Conversely, sending a bare-bones summary drops critical constraints, source provenance, and workflow state.</p><p>Agent handoffs require intentional payload schemas: passing the exact state required for downstream decisions; nothing more, nothing less.</p><div><hr></div><h2>Engineering context assembly</h2><p>For simple chatbots, context is just conversation history and a few retrieved chunks. For decision-making agents, context becomes an active assembly layer:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ME0O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ME0O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ME0O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg" width="1456" height="996" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:996,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2482775,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/212218556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ME0O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ME0O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f69f960-b83e-48a4-8d93-a7f3e9cef90c_2480x1696.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Before prompt construction, an assembly pipeline must resolve:</p><ul><li><p><strong>Time:</strong> Is the data current and actively enforced?</p></li><li><p><strong>Entity:</strong> Does this rule apply to this specific account or tier?</p></li><li><p><strong>Authority:</strong> Is this the definitive system of record for this attribute?</p></li><li><p><strong>State:</strong> What prior steps and mutations occurred in this session?</p></li><li><p><strong>Permissions:</strong> Does the user/agent have authorization to view this data?</p></li><li><p><strong>Provenance:</strong> Can we trace the origin of this assertion?</p></li></ul><p>These are traditional data engineering patterns applied upstream of LLM orchestration.</p><div><hr></div><h2>Bigger context windows won&#8217;t solve this</h2><p>Expanding context windows to millions of tokens doesn&#8217;t eliminate the need for curation.</p><p>Giving a model an unfiltered firehose of internal data introduces conflicting policies, outdated records, noisy intermediate reasoning, and distraction. The engineering challenge isn&#8217;t how many tokens a model can swallow; it&#8217;s how reliably we assemble the exact state required for a specific decision.</p><div><hr></div><h2>The evaluation split</h2><p>When an agent takes the wrong action, the default reaction is to blame model reasoning.</p><p>In reality, agent evaluations need to decouple two distinct questions:</p><ol><li><p><strong>Reasoning Quality:</strong> Did the model reach a sound conclusion based on the payload provided?</p></li><li><p><strong>Context Quality:</strong> Did the orchestration layer supply the correct, authoritative state in the first place?</p></li></ol><p>If the reasoning failed, you tweak the prompt, model, or tool definitions. If the context was wrong, no amount of prompt tweaking will prevent the failure.</p><div><hr></div><h2>Why this matters for action-taking agents</h2><p>When an agent just generates text, bad context produces bad copy. When an agent has write access, bad context triggers bad transactions.</p><p>A refund bot might look up the right policy, calculate the correct amount, and match the customer record, yet execute a duplicate payout because it lacked visibility into a refund processed ten minutes prior.</p><p>At that stage, context management becomes part of the system&#8217;s operational control plane.</p><div><hr></div><h2>Rethinking RAG</h2><p>RAG isn&#8217;t going anywhere, but its role needs reframing.</p><p>Moving from simple document search to context assembly means pulling simultaneously from vector indexes, transactional APIs, event buses, state machines, and access control layers.</p><blockquote><p>RAG provides reference material. Context provides the operational situation.</p></blockquote><div><hr></div><p><em> See you in Part 4, where we'll look at <strong>why your agent can pass every evaluation and still fail in production.</strong></em></p><div><hr></div><p><strong>One request:</strong><br><br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thanks for reading,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Why AI Agent Handoffs Fail]]></title><description><![CDATA[The handoff is the new API boundary, and most teams treat it like a prompt. Why that fails without ever throwing an error, and what a reliable handoff carries instead.]]></description><link>https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/why-ai-agent-handoffs-fail</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 15 Aug 2026 13:03:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/32774701-7e06-4bea-b91f-55dcb839d0e0_2750x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Things That Break When Agents Meet Reality &#183; Part 2</em></p><p>A customer rang the bank on a Monday morning. They had been locked out of their own account.</p><p>No breach. No fraud. A legitimate person, a legitimate transaction, frozen by a system that had done exactly what it was built to do.</p><p>The team pulled the trace. Every step had completed. The research agent ran, the analysis agent ran, the decision agent ran. The observability dashboard showed one word across the whole pipeline.</p><p><strong>SUCCESS.</strong></p><p>Nothing had crashed. That was the problem.</p><div><hr></div><h2>Three boxes, three arrows</h2><p>On a whiteboard the pipeline looked clean.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fMRa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 424w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 848w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 1272w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!fMRa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png" width="1456" height="198" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:198,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fMRa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 424w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 848w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 1272w, https://substackcdn.com/image/fetch/$s_!fMRa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a804fc-2013-49a3-92d1-b3a168b16bd0_2964x404.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p>Three agents, three capabilities, one workflow. </p><p>But the boxes weren&#8217;t where the trouble lived. <strong>The trouble lived in the arrows.</strong></p><p>Every arrow is a boundary. The research agent had told the analysis agent that a customer carried a high risk score. The analysis agent read &#8220;high risk&#8221; as <em>reject</em>. The research agent had meant <em>worth a closer look</em>. Nowhere in the trace did those two readings ever meet. No exception fired, because from the machine&#8217;s point of view nothing was wrong. A value went in, a value came out, the run went green.</p><p>We have spent decades learning to engineer boundaries between software components. We call them APIs. We write contracts, specify schemas, validate inputs, version interfaces, handle errors, monitor latency. We do all of it because of one lesson that cost the industry a great deal to learn: <strong>the interface between two systems usually matters more than either system on its own.</strong></p><p>Now the components on both sides of the interface are language models. And somewhere along the way we started treating the interface as a prompt.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t4Np!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t4Np!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 424w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 848w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 1272w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!t4Np!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png" width="6912" height="3017" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3017,&quot;width&quot;:6912,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2350181,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/211292059?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53bf117c-5d49-4d61-9f6d-38193ff73af3_6912x3456.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!t4Np!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 424w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 848w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 1272w, https://substackcdn.com/image/fetch/$s_!t4Np!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6179589e-f9a7-42a3-825f-f5d4ff7e41e8_6912x3017.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>This is the second piece in a series I&#8217;m running, <em>Things That Break When Agents Meet Reality</em>. It&#8217;s about the engineering problems that only surface once agentic systems leave the demo and have to survive production. Part 1, <a href="https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication">Why Agent-to-Agent Communication Fails</a>, landed on one line: having five smart agents doesn&#8217;t give you one smart system. That leaves an obvious next question. If agents have to communicate reliably, what does that communication actually have to be?</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>An agent handoff isn&#8217;t a conversation</h2><p>Picture the research agent telling the analysis agent what it found.</p><p>A person might say: &#8220;I found three transactions that look off. You should take a closer look.&#8221;</p><p>Perfectly reasonable between two humans. But strip the human out of the receiving end and the sentence falls apart. </p><ul><li><p>Does &#8220;three&#8221; mean exactly three? </p></li><li><p>Does &#8220;off&#8221; have a threshold behind it? </p></li><li><p>Which transactions, on what evidence, to what confidence? </p></li><li><p>Is this a claim that they are fraudulent, or a request to check?</p></li></ul><p>People resolve that ambiguity without noticing. Deterministic software refuses to. </p><blockquote><p>Language models sit in the worst possible place between the two: brilliant at interpreting ambiguity, and equally brilliant at inventing an interpretation when there shouldn&#8217;t be one. </p></blockquote><p>In a fraud pipeline, that second talent is the one that freezes a real customer&#8217;s account.</p><div><hr></div><h2>The old world had contracts for a reason</h2><p>A traditional service call carries a contract:</p><pre><code><code>{
  "customer_id": "12345",
  "risk_score": 0.87,
  "decision": "REVIEW"
}</code></code></pre><p>Drop <code>customer_id</code> and the request fails. Send <code>risk_score</code> as text and validation fails. Send a decision outside the permitted set and the request fails. That strictness is deliberate. The system would rather stop loudly than guess quietly.</p><p>Replace the sender with an agent and the same information arrives like this:</p><blockquote><p>&#8220;I&#8217;ve identified the customer as 12345. Based on the available information, this appears to be the relevant account.&#8221;</p></blockquote><p>Useful to read. Miserable to build on. The receiver now has to parse prose to recover a value that was never meant to be ambiguous. We took a deterministic interface and swapped in a probabilistic one, then acted surprised when the decision at the far end drifted.</p><div><hr></div><h2>Contract drift: the change nobody made</h2><p>Here is the failure mode that is specific to agents.</p><p>Two agents agree on a shape:</p><pre><code><code>customer_id
account_status
risk_score</code></code></pre><p>Six months later someone edits the sending agent&#8217;s prompt. It starts returning two extra fields:</p><pre><code><code>customer_id
account_status
risk_score
reasoning
recommended_action</code></code></pre><p>Nothing breaks. The JSON is valid. The workflow runs. But the receiving agent quietly starts leaning on <code>recommended_action</code> instead of forming its own judgement. The architecture has changed and no one touched the API.</p><p>That is contract drift. With traditional software, an interface change is an event: a version bump, a review, a deprecation notice. With agents, the meaning of an interface can shift because of a prompt edit, a model upgrade, a new tool, a memory change, a policy tweak. The schema stays valid while its meaning moves underneath you. That is a different class of problem, and most monitoring is blind to it.</p><div><hr></div><h2>The most dangerous handoff is the one that succeeds</h2><p>A malformed API call gives you an error, which is a gift, really. <strong>It tells you where to look.</strong></p><p>An agent gives you something worse: a well-formed answer that means something other than what the sender intended.</p><p>The research agent says &#8220;high risk score.&#8221; The decision agent hears <em>reject</em>. The research agent meant <em>investigate</em>. Nothing fails and the pipeline completes. The dashboard goes green. And a customer who did nothing wrong spends Monday on hold.</p><blockquote><p>Semantic failures are more dangerous than technical ones, because every tool we own is built to catch the technical kind.</p></blockquote><div><hr></div><h2>What a handoff should actually carry</h2><p>Start treating handoffs as contracts rather than messages, and a useful contract works on four layers.</p><ol><li><p><strong>Structure.</strong> What fields exist. The schema.</p></li><li><p><strong>Semantics.</strong> What those fields mean. A field called <code>status</code> with the value <code>VULNERABLE</code> is valid JSON and almost useless on its own. Has the customer disclosed vulnerability, has the system inferred it, has a human confirmed it, is it a legal protection, was it true yesterday and unchecked since? The schema is fine. The meaning is undefined, and in a regulated business the meaning is the whole point.</p></li><li><p><strong>Authority.</strong> What the receiver is allowed to do with the payload. Receiving a risk score is not the same as being cleared to freeze an account on it.</p></li><li><p><strong>Provenance.</strong> Where the information came from. <code>risk_score = 0.87</code> is a number until you know which model produced it, on what data, under which policy, and when.</p></li></ol><p>A mature handoff stops being &#8220;here&#8217;s some JSON.&#8221; It becomes: <strong>here is what I know, what it means, where it came from, and what you are allowed to do with it.</strong></p><div><hr></div><h2>Every arrow is an evaluation point</h2><p>This is the part I think matters most, and it is where the whole series has been heading.</p><p>We tend to evaluate agents one box at a time. Did the research agent find the right transactions? Did the decision agent make the right call? Useful questions, but they are incomplete.</p><p>The better question lives on the arrow: <strong>did the sending agent give the receiver everything it needed to do its job correctly? </strong>That is a different evaluation, and it is one you can actually run. Schema validity, completeness, semantic correctness, context preservation, intent preservation, evidence quality, confidence calibration. Each of those can be checked at the boundary before the payload moves on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VnRJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VnRJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 424w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 848w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!VnRJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png" width="1456" height="739" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:739,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VnRJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 424w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 848w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!VnRJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e03ed44-aab7-4244-8c49-fff4a0c05c3f_2844x1444.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Do that, and the arrows in your diagram stop being decoration. They become the places you measure. When something goes wrong in production, you stop reaching for &#8220;the agent hallucinated&#8221; and start asking which handoff corrupted the workflow. That question has an answer. The other one never did.</p><p>This is <strong>Evaluation Debt </strong>in its native habitat. It is also why evaluation isn&#8217;t a final checkbox bolted on at the end of the pipeline. It&#8217;s the architecture that keeps the whole thing alive, and in an agentic system that architecture lives on the boundaries, not inside the boxes.</p><div><hr></div><h2>The architecture that follows</h2><p>Once handoffs are contracts, the system grows the parts it was missing. Validation before a payload reaches the next agent. Versioning when the contract changes on purpose, so drift becomes an event again. Tracing, so you can see what crossed every boundary. Evaluation at each arrow. A defined failure path when the receiver rejects a payload, and human escalation when the system can&#8217;t establish that a handoff is safe.</p><blockquote><p>Agent orchestration starts to look far more like distributed systems engineering than like prompt design. That is the mindset shift I think the next year of this work turns on.</p></blockquote><p>Back to the customer on hold. In the pipeline that catches this, &#8220;high risk&#8221; never reaches the decision agent as a bare phrase. It arrives as a typed claim with a meaning, a source, and a ceiling on what can be done with it. The decision agent can act on <em>investigate</em> and is not permitted to escalate it to <em>freeze</em> on its own. The dashboard still goes green. This time the green is telling the truth.</p><div><hr></div><h2>Where this goes next</h2><p>We are building software components that can reason, which is genuinely powerful and quietly introduces something APIs never had. An API never decides what your payload probably means. An agent does. The space between two agents isn&#8217;t an API and it isn&#8217;t a conversation. It&#8217;s a third thing: <strong>a reasoning boundary</strong>, and it has to be engineered on purpose.</p><p>The next pieces in this series follow the cracks further out. </p><ul><li><p>What happens when you keep adding agents to a system that already has too many. </p></li><li><p>Why an agent can pass every evaluation and still fail in production. </p></li><li><p>What happens when an agent has all the right information and still lacks the context to use it.</p><p></p></li></ul><p>If you take one line into your next design review, take this one: <strong>the boundary between two agents is a contract, and an untested contract is a production incident with a delay on it.</strong></p><p>See you in Part 3.</p><div><hr></div><p><strong>One request:</strong><br><br>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions. Tell me what you want to learn.</p><h3 style="text-align: center;"><strong>&#128073; <a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thanks for reading,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Everyone Is Optimising the Wrong Thing in AI Agents]]></title><description><![CDATA[Most teams spend weeks choosing the right model. The real competitive advantage isn't choosing a better model. It's designing better data infrastructure.]]></description><link>https://newsletter.agentbuild.ai/p/why-most-ai-agents-fail-in-production</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/why-most-ai-agents-fail-in-production</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 01 Aug 2026 12:03:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5755f8db-ae97-4739-bcc3-a1f3157cb874_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>Before I begin the article, I would like to make a humble request.</strong></em></p><p>One of my goals with this newsletter is to make every issue genuinely useful for you. Rather than guessing what you&#8217;d like to read, I&#8217;ve put together a short survey to understand the topics, challenges, and formats that would be most valuable to you.</p><p>It only takes 30 seconds to complete, and your feedback will directly influence the future content of this newsletter. If there&#8217;s a topic you&#8217;ve been struggling with or would like me to cover, this is the best way to let me know.</p><h3 style="text-align: center;"><strong><span>&#128073; </span><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p>Thank you, it genuinely helps me write better content for this community.</p><div><hr></div><p>Over the past year, I&#8217;ve had countless conversations with teams building AI agents.</p><p>The discussion almost always starts the same way.</p><p><em>&#8220;Which model should we use?&#8221;</em></p><p>GPT-5? Claude? Gemini? An open-source model?</p><p>It&#8217;s a reasonable question. But it&#8217;s rarely the one that determines whether the project succeeds.</p><p>In production, AI agents usually don&#8217;t fail because the LLM isn&#8217;t intelligent enough.</p><p>They fail because the data infrastructure wasn&#8217;t designed for agents.</p><div><hr></div><h3>Model problem is an illusion, mostly</h3><p>When an agent gives a poor answer, it&#8217;s tempting to blame the model.</p><p>In reality, the root cause is often somewhere else.</p><ul><li><p>The agent couldn&#8217;t find the right information.</p></li><li><p>The retrieved context was outdated.</p></li><li><p>The metadata was incomplete.</p></li><li><p>Permissions prevented access to critical documents.</p></li><li><p>Tool outputs were inconsistent.</p></li><li><p>There was no reliable way to evaluate whether the response was correct.</p></li></ul><p>Changing the model may improve the symptoms.</p><p>But it doesn&#8217;t fix the underlying system.</p><div><hr></div><h3>AI agents are data systems</h3><p>Traditional software follows predefined logic.</p><p>LLM applications generate responses.</p><p>AI agents do something more demanding.</p><p>They continuously retrieve context, invoke tools, maintain memory, reason across multiple steps, and make decisions based on dynamic information.</p><p>That creates different engineering challenge.</p><p>The bottleneck is no longer model capability. The models are great.</p><p>It&#8217;s the quality of the surrounding data system.</p><div><hr></div><h3>Four infrastructure questions you should answer</h3><p>Before choosing an LLM, I believe every architecture review should answer these four questions.</p><ol><li><p><strong>How does the agent acquire context?</strong></p></li></ol><ul><li><p>Where does information come from?</p></li><li><p>Structured databases?</p></li><li><p>Documents?</p></li><li><p>Knowledge graphs?</p></li><li><p>Streaming events?</p></li><li><p>How is relevance determined?</p></li><li><p>How is freshness maintained?</p><p></p></li></ul><ol start="2"><li><p><strong>How does the agent remember?</strong></p><p></p><p>Memory isn&#8217;t just conversation history. You need to define:</p></li></ol><ul><li><p>session memory</p></li><li><p>long-term memory</p></li><li><p>organisational knowledge</p></li><li><p>user-specific context</p></li><li><p>retention and expiry policies</p></li></ul><p>       Memory is a data architecture problem long before it&#8217;s an AI problem.</p><ol start="3"><li><p><strong>How does the agent interact with enterprise systems?</strong></p></li></ol><p>       Most production agents spend more time calling APIs than generating text.</p><ul><li><p>Can tools be discovered?</p></li><li><p>Are they authenticated?</p></li><li><p>Are outputs standardised?</p></li><li><p>Can failures be retried?</p></li><li><p>How are side effects controlled?</p></li></ul><p>        These questions often determine reliability more than model quality.</p><ol start="5"><li><p><strong>How will success be measured?</strong></p></li></ol><p>        This is the question I see missed most often.</p><p>        Teams build agents first. Evaluation comes later.</p><p>         Instead, define success before implementation.</p><ul><li><p> What does a correct response look like?</p></li><li><p>What datasets will validate it?</p></li><li><p>What metrics matter?</p><ul><li><p>Task completion</p></li><li><p>Tool accuracy</p></li><li><p>Groundedness</p></li><li><p>Latency</p></li><li><p>Cost</p></li><li><p>User satisfaction</p></li></ul></li></ul><p>        If you can&#8217;t measure quality, you can&#8217;t improve it.</p><div><hr></div><h3>Your role is changing</h3><p>The next generation of engineers will be distinguished by designing systems that give any capable model the right information, at the right time, with the right controls. </p><p>Models will continue to improve.</p><p>The system around it remains the long-term differentiator.</p><p>That&#8217;s where architectural decisions create lasting advantage.</p><div><hr></div><h3>Want to go deeper?</h3><p>This article only scratches the surface.</p><p>Designing data infrastructure for AI agents is a discipline in its own right, covering topics such as context engineering, memory architectures, retrieval strategies, evaluation frameworks, tool integration, governance, and observability. These are the decisions that determine whether an agent works reliably in production.</p><p>If you&#8217;re a software engineer, data engineer, platform engineer, or architect looking to build production-grade AI systems, I&#8217;ve partnered with Packt to deliver a hands-on workshop on <strong><a href="https://www.linkedin.com/safety/go?url=https%3A%2F%2Fwww.eventbrite.co.uk%2Fe%2Fdesigning-data-infrastructure-for-ai-agents-llms-tickets-1995672648614%3Faff%3Dspeaker%26discount%3Dspeaker&amp;trk=flagship-messaging-web&amp;messageThreadUrn=urn%3Ali%3AmessagingThread%3A2-OTIwMDYzOGMtNDg1ZC00OGY5LTgzZjMtNGE2ZjBiYWYwYzJmXzEwMA%3D%3D&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_messaging_conversation_detail%3BfMtzvYNvTPW%2B6JVuUTAjqw%3D%3D">Designing Data Infrastructure for AI Agents</a></strong>.</p><p>Rather than focusing on prompt engineering or model comparisons, we&#8217;ll work through the architectural patterns, design principles, and practical exercises needed to build agent systems that are scalable, reliable, and maintainable.</p><p><strong>&#128073; <a href="https://www.linkedin.com/safety/go?url=https%3A%2F%2Fwww.eventbrite.co.uk%2Fe%2Fdesigning-data-infrastructure-for-ai-agents-llms-tickets-1995672648614%3Faff%3Dspeaker%26discount%3Dspeaker&amp;trk=flagship-messaging-web&amp;messageThreadUrn=urn%3Ali%3AmessagingThread%3A2-OTIwMDYzOGMtNDg1ZC00OGY5LTgzZjMtNGE2ZjBiYWYwYzJmXzEwMA%3D%3D&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_messaging_conversation_detail%3BfMtzvYNvTPW%2B6JVuUTAjqw%3D%3D">[Register for the Packt Workshop]</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_9Mw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_9Mw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 424w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 848w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 1272w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!_9Mw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png" width="1869" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:1869,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2002684,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/209314757?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09aada6f-fb52-4225-bb0a-fcb615bcfabc_1876x934.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_9Mw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 424w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 848w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 1272w, https://substackcdn.com/image/fetch/$s_!_9Mw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a334dd7-1773-4275-8631-0de627ba7306_1869x934.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I hope to see some of you there.<br><br>Talk soon,<br>Sandi.</p><div><hr></div><p><em><span>P.S. If you&#8217;re new here - </span><strong>welcome</strong><span> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br><span>More valuable content coming your way.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Here’s Everything My Substack Dashboard Says]]></title><description><![CDATA[I opened up my Substack analytics - open rates, views, growth, all of it. Now I need two minutes of yours to decide what comes next.]]></description><link>https://newsletter.agentbuild.ai/p/heres-everything-my-substack-dashboard</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/heres-everything-my-substack-dashboard</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Tue, 28 Jul 2026 10:30:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d644f1b4-f926-4592-920c-2a6fa13294f7_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, I&#8217;m opening up my Substack dashboard and showing you exactly what&#8217;s working, what isn&#8217;t, and where I honestly stand. <br><br>I want to be transparent with you folks. You give me your valuable time and you deserve to know this.</p><p>Six months ago, AgentBuild was a few hundred people. Today, it&#8217;s <strong>1100+</strong>, spread across 73 countries - from Bangalore to Boston to Bradwell.</p><p>I want to index on proving value over increasing subscriber count. </p><p>Hence, I&#8217;m going to ask for your help.</p><div><hr></div><h2>First, the Growth Curve</h2><p>A year ago, AgentBuild had roughly 300 followers. Today it&#8217;s 1,158 - nearly a 4x jump, with the steepest acceleration happening in just the last four months. Something clicked around April, right when I doubled down on decision traces, agent registries, and evaluation frameworks instead of chasing whatever AI news cycle was trending that week.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QZOl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QZOl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 424w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 848w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 1272w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QZOl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png" width="1456" height="665" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:665,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:174952,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/208694719?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QZOl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 424w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 848w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 1272w, https://substackcdn.com/image/fetch/$s_!QZOl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9379568f-64e8-4497-bcd2-fe71ff286bbc_1678x766.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Where you&#8217;re all reading from:</strong></p><ul><li><p>India: 37%</p></li><li><p>United States: 24%</p></li><li><p>United Kingdom: 7%</p></li><li><p>Germany: 3%</p></li><li><p>Canada: 2%</p></li><li><p>Plus pockets across 68 other countries</p></li></ul><p>That&#8217;s a genuinely global room of practitioners, which still blows my mind every time I look at it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Where I stand today</h2><p>My last 20 posts averaged an open rate between <strong>22.5% and 30.3%</strong>, with a 30-day rolling average of <strong>25.24%</strong>.</p><p>Let&#8217;s put that in context:</p><ul><li><p><strong>General email marketing average:</strong> ~21-22% open rate</p></li><li><p><strong>Substack&#8217;s platform-wide headline number:</strong> often quoted at 35 - 37%</p></li><li><p><strong>Real-world compressed range for niche newsletters in 2025-2026:</strong> closer to 28-32%</p></li></ul><p><strong>So where does that put AgentBuild?</strong> </p><p>Comfortably ahead of generic marketing email, but trailing the Substack averages. I call it &#8220;solid, not spectacular.&#8221; And that&#8217;s fine.</p><p>My best-performing piece, &#8220;Why Solution Architects Are the Real Force Behind Enterprise AI Transformation,&#8221; hit a 30.28% open rate - proof that when the topic lands, the number moves. Which is exactly why I want your input on what topics actually land for you.</p><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;482ff7f9-33bd-47c9-8ed5-1b7c6b56f5e5&quot;,&quot;caption&quot;:&quot;There&#8217;s a role inside every enterprise AI programme that nobody has a clean job title for. It isn&#8217;t the VP who sponsors the initiative. It isn&#8217;t the data scientist who builds the model. It isn&#8217;t the product manager who writes the requirements.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why Solution Architects Are the Real Force Behind Enterprise AI Transformation&quot;,&quot;publishedBylines&quot;:[],&quot;post_date&quot;:&quot;2026-04-26T10:43:30.092Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/141a97f5-4092-4502-80da-cb58adb9f80a_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/why-solution-architects-are-the-real&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:195512222,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:7,&quot;comment_count&quot;:5,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>My most-read piece by a wide margin: <strong>&#8220;Why Agent-to-Agent Communication Fails - How to Design for Failure&#8221;</strong> pulled 897 views, nearly double my typical post. </p><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d44e35a2-f768-483e-9409-e6ee5be3eb85&quot;,&quot;caption&quot;:&quot;Hey everyone,&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why Agent-to-Agent Communication Fails - How to Design for Failure&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-16T13:02:45.412Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aeaa59e-f607-44e2-8c59-c89e34f20306_1920x1080.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/why-agent-to-agent-communication&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:197971759,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:26,&quot;comment_count&quot;:12,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><p>Close behind: my two-part series on <a href="https://newsletter.agentbuild.ai/p/how-to-build-an-ai-agent-registry">building an AI agent registry</a> (586 and 476 views), and <a href="https://newsletter.agentbuild.ai/p/the-evaluation-graph-why-your-ai?r=36xwjn">&#8220;The Evaluation Graph: Why Your AI Pipelines Are Lying to You&#8221;</a> (466 views). </p><p><strong>There&#8217;s a clear pattern here - you want tactical, failure-mode-focused content over broad conceptual overviews.</strong></p><div><hr></div><h2>Take the survey, please</h2><p>If I&#8217;m grading myself against the benchmarks: <strong>good, not great.</strong> I&#8217;m beating the average email newsletter by a healthy margin, but I&#8217;m not yet in &#8220;50%+ open rate, readers treat this like a must-open&#8221; territory that the best niche Substacks report. </p><blockquote><p>There&#8217;s a room to close that gap and the fastest way to close it is writing more of what you actually want, instead of guessing.</p></blockquote><p></p><p>Hence, <strong>I&#8217;ve put together a short survey </strong>to answer three things: </p><ul><li><p>what topics you want more of, </p></li><li><p>what format works best for you, </p></li><li><p>which of the three community features should I launch</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!21YQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!21YQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 424w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 848w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 1272w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!21YQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png" width="664" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:664,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Your survey deserves a good response rate! 10 tips for success - Sheila B  Robinson&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Your survey deserves a good response rate! 10 tips for success - Sheila B  Robinson" title="Your survey deserves a good response rate! 10 tips for success - Sheila B  Robinson" srcset="https://substackcdn.com/image/fetch/$s_!21YQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 424w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 848w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 1272w, https://substackcdn.com/image/fetch/$s_!21YQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01bc1122-b147-425b-9b21-fb6a8726e1bb_664x856.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3 style="text-align: center;">&#128073; <strong><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><p></p><p>Your answers will directly shape the next quarter of AgentBuild issues. This isn&#8217;t a formality - I&#8217;m genuinely building the next stretch of this newsletter around what you tell me. I don&#8217;t want to make assumptions.</p><div><hr></div><h2>What I&#8217;m Building Next</h2><p>Based on the feedback I&#8217;ve already gathered, three things kept coming up as the most wanted next step for this community:</p><ol><li><p><strong>Ask Me Anything sessions</strong> - live, unscripted Q&amp;A where you bring your hardest production AI problems and I answer in real time.</p></li><li><p><strong>Virtual meetups</strong> - smaller group calls connecting practitioners across India, the US, UK, and everywhere else you&#8217;re reading from.</p></li><li><p><strong>A reader community forum</strong> - a space to swap notes and debate frameworks between issues, not just consume them passively.</p></li></ol><p>I&#8217;m committing to build all three. </p><p>The only question left is sequencing - which one should I do first?<br><br>Tell me in the survey above. </p><p>Thank you for being part of the community. I am focusing on delivering value to each of you. Feel free to reach out if you need any help.</p><p>Talk soon,<br>Sandi</p><h3 style="text-align: center;">&#128073; <strong><a href="https://forms.gle/8TZVQ1qKiRefLCkdA">Take the survey here</a></strong></h3><div><hr></div><p><em><span>P.S. If you&#8217;re new here - </span><strong>welcome</strong><span> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br><span>More valuable content coming your way.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Why Enterprise AI Needs an Ontology]]></title><description><![CDATA[Ontology is the most talked about topic in Enterprise AI right now. Let's explore why it is important, what it is, and how to build one.]]></description><link>https://newsletter.agentbuild.ai/p/why-enterprise-ai-needs-an-ontology</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/why-enterprise-ai-needs-an-ontology</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 25 Jul 2026 13:03:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/EVlIJyZ1g04" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Six months ago, ontology was a word you heard from librarians and pharma researchers. Now it&#8217;s in every third architecture review I sit in. Teams that spent 2025 building RAG pipelines are arriving at the same problem now: &#8220;<strong>retrieval works, generation is fluent, and the answers are still wrong. WTF!&#8221;</strong></p><p>Palantir built a business on this word. Every catalogue vendor has quietly rebadged its glossary as a semantic layer. Features tagged with the word &#8220;Ontology&#8220; are being released. </p><blockquote><p>Underneath the marketing there&#8217;s a real engineering shift, and it&#8217;s worth separating the two.</p></blockquote><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Why Ontology matters for enterprise AI?</h2><p>An LLM reads your data. It doesn&#8217;t understand your business, and nothing in your stack is currently telling it the difference.</p><p>Ask three systems what a customer is. Sales counts anyone who signed. Support counts anyone with a login, which sweeps in two people who never bought. Finance only counts accounts that have paid an invoice. The gap between those definitions is real money, and the only place it&#8217;s written down is in the head of the employees.</p><p>So when someone asks the AI how many customers you have, retrieval pulls all three definitions into the same context and the model hands back one number. It won&#8217;t mention that it merged three incompatible populations to get there, and you&#8217;ve got nothing to check it against.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zJ9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 424w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 848w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png" width="1424" height="1186" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1186,&quot;width&quot;:1424,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/208351996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 424w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 848w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!zJ9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c7d7d9-3411-4855-b304-bd881d62d4de_1424x1186.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A glossary won&#8217;t save you, because a glossary is written for people to read, not for a pipeline to enforce. A tidier schema won&#8217;t either. A foreign key can say two tables are related; it can&#8217;t say what the relationship means. That missing layer is what an ontology holds, in a form the machine reads at query time rather than a form a human reads in a wiki.</p><p>It becomes even more serious in the write path. A chatbot that miscounts customers gives a wrong answer. An agent that miscounts and can act on it does something about it, mails the wrong segment or moves the wrong forecast. That&#8217;s roughly when the word &#8220;ontology&#8220; started coming up in architecture reviews.</p><div><hr></div><h2>What is an Ontology?</h2><p>The textbook definition is Gruber&#8217;s: </p><blockquote><p>an ontology is a <em>formal, explicit specification of a shared conceptualisation.</em></p></blockquote><p>Let&#8217;s look at the four words:</p><ul><li><p>A <em>conceptualisation</em> is the abstract model of what exists in a domain. It&#8217;s already in everyone&#8217;s head, whether written down or not. </p></li><li><p><em>Explicit</em> means it&#8217;s written down. </p></li><li><p><em>Formal</em> means a machine can act on it, not just a person read it. </p></li><li><p><em>Shared</em> means it&#8217;s agreed and owned across a community, not one architect&#8217;s private diagram.</p></li></ul><p>Mechanically, you write statements as triples: subject, predicate, object. </p><p>Here&#8217;s a fragment in Turtle:</p><pre><code><code>:Customer    a  owl:Class .
:PayingCustomer  rdfs:subClassOf  :Customer .
:placed      a  owl:ObjectProperty ;
    rdfs:domain  :Customer ;
    rdfs:range   :Order .</code></code></pre><p>The last block says something a foreign key cannot: <code>placed</code> only ever runs from a customer to an order. Assert that some account placed an order, and a reasoner infers the account is a customer. Nobody typed that fact. It follows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XtNc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XtNc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 424w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 848w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!XtNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:193734,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/208351996?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XtNc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 424w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 848w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!XtNc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814b3a82-e1d6-422f-b464-93c8a7794488_1506x1116.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then you query the meaning instead of the tables:</p><p>sparql</p><pre><code><code>SELECT ?customer WHERE {
  ?customer  a        :PayingCustomer ;
             :placed  ?order .
}</code></code></pre><p>This returns paying customers across every source system feeding the graph, because the definition of &#8220;paying customer&#8221; lives in one place now instead of three. That&#8217;s the line between a schema and an ontology. </p><blockquote><p>A schema constrains data for one application. An ontology models a domain for many, and it entails things you never wrote down.</p></blockquote><div><hr></div><h2>How to actually build one</h2><p>This is very new for most companies. There is no fromal playbook - but I can see a number of guidances coming out. There are many issues I see with ontology imlementation. Usually a modelling team would take nine months to produce two thousand classes, and nobody uses it. That&#8217;s costly.</p><p>Given what I have learnt so far, I can roughly put some thoughts on the implementation, already working ins ome enteprrises: </p><ol><li><p><strong>Start with competency questions. </strong>Write the twenty questions the ontology must answer, in business language, before you model anything. &#8220;Which counterparties have aggregate credit exposure above &#163;50m across all subsidiaries?&#8221; If your model answers it, that part is done. If you can&#8217;t write the questions, you don&#8217;t have a use case, you have a vocabulary project.</p></li><li><p><strong>Reuse before you build.</strong> FIBO already models counterparty, legal entity, and financial instrument, with a decade of EDM Council work behind it. SNOMED CT has done clinical terms. Your novel IP is the last 10% specific to your firm, not the definition of a legal entity. Reuses existing artefacts.</p></li><li><p><strong>Treat it as software.</strong> Ontologies rot faster than code because nobody owns them. Put the files in Git. Write SHACL shapes as your tests and run them in CI, so a change that breaks a downstream contract fails the build rather than a quarterly report. Give every module a named business owner who signs off changes, and version it properly.</p></li><li><p><strong>Ship thin vertical slices tied to one workflow. </strong>One agent, one domain, one set of competency questions, in production. The organisational fight you&#8217;re picking is agreement on what words mean, and that fight is much easier to win on a small surface with a working demo behind it.</p></li></ol><div><hr></div><h2>The takeaway</h2><p>The ontology conversation isn&#8217;t a semantic web revival. It&#8217;s what happens when systems start acting on their own and the industry discovers it never wrote down what anything means.</p><p>I went deep on this with Jessica Talisman, who has spent her career on taxonomy and ontology work at the sharp end of large organisations. We got into where taxonomies stop and ontologies start, what breaks at enterprise scale, and why most of the failures are organisational rather than technical. Spend sometime this weeked, watch it, and let me know how you found it.</p><div id="youtube2-EVlIJyZ1g04" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;EVlIJyZ1g04&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/EVlIJyZ1g04?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Hope you enjoy it.<br>Happy Weekend.</p><p>Talk soon, <br>Sandi</p><div><hr></div><p><em><span>P.S. If you&#8217;re new here - </span><strong>welcome</strong><span> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br><br><br><span>More valuable content coming your way.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><p>Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why AI-written tests pass but still miss the bug]]></title><description><![CDATA[When an AI writes both your code and your tests, the tests stop protecting you. I write about this problem in plain terms and provide a step-by-step fix.]]></description><link>https://newsletter.agentbuild.ai/p/why-ai-written-tests-pass-but-still</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/why-ai-written-tests-pass-but-still</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 18 Jul 2026 13:02:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/04aec3b5-90f4-4b90-a3df-d7c295be9bd9_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>I have been building a lot usign coding agents nowadays. I mostly use Claude Code in VS Code and Cursor. While using Databricks I love using Genie Code - it keeps all the context from the lakehouse and makes it easy to build reliable ML or AI solutions.  </span></p><p><span>If you are buidling with coding agents, you have surely faced this problem. You ask the coding agent to build a feature, it writes the code, writes the tests, and reports success. However, you still find bug was there the whole time. The tests didn&#8217;t catch it. This is a common problem and in this article I will share what works for me most of the time.</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3><span>Why this happens</span></h3><p><span>Think about what a test is actually for. A test is a second opinion. You write code that you </span><em><span>think</span></em><span> is right, and you write a test that checks whether it really is. </span><strong><span>The value comes from those two things being separate.</span></strong><span> The code is your attempt. The test is the check on your attempt. If they disagree, you&#8217;ve caught something.</span></p><p><span>Now here&#8217;s what goes wrong with AI.</span></p><p><span>When you ask an AI to write the code </span><em><span>and</span></em><span> the tests in one go, you lose the separation. This creates a </span><strong><span>correlated failure</span></strong><span> or </span><strong><span>model bias propagation</span></strong><span>. Because the LLM shares a &#8220;latent space&#8221; between the test and the implementation, it is statistically likely to produce tests that validate its own mistakes-the model simply predicts the most probable test code given the most probable implementation code it just generated. The code has the bug, and the test is written to expect the buggy behaviour.</span></p><p><span>Consider a simple shopping cart: you ask the AI to calculate the total price, including a 10% tax. The AI rushes the job and writes a calculation function that accidentally skips the tax entirely. Then, it immediately pivots to writing the test. Because the AI is still &#8220;thinking&#8221; about the buggy code it just wrote, it creates a test that expects the total without the tax.</span></p><p><span>Now, you have a buggy function that ignores tax, and a test that celebrates that exact result. The test doesn&#8217;t flag the error because it wasn&#8217;t designed to check for the correct business requirement, it was designed to match the code&#8217;s current, buggy behavior. Everything goes green, even though the feature is fundamentally broken.</span></p><p><span>The test didn&#8217;t fail you because it was a bad test. It failed you because it was written by the same thing that wrote the bug. It&#8217;s marking its own homework.</span></p><p><span>And it gets worse at scale. One developer writing careless tests writes a few. An AI writes dozens in seconds - all neat, all passing, all quietly checking for the wrong thing.</span></p><div><hr></div><h3><span>How I fix this problem</span></h3><p><span>The fix is to put the separation. You want the tests written by something that has </span><em><span>not</span></em><span> seen the code and </span><em><span>cannot</span></em><span> change it. That&#8217;s the whole idea. Everything below is just how to set that up.</span></p><p><span>If you&#8217;re using Claude Code, you do this with something called a </span><strong><a href="https://code.claude.com/docs/en/sub-agents"><span>sub-agent</span></a></strong><span>. A sub-agent is just a helper with a specific job and its own limited set of permissions. You create a sub-agent by adding a small text file to your project or from the terminal on Claude code. </span></p><p><span>In this case, you have to make two sub-agents: </span></p><ul><li><p><span>one that only writes tests</span></p></li><li><p><span>one that only writes code</span></p></li></ul><p><strong><span>The trick is in what each one is </span></strong><em><strong><span>allowed to touch</span></strong></em><strong><span>.</span></strong></p><p><span>If you aren&#8217;t using an agentic framework like Claude Code, the core concept remains the same: force a &#8220;Contextual Firewall&#8221; between your test-writing process and your implementation process. You don&#8217;t need a specific tool; you need a workflow that treats them as separate entities.</span></p><p><span>Let&#8217;s see how to do this step-by-step.</span></p><div><hr></div><h3><span>Step 1 - Create the tester, and don&#8217;t let it write code</span></h3><p><span>Add a file called test-author.md in a folder named .claude/agents/ in your project. Put this inside it:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;039408c9-6b08-4d6b-b20c-8241bd404341&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">---
name: test-author
tools: Read, Write
model: sonnet
---
Write tests based on the requirement I give you.
Do not look at the existing code first.
Write tests for what the feature is supposed to do.</code></pre></div><p><span>The important line is tools: </span><strong><span>Read</span></strong><span>, </span><strong><span>Write</span></strong><span>. This lets the tester read the requirement and write a test file - but it does </span><strong><span>not</span></strong><span> give it permission to change any existing code. </span></p><p><span>Conversely, the Coder will need read access to these tests to understand the criteria it must pass, but restricting its write access is crucial to prevent it from &#8220;hacking&#8221; the tests to suit its own buggy implementation.</span></p><div><hr></div><h3><span>Step 2 - Create the coder, and don&#8217;t let it touch the tests</span></h3><p><span>Add a second file, implementer.md, in the same folder:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;e928c465-ad04-4560-9ac4-fadc4d4c9174&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">---
name: implementer
tools: Read, Edit, Bash
model: opus
---
Make the failing tests pass by changing the code.
Never edit a test file. Never delete a test.
Keep fixing the code and re-running until the tests pass.</code></pre></div><p></p><p><span>This one is the opposite. It can edit code and run the tests (Bash lets it run them), but it&#8217;s told never to touch a test file. So it can&#8217;t cheat by weakening a test that&#8217;s in its way. Its only route to green is to actually fix the code.</span></p><blockquote><p><strong><span>Note:</span></strong><span> using different models can help, but not always - especially within the same model family, where they tend to share the same blind spots. The real independence comes from isolation and tool limits, not the model choice.</span></p></blockquote><div><hr></div><h3><span>Step 3 - Write the tests first, and read them yourself</span></h3><p><span>This step matters the most.</span></p><p><span>Give the tester the requirement - in plain English, what the feature should do. Let it write the tests </span><strong><span>before any code exists</span></strong><span>. Then, perform a </span><strong><span>Senior Engineer Review</span></strong><span>. </span></p><p><span>Position the AI as a Junior Developer generating boilerplate; your job as the Senior Reviewer is to validate the &#8220;contract&#8221; of the feature. You don&#8217;t need to write the code, but you must ensure the tests are asking for the right thing. The AI does the typing; you own the architectural judgement. </span></p><p><strong><span>Don&#8217;t try to automate this part. At least not for critical code.</span></strong></p><p><span>In the shopping cart example, you&#8217;d check: is there a test confirming the total includes tax? If yes, you&#8217;re safe. If the code later forgets the tax, that test will fail, and the bug gets caught right there.</span></p><div><hr></div><h3><span>Step 4 - Let the coder make them pass</span></h3><p><span>Now hand it to the coder. It writes the actual code, runs the tests, sees what fails, fixes it, runs again - until everything&#8217;s green.</span></p><blockquote><p><span>But this time, green means something. The tests it&#8217;s passing were written by something that never saw the code and can&#8217;t be edited by the thing writing the code. The two are genuinely separate again. The second opinion is back.</span></p></blockquote><p><span>Run through the cart example one more time. The tester, working only from your requirement, writes a test that says the total must include tax. The coder writes the function. If it forgets the tax, the test goes red, and the coder has to fix it. The bug that sailed through before now can&#8217;t get past step 4 - because the thing checking for it was never allowed to see the mistake in the first place.</span></p><div><hr></div><h3><span>Reminder</span></h3><p><span>This fixes a specific, common problem: the AI quietly agreeing with its own mistakes. It&#8217;s a real fix and it&#8217;s worth doing.</span></p><p><span>What it doesn&#8217;t fix is </span><em><span>you</span></em><span> asking for the wrong thing. If the requirement you gave the tester was wrong, you&#8217;ll get a perfectly tested version of the wrong feature. The tests can only be as right as the requirement behind them. Checking that the requirement matches what the business actually needs is your job - you need to do it.</span></p><div><hr></div><h3><span>Takeaway</span></h3><p><span>If you&#8217;re letting an AI write your code and your tests together, and trusting the green tick, be careful. That green doesn&#8217;t mean what you think it means. It means the code and the tests agree - and since the same AI wrote both, of course they agree.</span></p><p><span>Do these four things instead:</span></p><ol><li><p><span>Make a tester that can write tests but </span><em><span>can&#8217;t change code</span></em><span>.</span></p></li><li><p><span>Make a coder that can change code but </span><em><span>can&#8217;t touch tests</span></em><span>.</span></p></li><li><p><span>Write the tests first and </span><em><span>read them yourself</span></em><span>.</span></p></li><li><p><span>Let the coder make them pass.</span></p></li></ol><p><span>Separate the two, and the tests start protecting you again - which is what they were always supposed to do.</span></p><div><hr></div><h3>I love diving deep into these topics</h3><p>Some weekends I spend time with teams talking about coding agents - from the basics right through to building production-grade applications with them. Last weekend I did this with a team at a software consultancy. It was fun, and we had such a valuable exchange of ideas. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r8ri!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r8ri!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 424w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 848w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 1272w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!r8ri!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png" width="1456" height="685" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:685,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4435177,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/207530714?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r8ri!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 424w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 848w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 1272w, https://substackcdn.com/image/fetch/$s_!r8ri!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d107c1d-a8d6-43c8-ae72-87cc873cc718_3022x1422.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the best time I get to spend - speaking to people who are genuinly interested in building real things with AI, not slops.</p><p>Thanks for being a part of this community.</p><p>Talk soon,<br>Sandi.</p><div><hr></div><p><em><span>P.S. If you&#8217;re new here - </span><strong>welcome</strong><span> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br><span>More valuable content coming your way.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[1000 of you now. Why this newsletter exists?]]></title><description><![CDATA[We just passed 1,000 subscribers. I am grateful. Thank You.]]></description><link>https://newsletter.agentbuild.ai/p/1000-of-you-now-why-this-newletter</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/1000-of-you-now-why-this-newletter</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Mon, 13 Jul 2026 15:55:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/PWguaKitVrg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Okay. Let me just say this properly. </p><p>So the newsletter crossed 1,000 subscribers this week. </p><p>1,000 is nothing in newsletter world. People do that in a weekend with one lucky post. I know that. But those aren&#8217;t the thousand I got.</p><p>The thousand I got are people building AI inside banks, insurers, healthcare companies, startups, consultancies. People who reply to my emails saying &#8220;we hit exactly this last quarter.&#8221; That&#8217;s a different thousand. I&#8217;d take it over 50,000 randoms any day.<br><br>You give me space in your busy inbox - that matters a lot to me. </p><p>Thank you for that. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.agentbuild.ai/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h3>Why I started the newsletter?</h3><p> Everyone&#8217;s shouting about AI. Demos everywhere, announcements everywhere, everyone&#8217;s an expert on LinkedIn by Tuesday. But almost nobody talks about the boring part - what happens six months after the demo, when the thing&#8217;s in production, the data&#8217;s messy, the regulator&#8217;s asking questions, and someone senior wants to know why the numbers moved.</p><blockquote><p>That part. The unglamorous part. That&#8217;s the whole newsletter. Because that&#8217;s where I&#8217;ve spent my career, and honestly, that&#8217;s where yours gets made too.</p></blockquote><p>So nothing changes at 1,000. I&#8217;ll keep writing about the stuff that actually breaks - evaluation, data debt, decisions nobody wrote down. I&#8217;ll keep sharing the failures, mine included, because that&#8217;s where the lessons are. And I&#8217;ll keep reading every single reply, because half my best issues started as one of you saying &#8220;we&#8217;re seeing something weird and nobody&#8217;s writing about it.&#8221;</p><p>Keep sending me those. Seriously.</p><div><hr></div><p>One more thing. I&#8217;m not going to take up space in your inbox just to celebrate - that&#8217;s not what you signed up for.</p><p>So here&#8217;s something useful. I just published a video on why most AI projects fail. It&#8217;s everything I&#8217;ve learnt working with enterprises over the past few years - the patterns I keep seeing, and what I think actually makes these projects succeed.</p><p>Watch it here.</p><div id="youtube2-PWguaKitVrg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PWguaKitVrg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/PWguaKitVrg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Talk soon,<br>Sandi</p><div><hr></div><p><em><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">P.S. If you&#8217;re new here - </span><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">welcome</span></strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Ask your friends to join.</span></strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"><br>More valuable content coming your way.</span></em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</span></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI Agent Memory Architecture]]></title><description><![CDATA[Memory in AI Agents: What It Is, How It Breaks, and What to Do About It.]]></description><link>https://newsletter.agentbuild.ai/p/ai-agent-memory-architecture</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/ai-agent-memory-architecture</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 04 Jul 2026 13:03:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/034fba59-84eb-408a-bef7-7c85153f8c98_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The LLM you&#8217;re building on has no memory. I am sure you all know that already. Every call to the model is a fresh start. If your agent appears to remember something, that&#8217;s because you built a system around the model that stores and retrieves information and injects it back into the prompt. <strong>The model itself is stateless.</strong></p><p>So when your agent starts giving wrong answers at scale don&#8217;t look for the failure in the model. It&#8217;s in the memory system you built around it. And if you don&#8217;t understand the memory types and how they behave differently under load, you&#8217;ll spend weeks debugging the wrong layer. I have seen this happen multiple times.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3>Why Memory Architecture Is the Real Work</h3><p>Consider what happens in a real production deployment at a financial institution. An agent handles customer queries across thousands of sessions per day. It needs to know <strong>what the customer asked last week</strong>. It needs to know <strong>current product terms</strong>. It needs to know <strong>what it did three steps ago</strong> in the current task. It needs to know that when a customer says <strong>&#8220;the same account as before,&#8221;</strong> they mean their savings, not their current account.</p><p>These are four completely different information retrieval problems. Treating them as one (which is what happens when teams reach for a vector database and call it done) is where agents fall apart in production.</p><blockquote><p>Each of these problems maps to a distinct memory type. Each type has different latency characteristics, different staleness risks, different failure modes, and different architectural requirements.</p></blockquote><div><hr></div><h3>The Four Types of Agent Memory</h3><h4>1. In-Context Memory (Working Memory)</h4><p>This is whatever sits inside the current context window - the active prompt, the conversation so far, the instructions, the retrieved chunks, the tool outputs. It&#8217;s the only memory the model can directly reason over.</p><ul><li><p><strong>What it&#8217;s good for:</strong> The current task. Right now. This session.</p></li><li><p><strong>Constraint:</strong> Context windows are finite. GPT-4o gives you 128K tokens. Claude gives you 200K. They sound large until you&#8217;re injecting retrieved documents, conversation history, system instructions, and tool schemas simultaneously. You will always burn through context faster than you would expect.</p></li><li><p><strong>Failure pattern:</strong> Teams usually design for a 10-turn conversation in testing. Real users run 60-turn sessions. Context fills up, older turns get truncated, and the agent loses track of earlier constraints the user set. The agent doesn&#8217;t tell the user it&#8217;s forgotten. It just starts behaving inconsistently. And that&#8217;s dangerous.</p></li></ul><h4>2. Episodic Memory (What Happened)</h4><p>This is the log of past interactions - previous conversations, completed tasks, decisions made, outcomes observed. It&#8217;s stored externally and retrieved when relevant.</p><ul><li><p><strong>What it&#8217;s good for:</strong> Cross-session continuity. &#8220;Last time we spoke, you were working on the credit risk model.&#8221; Personalisation. Audit trails in regulated environments.</p></li><li><p><strong>Implementation:</strong> Conversation summaries or raw turns get embedded and stored in a <strong>vector database</strong>. At the start of each new session, a semantic search retrieves the most relevant past episodes and injects them into context.</p></li><li><p><strong>Failure Pattern:</strong> Episodic memory grows without bound. A user with 200 past sessions generates thousands of stored chunks. Retrieval latency climbs. Relevance degrades because older episodes are returned alongside recent ones. Teams don&#8217;t notice until p99 latency starts causing timeout errors in production.</p></li></ul><h4>3. Semantic Memory (What Is Known)</h4><p>This is factual, reference knowledge - product documentation, policy documents, regulatory guidance, knowledge base articles. It doesn&#8217;t change per user. It&#8217;s the shared ground truth the agent reasons from.</p><ul><li><p><strong>What it&#8217;s good for:</strong> Answering questions from authoritative sources. Think everything about the business. Grounding the agent in facts rather than hallucination. <strong>RAG (Retrieval Augmented Generation) is almost always semantic memory.</strong></p></li><li><p><strong>Implementation:</strong> Documents are chunked, embedded, and indexed. Queries are embedded and matched via similarity search. Top-K chunks are injected into context.</p></li><li><p><strong>Failure Pattern:</strong> Source documents change, the index doesn&#8217;t (this is very common). Nobody set up a re-indexing trigger. The agent retrieves a policy document from eight months ago with full confidence, because from the vector database&#8217;s perspective it&#8217;s still the most semantically similar result. In a regulated environment, this isn&#8217;t a UX problem. It&#8217;s a compliance problem with vulnerabilities that can cause huge penalties.</p></li></ul><h4>4. Procedural Memory (How to Act)</h4><p>This is the agent&#8217;s knowledge of how to behave - which tools to call, in what order, under what conditions. It&#8217;s not retrieved at runtime in the same way the other types are. It&#8217;s encoded in the system prompt, in tool schemas, in fine-tuned weights, or in explicit workflow definitions.</p><ul><li><p><strong>What it&#8217;s good for:</strong> Consistent behaviour across all users and sessions. If you want the agent to always verify identity before accessing account data, that&#8217;s procedural memory.</p></li><li><p><strong>Failure Pattern:</strong> Procedural memory encoded only in system prompts is brittle. Long system prompts get partially ignored as context fills. Behaviour drift emerges - the agent follows the procedure at the start of a session but deviates by turn 40. Teams don&#8217;t catch this because they test short sessions.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dM3L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dM3L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 424w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 848w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 1272w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!dM3L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png" width="1456" height="1170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1170,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4802198,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dM3L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 424w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 848w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 1272w, https://substackcdn.com/image/fetch/$s_!dM3L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c069b4e-77c3-4a5a-adcc-02cb2f410bd2_2304x1852.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Agent interaction flow with different types of memory components</figcaption></figure></div><p></p><div><hr></div><h3>How These Four Types Behave Differently at Scale</h3><p>At low volume , say hundreds of sessions per day, all four types can be bolted onto a single vector database and it mostly works. At production scale, i.e.,  tens of thousands of sessions, millions of stored episodes, documents updating continuously, each type starts failing in a distinct way.</p><p><strong>In-context memory</strong> degrades with session length. The longer the conversation, the more context is consumed, and the more the model has to work with a truncated window. At scale, you need a context management strategy: summarise older turns, compress tool outputs, prioritise what stays in window.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fhz7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fhz7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 424w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 848w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fhz7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png" width="1456" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88072,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Fhz7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 424w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 848w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Fhz7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb27222-8c4d-4baf-b28e-cd20d50694f7_1500x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">In-Context Memory Degrades in longer conversations</figcaption></figure></div><p></p><p><strong>Episodic memory</strong> degrades with corpus size. Retrieval latency grows as the episode store fills. Relevance drops as more episodes compete for the same top-K slots. At scale, you need a tiered storage strategy: hot storage for recent episodes (last 30 days), cold storage for older ones, with a recency-weighted retrieval model rather than pure semantic similarity.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wYTZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wYTZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 424w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 848w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 1272w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!wYTZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png" width="1456" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144801,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wYTZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 424w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 848w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 1272w, https://substackcdn.com/image/fetch/$s_!wYTZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a5588f0-715a-467f-8d28-75674269adbf_1600x960.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Episodic Memory degrades latency as historical data volume increases (slower answers with larger historical data volumes)</figcaption></figure></div><p><strong>Semantic memory</strong> degrades with document churn. The faster your source documents update, the faster your index goes stale. At scale, you need event-driven re-indexing triggered by document changes, not scheduled batch re-indexing that runs weekly and misses the update that happened on Tuesday.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hD_q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hD_q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!hD_q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104310,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hD_q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 424w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 848w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!hD_q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf3ba5b9-521d-4fe1-9212-caf1b991d961_1600x1067.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Semantic Memory needs data to be updated regularly or it goes stale</figcaption></figure></div><p><strong>Procedural memory</strong> degrades with task complexity. Simple, short tasks follow procedures reliably. Long, multi-step tasks in complex domains show drift. At scale, you need procedures encoded as explicit workflow graphs - not just prose in a system prompt - with checkpoints that verify the agent is still on the correct path.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pu_r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pu_r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 424w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 848w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pu_r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183935,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pu_r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 424w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 848w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!Pu_r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fb3ff55-a618-4632-9728-2043094b01cb_1600x1200.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">With complex task flows Procedural Memory degrades - agent calls wrong tools, takes incorrect actions</figcaption></figure></div><div><hr></div><h3>Architecture Choices and Optimisation Strategies</h3><p><strong>For in-context memory:</strong><br>A common pattern is to use a sliding window with summarisation. Keep the last N turns verbatim, summarise everything older into a compressed context block. If you use Claude Code - you will notice it does that in long conversations. It compresses conversations at one point. (Yes, Claude Code is an agent). <br><br>LLM-generated summaries work well here. For long-running agents, implement a context budget - allocate token limits per component (system instructions, retrieved memory, conversation history, tool outputs) and enforce them at the orchestration layer, not as an afterthought.</p><p><strong>For episodic memory:</strong><br>Separate your recent episode store from your historical episode store. Redis or a fast key-value store handles recent sessions; your vector database handles historical retrieval. I love Databricks LakeBase architecture here - LakeBase can act as the transactional store while the historical data is stored in Delta Lake. (I know Databricks plug, but it is usful to know if you are already using Databricks).<br><br> Apply recency decay to your similarity scores - an episode from yesterday should score higher than a semantically identical episode from six months ago, because context drifts. Build a summarisation pipeline that condenses completed sessions before storage, rather than storing raw turns.</p><p><strong>For semantic memory:</strong><br>Your chunking strategy is your most important decision - <strong>more important than your choice of vector database.</strong> Chunks need to be semantically coherent, not just fixed-size token windows. 512 tokens with sentence boundary respect and document-level metadata outperforms 2048-token sliding windows without metadata. Build a document change detection pipeline that triggers re-embedding on update. Track embedding model versions - if you upgrade your embedding model, you need to re-embed your entire corpus, because old and new vectors aren&#8217;t comparable.</p><p><strong>For procedural memory:</strong><br>Move away from text prose system prompts for complex procedures. Define agent behaviour as a state machine or directed graph - explicit states, explicit transitions, explicit conditions. This gives you auditability (you can log which state the agent was in at each step), testability (you can write unit tests for state transitions), and recoverability (you can restart a failed task from a known state rather than from the beginning).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vRAh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vRAh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 424w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 848w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 1272w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!vRAh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png" width="2264" height="1677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1677,&quot;width&quot;:2264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4366504,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/205030730?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce580764-4586-4316-933f-55c924f46c8a_2380x1792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vRAh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 424w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 848w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 1272w, https://substackcdn.com/image/fetch/$s_!vRAh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d843cf-3772-4ac5-aef7-7fdaaeecfc3e_2264x1677.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Summary of design approaches for different memory types</figcaption></figure></div><div><hr></div><p>You know what&#8217;s common across all four? <br><strong>Each memory type needs its own evaluation pipeline. <br><br></strong>Not just evaluation of the agent&#8217;s final output - <strong>evaluation of the memory layer itself.</strong> Did episodic retrieval return the right sessions? Did semantic retrieval return current documents? Did the agent follow the correct procedure? Did context management preserve the right information?</p><p>They need to be measured separately. And at production scale, not doing this could prove expensive, and risk reputational damage.<br><br>Now, tell me what kind of memory failure patterns  you observed in your implementations. Give me feedback - tell me how this article helps you. I want to hear more from you.<br><br>If you love listening to experts, this podcast with Denis Rothman, author of <span>Context Engineering for Multi-Agent Systems is very relevant. Denis is a thoughtleader and he describes complex topic in simple human way. You will like it.<br></span></p><div id="youtube2-384hXsu8XZA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;384hXsu8XZA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/384hXsu8XZA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Talk soon,<br>Sandi.</p><div><hr></div><p><em><span>P.S. If you&#8217;re new here - </span><strong>welcome</strong><span> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em><br><br><span>Talk soon,</span><br><span>Sandi.</span></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br><span>More valuable content coming your way.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Context Graph vs Evaluation Graph]]></title><description><![CDATA[Today: What is the difference between a context graph and and an evaluation graph - why both are important - and what questions should you ask today.]]></description><link>https://newsletter.agentbuild.ai/p/context-graph-vs-evaluation-graph</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/context-graph-vs-evaluation-graph</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 27 Jun 2026 09:59:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1ab3800f-88ac-403b-8933-fdebb3e97fb9_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Picture yourself in a restaurant where the menu changes daily. You order &#8220;the soup.&#8221; The chef makes whatever&#8217;s on today&#8217;s board. After few hours you&#8217;re not feeling great, and you go back and ask what was in the soup. The waiter pulls your order slip. It says &#8220;soup.&#8221; And yes, the kitchen did make the soup. But nobody wrote down which soup, made with what, sourced from where, signed off by which supplier. Nobody wrote any of that down next to the order. The order slip is reproducible - they can print it out again and it would say &#8220;soup&#8220;. But they cannot prove what was in the soup that could have made you sick.<br><br>That&#8217;s where most AI teams sit right now. Versioning the order slip beautifully. Not tracking what was actually in the bowl.</p><p>The fix for this isn&#8217;t a better model log. It&#8217;s a different structure that sits alongside it - what I&#8217;ve been calling an <strong>evaluation graph</strong>. Every time the AI runs, it takes a hashed, timestamped snapshot of every governance artefact in force at that exact moment: the glossary term version, the policy version, the dataset certification. So six months later, when the definition has moved from version 2.3 to 2.4, you&#8217;re not reconstructing anything. You look it up. The snapshot tells you exactly which soup the kitchen made that day, and who signed off on the recipe.</p><div><hr></div><h2>Evaluation Graph vs Context Graph</h2><p>People keep confusing this with a <strong>context graph</strong>, which is genuinely a different thing. What the difference? </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QFup!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QFup!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 424w, https://substackcdn.com/image/fetch/$s_!QFup!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 848w, https://substackcdn.com/image/fetch/$s_!QFup!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 1272w, https://substackcdn.com/image/fetch/$s_!QFup!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QFup!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png" width="1456" height="1028" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39641e74-f8db-4601-be12-e069244c0267_2720x1920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1028,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:358707,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/203809402?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QFup!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 424w, https://substackcdn.com/image/fetch/$s_!QFup!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 848w, https://substackcdn.com/image/fetch/$s_!QFup!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 1272w, https://substackcdn.com/image/fetch/$s_!QFup!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39641e74-f8db-4601-be12-e069244c0267_2720x1920.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Context Graph vs Evaluation Graph</figcaption></figure></div><p><strong>The evaluation graph is the receipt that proves what was actually served.</strong> It records: today&#8217;s menu version, which supplier the tomatoes came from, which health certification was active, what time the dish left the kitchen. Six months later, if someone asks &#8220;was this dish safe and compliant on that day,&#8221; you don&#8217;t guess, you pull the receipt and know exactly which version of &#8220;today&#8217;s soup&#8221; this was, signed off by whom. That&#8217;s <strong>provenance</strong>. It&#8217;s not about why the waiter brought you soup. It&#8217;s about proving what was true in the kitchen at that exact moment.</p><p><strong>The context graph is the waiter&#8217;s reasoning for why you got soup at all.</strong> Maybe you said &#8220;I&#8217;m not very hungry,&#8221; the waiter remembered you&#8217;re allergic to shellfish from last visit, saw the bisque was off the board today anyway, and recommended the soup as the lightest, safest option. That whole chain - your stated preference, the remembered allergy, the menu constraint, the final recommendation is the <strong>decision lineage</strong>. If you later ask &#8220;why did you suggest soup,&#8221; the context graph is what lets the restaurant reconstruct that reasoning instead of shrugging and saying &#8220;the waiter just did.&#8221;</p><p>So: same dish, two completely different questions.</p><ul><li><p>Evaluation graph: <em>&#8220;Prove what was actually in the bowl, and that it met standards, on that specific day.&#8221;</em> (Provenance, was the input governed correctly?)</p></li><li><p>Context graph: <em>&#8220;Explain why the waiter chose this for you specifically.&#8221;</em> (Lineage, why did the agent decide what it decided?)</p></li></ul><p>A restaurant or a bank can have perfect receipts and a clueless waiter. Or a brilliant waiter with no receipts to back up a regulator's question. You need both, and they're solving for different failure modes. </p><div><hr></div><h3>What this looks like technically</h3><p>Strip away the restaurant for a moment. Here&#8217;s the conceptual shape of both graphs, and the one thing that ties them together.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L4b6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L4b6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 424w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 848w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 1272w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!L4b6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png" width="1456" height="1028" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1028,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310949,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/203809402?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L4b6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 424w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 848w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 1272w, https://substackcdn.com/image/fetch/$s_!L4b6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9840778e-3cf3-4ce5-a1e4-aa2729a10789_2720x1920.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Context Graph and Evaluation Graph connected through the RunID</figcaption></figure></div><p>A <strong>context graph</strong> is built from three kinds of nodes. <br></p><ul><li><p><strong>Entities: </strong>the customers, products, policies, and people your business already has some version of in a knowledge graph. </p></li><li><p><strong>Decision events:</strong> each time an agent or a human makes a choice, that choice becomes its own node, carrying the inputs, the policy applied, any exception made, and the outcome. </p></li><li><p><strong>Temporal state:</strong> because the graph needs to know not just what&#8217;s true now, but what was true at the moment the decision happened. Sarah was a Director in May; she&#8217;s a VP today. The graph needs to know which one mattered when.</p></li></ul><p></p><p>An <strong>evaluation graph</strong> is built differently, because it&#8217;s answering a different question. Its core node is a <strong>context snapshot </strong>taken at the exact moment a model runs, hashed and timestamped, pointing to the specific versions of every governance artefact in force at that instant: the glossary definition, the policy version, the dataset certification. Alongside that sits the <strong>run</strong> itself - the model version, the prompt template, the retrieval configuration, and a <strong>failure taxonomy</strong> that lets you diagnose, after the fact, whether a wrong answer was a model failure, a context failure, or a policy gap.</p><blockquote><p><strong>The two graphs aren&#8217;t separate systems sitting in isolation. </strong>They connect through one shared reference: <strong>the run</strong>, or the decision event itself. Every decision event in the context graph that involved a model call can carry a pointer to the evaluation graph&#8217;s snapshot for that exact run. <br><br>When someone asks &#8220;why did the agent decide this,&#8221; you walk the context graph. When someone asks &#8220;what was governing the system when it decided that,&#8221; you follow the same run ID into the evaluation graph and pull the snapshot. One graph for the reasoning, one graph for the proof, joined at the single point where the AI actually executed.</p></blockquote><p>Practically, this doesn&#8217;t require building either graph from scratch on a green field. If you&#8217;re already running something like MLflow or Databricks AI Agent Evaluation, the run node is just a thin wrapper around the run ID your platform already generates. The context snapshot capture can be a pre-run hook - a lightweight call to your catalog and glossary APIs that resolves the current versions of everything relevant, hashes them, and writes the snapshot before the model executes. The heavier lift is the context graph side, because that one has to live inside the execution path - you can&#8217;t capture a decision event you weren&#8217;t watching for when it happened.</p><div><hr></div><h2>What I&#8217;d actually do about it</h2><p>These concepts are new and pretty early for many organisations. My advise is to be congnizant and ask questions for every AI build that passes through the architecture team. So, before your next model goes anywhere near a regulated workflow, ask one question out loud in the project meeting: if a regulator asks us to reproduce this exact answer in six months, what&#8217;s allowed to change underneath us between now and then?</p><p>Then write down every governed artefact that answer depends on. Glossary terms. Policy versions. Dataset certifications. For each one, name who owns it and how often it moves. If you can&#8217;t answer that for every item on the list, you don&#8217;t have an evaluation graph yet - you have a model log dressed up as proof.</p><p>That&#8217;s not a backlog item to schedule for next quarter. It&#8217;s the difference between &#8220;we can rerun the query&#8221; and &#8220;we can actually explain the decision.&#8221;</p><p></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;918244ac-85dd-442f-aada-8f274aa2ad63&quot;,&quot;caption&quot;:&quot;Here is a pattern I have seen more times than I can count.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Evaluation Graph: Why Your AI Pipelines Are Lying to You&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-05-02T13:31:15.010Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/980b3675-19d5-4893-85c7-521bc9ff584a_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/the-evaluation-graph-why-your-ai&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:196205889,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>Where to go next</h2><p>I&#8217;d genuinely like to know what you&#8217;re seeing on your side. Has anyone asked your team to reproduce a decision and found the same gap I&#8217;m describing? Is this something your governance and AI teams have already wired together, or is it still sitting in the gap between two calendars like it was at the bank above? <br><br>Hit reply or drop a comment. Tell me about the patterns you&#8217;re seeing, they usually end up shaping what I write next.</p><p>Talk soon,<br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em><br><br>Talk soon,<br>Sandi.</p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><p>Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI Engineer Conference Talk: The Production AI Playbook]]></title><description><![CDATA[Today: The five pillars that separate production AI from expensive pilots, the actual judge prompt we use for evaluation, and a banking case study where the model wasn't picked until week seven.]]></description><link>https://newsletter.agentbuild.ai/p/ai-engineer-conference-talk-the-production</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/ai-engineer-conference-talk-the-production</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 20 Jun 2026 13:02:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/ObTPqBGsEbA" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">I recorded a talk at the AI Engineer Conference in London in April 2026, and I&#8217;m sharing the full recording.</span></p><blockquote><p><em><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">A quick note before you watch: this was recorded in April 2026, and the pace of change in this space means a few things have already moved on. Databricks has since shipped more platform features that make some of these pillars easier to implement than I describe in the talk. My own thinking keeps shifting too, as I talk to more customers and fold new patterns into the framework. I&#8217;ll keep sharing those updates here and on the YouTube channel as they land.</span></em></p></blockquote><p></p><div id="youtube2-ObTPqBGsEbA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ObTPqBGsEbA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/ObTPqBGsEbA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Here&#8217;s what it covers.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">The talk is called </span><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">&#8220;The Production AI Playbook&#8221; </span></strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">and the core argument is this: most AI projects fail for the same five reasons, and almost none of them are about the model.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">I open with a pattern most of you will recognise: the Week 1 to 14 doom loop. Teams pick a model, build features, demo to leadership, ship, and watch it fall apart within weeks because nobody built the infrastructure underneath it. Gartner puts enterprise AI project failure above 40%. I&#8217;ve watched it happen first-hand, more than once.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">From there I walk through five pillars, each one a dependency for the next: <br>Evaluation, <br>Observability, <br>Data Foundation, <br>Orchestration, <br>Governance. </span></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"><br>Two pillars get particular depth. On evaluation, I show the actual judge prompt structure we use for LLM-as-judge scoring, including the fix for non-determinism: running each test case three times and flagging anything with high score variance before it ships. On orchestration, I cover the patterns that hold up in production against the ones that only survive in demos, including failure modes nobody puts on slides: context window bleed, cascading failures, and trust boundary violations between agents.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">The spine of the talk is a real case study: a retail bank, 18,000 calls a month, a prior attempt that burned $85,000 over six months with nothing shipped. The second attempt took eight weeks, and the model wasn&#8217;t chosen until week seven. Everything before that was evaluation and infrastructure. The result: 87% accuracy, 62% call deflection, and a tripled API-call bug caught in two hours that would otherwise have cost $43,200 a year in wasted fees.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">I also include a section on </span><em><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">what I&#8217;d do differently</span></em><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">. Three things that surprised us even after the framework held up: the test case library needs a named owner or it quietly rots, prompt version logs need to capture intent and not just the diff, and behavioural evals cost far more to run at scale than most teams budget for.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">If you&#8217;re building or running production AI, this one will be useful.</span></p><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Here&#8217;s in the link to the </span><a href="https://drive.google.com/drive/folders/1acC5n1iE_63onW0S6960cYsAdHOMxVQE"><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">resources</span></a><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"> I talk about in the video.<br><br>I aslo did an online talk in the same conference on Multi-Agent Orchestration Patterns, more tehcnical deep dive into patterns and failures modes when you build agentic workflows.</span></p><div id="youtube2-2czYyrTzILg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;2czYyrTzILg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/2czYyrTzILg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Talk soon,<br></span><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Sandi</span></strong></p><div><hr></div><p><em><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">P.S. If you&#8217;re new here - </span><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">welcome</span></strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</span></em></p><div><hr></div><p><em><strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Ask your friends to join.</span></strong><span data-color="#ead1dc" style="color: rgb(234, 209, 220);"><br>More valuable content coming your way.</span></em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><span data-color="#ead1dc" style="color: rgb(234, 209, 220);">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</span></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Context Intelligence: Why Your Agent Passes Every Test and Fails in Production]]></title><description><![CDATA[Today: The model is no longer the hard part. The advantage now sits in whether your agents know how your business actually works.]]></description><link>https://newsletter.agentbuild.ai/p/context-intelligence-why-your-agent</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/context-intelligence-why-your-agent</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Sat, 13 Jun 2026 12:22:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/aRNPLi7qNFA" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An agent quotes a customer an SLA that expired eighteen months ago. It sounded confident, the document it cited was real, and it still got the answer wrong, because the current contract never reached it.</p><p>The model did its job. What failed was everything around the model. The context. And that&#8217;s the shift worth getting your head around: the intelligence is largely a solved problem now, and the bottleneck has moved to context.</p><p>Prukalpa Sankar, Founder and Co-CEO of Atlan, puts it bluntly: with AI, context might be everything, because &#8220;the intelligence is already here.&#8221; The model is the easy part. The hard, durable, defensible part is whether your agents understand how your business actually works. That understanding is what people are starting to call context intelligence.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>What context intelligence actually is</h2><p>It isn&#8217;t a bigger prompt or a better retrieval setup. It&#8217;s the infrastructure that gives an agent shared, governed, current knowledge of your organisation, plus a memory of the decisions it and its predecessors have made. Two ingredients: a map of how things relate, and a record of why things happened.</p><p>That map and that record are the context graph. A context graph is a living model of your business as a set of entities and the relationships between them, this customer, that contract, this SLA, that exception, joined to the decisions taken against them. <a href="https://foundationcapital.com/ideas/context-graphs-ais-trillion-dollar-opportunity">Foundation Capital, in their </a><em><a href="https://foundationcapital.com/ideas/context-graphs-ais-trillion-dollar-opportunity">Context Graphs</a></em><a href="https://foundationcapital.com/ideas/context-graphs-ais-trillion-dollar-opportunity"> essay</a> by Jaya Gupta and Ashu Garg, made the sharpest version of the argument: the durable asset isn&#8217;t the data an agent reads, it&#8217;s the decision trace it leaves behind. What was gathered, what rule applied, why an action was allowed. Capture that, and precedent becomes something an agent can look up instead of guess at. The agent stops having data with no judgement and starts having judgement.</p><div><hr></div><h2>Why this is the accuracy story</h2><p>Most enterprise agents fail on a trust gap, not a model gap. The SLA agent didn&#8217;t need a cleverer model. It needed to know which contract was current, that it was allowed to act on it, and what had been decided in similar cases before. None of that lives in the model. All of it lives in the context.</p><p>Without it, you get what Prukalpa calls context sprawl: every agent building its own private, partial view of the world, none of them agreeing on what &#8220;active customer&#8221; even means. Fifty agents, fifty versions of the truth, no shared map. Accuracy in that environment isn&#8217;t a model property. It&#8217;s an infrastructure property.</p><p>This is where the runtime and the infrastructure get confused. <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Anthropic&#8217;s work on context engineering</a> covers the runtime half: context is finite, and the discipline is fitting in the fewest high-value tokens at the moment of inference, not the most. That&#8217;s real, but it assumes the right context already exists to be selected. Context intelligence is the layer below it, the one that decides what context exists, whether it can be trusted, and whether the agent may use it. One is what you put in the window. The other is what&#8217;s available to put there at all.</p><div><hr></div><h2>How to think about building it</h2><p>You can read most failures here as three debts coming due. </p><ul><li><p><strong>Data Debt:</strong> no single governed source of what&#8217;s true, so your agents disagree.</p></li><li><p><strong>Decision Debt:</strong> nobody captured why past actions were taken, so the context graph has no memory. </p></li><li><p><strong>Evaluation Debt:</strong> no framework to check whether the context an agent actually used was the right context. Work out which one is biting and you know where to start.</p></li></ul><p>The build order matters more than the architecture diagram. The instinct is to spend two years plumbing every system into a perfect context layer before anything ships. Prukalpa&#8217;s advice is the opposite, and it&#8217;s right: bootstrap from the systems you already have, the CRM, the ERP, the BI definitions, get the context layer roughly 80% of the way there, and let the flywheel start turning. Every decision an agent makes then becomes institutional memory the next agent inherits. You don&#8217;t design the context graph up front. You grow it.</p><p>Which is why this isn&#8217;t really an AI problem at heart. It&#8217;s the next turn of data engineering: <strong>context as a governed product, with owners, versions, and tests, sitting between your data and your agents.</strong> The teams who treated data as a product a decade ago have a head start. The ones still treating context as something you cram into a prompt are about to learn the difference in production.</p><blockquote><p>The open question, the one nobody at the table has a clean answer to yet, is who inside the enterprise actually owns this layer. </p></blockquote><p>I got into exactly that with Prukalpa Sankar on the podcast. She&#8217;s been arguing for the context layer longer than almost anyone, and it&#8217;s the clearest thinking I&#8217;ve heard on where this is heading. </p><div id="youtube2-aRNPLi7qNFA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;aRNPLi7qNFA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/aRNPLi7qNFA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Also, read Prukalpa&#8217;s article - <a href="https://atlan.com/context-and-chaos/issue/what-an-enterprise-context-layer-actually-is/">What an Enterprise Context Layer Actually Is</a></p><p>Enjoy your weekend.</p><p>Talk soon, <br>Sandi</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em></p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br>More valuable content coming your way.</em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build an AI Agent Registry — Part 2: Risk Class and Autonomy Level]]></title><description><![CDATA[Today: Agent Registry - The enforcement layer that makes your registry more than a catalogue. What is it? how to build it?]]></description><link>https://newsletter.agentbuild.ai/p/how-to-build-an-ai-agent-registry-408</link><guid isPermaLink="false">https://newsletter.agentbuild.ai/p/how-to-build-an-ai-agent-registry-408</guid><dc:creator><![CDATA[Sandipan Bhaumik]]></dc:creator><pubDate>Wed, 10 Jun 2026 14:12:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2f7cc492-0927-4dfa-8106-3be6bea02709_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Where We Left Off</h3><p><a href="https://newsletter.agentbuild.ai/p/how-to-build-an-ai-agent-registry?r=36xwjn">Part 1 covered Schema and Ownership</a>: the description and accountability layer of an Agent Registry. Unity Catalog as the agent registry. AWS IAM for per-agent identity. CloudTrail for audit trails. A stack that answers the questions an audit demands: what exists, who owns it, what it can do.</p><p>That is necessary, but it is not sufficient.</p><p>Schema and Ownership describe an agent. They do not constrain it. An agent with a well-documented schema and a clear owner can still make a consequential decision without human approval, access data it should not touch, or operate at an autonomy level the business never signed off on. That is where <strong>Risk Class</strong> and <strong>Autonomy Level </strong>come in and where the registry becomes a governance control rather than a filing system.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;524d8c03-8dad-4574-8aac-45032e14b1b9&quot;,&quot;caption&quot;:&quot;The Problem&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How to Build an AI Agent Registry &#8212; Part 1: Schema and Ownership &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:193058051,&quot;name&quot;:&quot;Sandipan Bhaumik&quot;,&quot;bio&quot;:&quot;I&#8217;ve spent almost 2 decades building Data &amp; AI foundations. Now, through AgentBuild Weekly, I share how builders and founders can move beyond AI hype to create Agentic systems that think, adapt, and truly work.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c04c2-d92e-4a2e-905f-a59346e3e950_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-06-06T13:01:27.753Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcff23d1-a3ff-456d-950a-d704252082f7_1280x720.png&quot;,&quot;cover_image_alt&quot;:null,&quot;cover_image_crop&quot;:null,&quot;canonical_url&quot;:&quot;https://newsletter.agentbuild.ai/p/how-to-build-an-ai-agent-registry&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:200870763,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:8,&quot;comment_count&quot;:5,&quot;publication_id&quot;:2211527,&quot;publication_name&quot;:&quot;agentbuild.ai&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!OIBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3453368a-da00-4960-b174-e3313b941314_256x256.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3>Component 3: Risk Class - Not All Agents Carry Equal Risk</h3><p>Risk classification is the decision that determines what governance an agent receives. If you get it wrong and you either over-govern low-risk agents until teams route around the process, or under-govern high-risk agents until something goes wrong in production.</p><p>The four risk categories worth working with in a regulated environment:</p><ol><li><p><strong>Low Risk</strong>: bounded output, read-only, no consequential action. An agent that summarises documents or answers questions from a knowledge base.</p></li><li><p><strong>Medium Risk</strong>: supervised action. The agent can write or update records, but a human reviews before execution.</p></li><li><p><strong>High Risk</strong>: consequential action inside a tightly constrained boundary. The agent can execute without per-action approval, but only against approved tools, approved data paths, and fully audited systems.</p></li><li><p><strong>Critical Risk</strong>: autonomous consequential action across multiple systems, with downstream effects that are difficult or impossible to reverse.</p></li></ol><p>In Databricks, risk class is best treated as governed metadata attached to the agent assets you register. For example, on Unity Catalog models, model versions, and functions, all of which support tagging. That makes risk class visible, queryable, and reviewable across the lifecycle. If an agent gains new tools, new data access, or a broader execution boundary, the classification should be reassessed before the next promotion.</p><p>So, if you ar eon Databricks, use Unity Catalog to register the agent, its model versions, its functions, and its metadata. Use tags to record risk class. Use Unity Catalog privileges, managed authentication, and deployment-time permission checks to enforce which tools and data paths are actually reachable at runtime. If you need an explicit risk-policy engine that says, for example, a High Risk agent may call Tool A but never Tool B, that policy layer still sits outside Databricks - in an API gateway, middleware layer, or external authoriser.</p><p>That is the line between registry and policy engine. Databricks gives you the governed assets, the permissions model, and the audit surface. If you need deterministic policy decisions over agent behaviour itself, you compose that on top.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D2-T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2-T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 424w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 848w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 1272w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2-T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173493,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.agentbuild.ai/i/201449801?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D2-T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 424w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 848w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 1272w, https://substackcdn.com/image/fetch/$s_!D2-T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd25bffc3-fa81-4151-beec-3b723b3f77d0_1486x992.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Conceptual: Runtime flow of enforcing risk class rules on Agents</figcaption></figure></div><p><strong>On the AWS-native path:</strong> <a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-understanding-cedar.html">Amazon Bedrock AgentCore Gateway with Cedar policies </a>provides a similar enforcement pattern - deterministic allow/deny decisions on every tool call, with Lambda interceptors for dynamic validation. Cedar policies are authored in a declarative language and evaluated against principal, action, and resource with optional conditions over request context. Worth monitoring as it moves towards general availability.</p><div><hr></div><h3>Component 4: Autonomy Level - How Independently an Agent Operates</h3><p>Risk class tells you what an agent is allowed to do. Autonomy level tells you how much independent judgement it is permitted to exercise in doing it. These are related but distinct. A High Risk agent can still operate at L1 with human approval, or at L3 with bounded multi-step execution. The risk class constrains the action space. The autonomy level constrains the operating model.</p><p>The five levels from the registry:</p><ul><li><p>L0 - <strong>Assistive only</strong>. Generates output for human review. No execution.</p></li><li><p>L1 - <strong>Human-approved actions</strong>. The agent proposes; a human confirms before execution.</p></li><li><p>L2 - <strong>Semi-autonomous workflows</strong>. Executes within defined boundaries without per-action approval.</p></li><li><p>L3 - <strong>Goal-driven execution</strong>. Plans and executes multi-step tasks. Human oversight at checkpoints, not per action.</p></li><li><p>L4 - <strong>Multi-agent autonomy</strong>. Coordinates with other agents, spawns sub-agents, orchestrates complex workflows with minimal human intervention.</p></li></ul><p>In Databricks, autonomy level should be treated as an explicit registry attribute you manage in your own governance model, not as a built-in Unity Catalog field with native enforcement semantics. The platform gives you the places to record it, such as model and model-version metadata, but the meaning of L0 through L4 remains an operating policy you define and then enforce through workflow design, approvals, deployment controls, and runtime boundaries.<br><br>MLflow Tracing captures the full execution path - every tool call, every decision point, every input and output - linked to the agent version and autonomy level at the time of execution. In a regulatory investigation, that trace is the evidence.<br><br>So, autonomy level is declared in the registry, promotion is gated through MLflow deployment workflows, runtime execution is bounded by Databricks permissions and isolated tool execution, and trace evidence is captured through MLflow. The registry records the autonomy decision; the surrounding control plane makes it real.<br></p><p><strong>Open source alternative:</strong> Microsoft released the Agent Governance Toolkit in April 2026 under MIT licence, an open source project that addresses runtime security governance for autonomous agents. It includes execution rings inspired by CPU privilege levels, kill switches for emergency agent termination, and circuit breakers. It maps directly to the <a href="https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/">OWASP Top 10 for Agentic Applications (2026)</a> and is the most purpose-built open source option currently available for autonomy-level enforcement.</p><div><hr></div><h3>What the Registry Now Does</h3><p>Across both parts, the four components work as a single control system.</p><p>Schema tells the registry what the agent is. Ownership tells it who is accountable. Risk Class tells it what level of control the agent requires, and that classification is carried as governed metadata across the agent&#8217;s registered assets. Autonomy Level tells it how much independent judgement the agent is permitted to exercise, and that decision is enforced through release workflows, runtime permissions, and execution boundaries rather than left implicit in code.</p><p>The audit request scenario from Part 1 - fourteen agents, nobody can answer, is no longer possible. Every agent has a schema record, an owner, a declared risk class, an explicit autonomy level, governed access to tools and data, and an execution trail that can be reconstructed through MLflow and platform audit logs. The registry is not a reporting artefact. It is the control plane that makes autonomous operation in a regulated environment defensible.</p><div><hr></div><p><em>P.S. If you&#8217;re new here - <strong>welcome</strong> &#127881;. AgentBuild is a community of practitioners working through the real challenges of getting AI into production inside large organisations. Every week I share practical, grounded thinking from the people doing this work at the sharp end. The goal is never theory - it&#8217;s always: what can you use Monday morning.</em><br><br>Talk soon,<br>Sandi.</p><div><hr></div><p><em><strong>Ask your friends to join.</strong><br><br>More valuable content coming your way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share agentbuild.ai&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://newsletter.agentbuild.ai/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share agentbuild.ai</span></a></p><p>Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.agentbuild.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading agentbuild.ai! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>