<?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[The Glass Box]]></title><description><![CDATA[A transparent look at building production AI. No hype, no black boxes. Just code, architecture, and the journey of an AI Architect.]]></description><link>https://www.nudurupati.co</link><image><url>https://substackcdn.com/image/fetch/$s_!ysUW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff412fd5b-35d5-42f6-803d-d66d82d2fa8b_1280x1280.png</url><title>The Glass Box</title><link>https://www.nudurupati.co</link></image><generator>Substack</generator><lastBuildDate>Sat, 09 May 2026 11:32:51 GMT</lastBuildDate><atom:link href="https://www.nudurupati.co/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sreeram Nudurupati]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[nudurupati@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[nudurupati@substack.com]]></itunes:email><itunes:name><![CDATA[Sreeram Nudurupati]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sreeram Nudurupati]]></itunes:author><googleplay:owner><![CDATA[nudurupati@substack.com]]></googleplay:owner><googleplay:email><![CDATA[nudurupati@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sreeram Nudurupati]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Context Graphs]]></title><description><![CDATA[My journey in context graphs started to solve the AI hallucination problem by grounding it in context. Here I am now, experiencing an agent-centric paradigm shift first-hand.]]></description><link>https://www.nudurupati.co/p/context-graphs</link><guid isPermaLink="false">https://www.nudurupati.co/p/context-graphs</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 04 May 2026 19:33:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ysUW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff412fd5b-35d5-42f6-803d-d66d82d2fa8b_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Have you ever seen a database centered on AI-Agents?</h4><p>A few weeks ago, I wrote about the &#8220;dumb storage, smart index&#8221; pattern, which I traced across seemingly independent technologies like Delta Lake for data lakes, MCAP for Physical AI, and turbopuffer for object-storage based vector search.</p><p>In my search for this pattern extending to graph databases, I have encountered the old guard like Neo4J, which just slapped a vector database and text-search engine onto a graph database, a disjointed system lacking a unified query planner where results are orchestrated at the application layer. I&#8217;ve also encountered neo-modern graph databases like ArangoDB, which is natively multi-modal, has a unified query planner and DSL, but is very human-centered, and treats AI like an afterthought. Where AI Agents have to learn to use a query language designed for humans.</p><p>I came to the conclusion that traditional databases have been designed around humans in the loop. People design the schema, people write the queries, people manage state, and finally decide what to persist. The human-in-the-loop assumption is baked into every layer of the database, and that is the real limitation we are imposing on AI agents. Thus, I had given up my search and set out on building my own reference architecture for an &#8220;autonomous-context-fabric&#8221; with Memgraph as my graph substrate, until I was introduced to Omnigraph recently.</p><h4>Enter Omnigraph</h4><p>Omnigraph is a versioned property graph database built on Lance, designed to be read from and written to by AI agents rather than humans. It treats typed graph data like code with branch, commit and merge semantics. So I set out to replace Memgraph in my reference architecture with Omnigraph, and the first thing I noticed was a sheer lack of a Python SDK or fully documented API docs. What I found instead in its GitHub repo was a project structure recommendation with a CLAUDE.md file and two agentic skills to get started with. This is an architectural shift away from people-centric SDKs to AI Agents synthesizing their own SDK based on the existing schema.</p><p>This is a fundamental paradigm shift. Omnigraph is designed from the ground up with an &#8220;Agent-centric&#8221; approach. Omnigraph assumes an AI in the loop and is designed for AI agents to read the schema, understand the graph topology, and synthesize their own query language dynamically.</p><p>My retrofit of Omnigraph with Memgraph was fairly easy once I enabled the published skills in my AI Agent (Gemini CLI) and let it design the schema and the queries by itself. Once the swap was complete and I ran the latency numbers, they couldn&#8217;t match for Memgraph&#8217;s purely in-memory engine, but were completely acceptable considering the trade-offs of S3-native persistence and agentic AI-centered paradigm. Though I am told by a source very close to Omnigraph that tiered storage is in the works to help with the latency numbers.</p><p>However, given my years of experience in the enterprise data space, what I really wanted to understand was whether this architecture scales and finds enterprise adoption. So I looked deeper into Omnigraph&#8217;s design philosophy, especially two of the core principles on which Omnigraph was built.</p><h4>The Central Planning Problem [1]</h4><p>SaaS sprawl, tools that don&#8217;t talk to each other, each fragments enterprise knowledge, and each locks a version of the schema. This is a problem that enterprises have been grappling with for decades now, and the one solution which really tried to solve this is Master Data Management or MDM. MDM tried to create a single version of enterprise truth, the &#8220;golden record for its core business data, which was bloated and failed miserably.</p><p>MDM failed for a few reasons:</p><ul><li><p>MDM required humans to agree on a schema before anything could be written. Omnigraph&#8217;s schema evolution doesn&#8217;t require committee approval because there&#8217;s no human-written client code that breaks when the schema changes. With Omnigraph, agents synthesize their own queries against whatever schema exists.</p></li><li><p>MDM had no way to handle conflicting writes gracefully except to block everything until the conflict was resolved. This is where Omnigraph&#8217;s Git-style branching comes to the rescue by sending any conflicting writes to a new branch and merging them when a confidence threshold is met.</p></li><li><p>MDM hubs were on-prem servers with their own operational burden. Omnigraph is S3-native and headless. The &#8220;dumb storage, smart index&#8221; pattern means the complexity lives in the query layer and not in an always-on process.</p></li><li><p>The MDM schema was determined by people who decided what gets persisted via ETL pipelines. Omnigraph can overcome this trap if its agents are allowed to evolve the schema and are the ones hydrating and maintaining the context graph.</p></li></ul><h4>Of Stigmergy and Ontologies</h4><p>Stigmergy is the indirect coordination of AI agents through environment modification. Agents writing to the context graph modify the ontology that other agents read from.</p><p>Oh, the dreaded ontologies, they were popular circa 2015 during the last knowledge graph wave. They went into oblivion yet again, not because the graph engines of the era weren&#8217;t good, nor because the DSL wasn&#8217;t expressive enough, nor because of the formats. What killed them was the Ontology design process as a strict prerequisite before deriving any value out of them, and those ontology engineers were a scarce and expensive resource.</p><p><em>&#8220;Ontologies define the fitness landscape over which AI agents optimize. When the ontology is clear, agents make clear decisions, when unclear they provide garbage.&#8221;[1]</em></p><p>But who makes the ontology clear? Based on what I know so far, I can formulate a thesis.</p><p>Since Omnigraph is agent-centric, AI agents infer and evolve the schema from the data itself. Ontology drift is handled by schema branching, where an agent can propose a change to the ontology on a new branch, validate it against real queries, and merge only when a certain confidence threshold is met.</p><p>I put the first part of the thesis in practice in my &#8220;<a href="https://github.com/snudurupati/autonomous-knowledge-fabric">autonomous-context-fabric</a>&#8221; reference architecture, where my AI agent (Gemini CLI), given its existing knowledge of my problem domain, was successfully able to synthesize the relevant schema. In future iterations, I fully intend to test ontology drift using my planned agent swarm.</p><h4>Conclusion</h4><p>We have seen compute become ephemeral over the last decade owing to durable cloud storage. The team at Omnigraph envisions a future where enterprise software becomes thinner, and the context becomes thicker [1].</p><p>My journey in Context graphs started off to solve the AI hallucination problem by trying to ground it in context. But here I am now, experiencing an agent-centric paradigm shift first-hand and completely onboard with Omnigraph&#8217;s vision: <strong>&#8220;The beginning of Infinity&#8221;</strong> [1], where the durable system of record of an AI-native organization becomes a governed context graph, and enterprise applications become increasingly transient.</p><h4>Next Steps</h4><p>While the team at Omnigraph is busy executing their vision, my mission is to build the application layer, the &#8220;<a href="https://github.com/snudurupati/autonomous-knowledge-fabric">autonomous-context-fabric</a>&#8221;, and watch it grow ever so thin as Omnigraph matures.</p><h5>References: <a href="https://modernrelay.com/manifesto">The Knowledge-Coordination Manifesto [1]</a></h5><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[The Ghost Node Pattern]]></title><description><![CDATA[Why I Built a "Waiting Room" for Enterprise AI Data]]></description><link>https://www.nudurupati.co/p/the-ghost-node-pattern</link><guid isPermaLink="false">https://www.nudurupati.co/p/the-ghost-node-pattern</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Tue, 21 Apr 2026 14:14:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Slgd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my <a href="https://www.nudurupati.co/p/i-measured-my-ai-pipeline-the-number">last post</a>, I broke down the latency metrics of my streaming graph pipeline. Hitting a sub-15ms P95 ingestion time felt like a massive win for the architecture, until I actually looked at the topology of what I was ingesting. I had successfully built a high-speed pipe, but I quickly realized I was using it to build a data swamp.</p><p>When building standard data pipelines over the last 18 years, the primary goal has almost always been throughput: get the data from Source A to Destination B as fast as possible. But when building an AI Context Engine, a hyper-eager pipeline is actively dangerous.</p><p>If you connect a firehose of enterprise events directly to Memgraph, the pipeline&#8217;s eagerness becomes its biggest liability. Imagine a sales rep fat-fingering a Salesforce update for &#8220;Microsft&#8221; instead of &#8220;Microsoft.&#8221; A naive streaming pipeline instantly writes a brand new, isolated node into the graph for that typo. Your AI agent now has fractured context and is reasoning over hallucinated entities.</p><p>It&#8217;s the <strong>Bootstrap Problem</strong>: how do you start building a graph from a firehose of noisy events without instantly turning it into a hallucination factory?</p><h3>The Architecture: Building the GhostNodeManager</h3><p>To solve this, I had to fundamentally change how data moves in Sprint 14.</p><p>Before this sprint, the ingestion scripts (<code>sec_ingestion.py</code> and <code>synthetic_crm.py</code>) were taking events and throwing them straight over the wall into the resolution engine, and then directly into Memgraph. I needed a bouncer at the door.</p><p>I built the <code>GhostNodeManager</code> into the routing layer (<code>pipelines/routing.py</code>). Instead of acting as a pure passthrough, it uses Pathway&#8217;s stateful stream processing capabilities to hold events in a temporary memory buffer. These buffered events are called <strong>&#8220;Ghost Nodes&#8221;</strong> because they exist in the stream&#8217;s state, but they are strictly forbidden from materializing in the graph database yet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Slgd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Slgd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 424w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 848w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 1272w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Slgd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png" width="1456" height="2421" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2421,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:779153,&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://www.nudurupati.co/i/194918420?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.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_!Slgd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 424w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 848w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.png 1272w, https://substackcdn.com/image/fetch/$s_!Slgd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f93dc5-1887-40ca-ba4a-7e2cb254f919_3331x5539.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"><svg role="img" 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"><g><title></title><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"><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"><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>The Code Logic: Eagerness vs. Skepticism</h3><p>When a new <code>AccountEvent</code> arrives, the <code>GhostNodeManager</code> runs it through an evidence checklist before allowing it to touch the graph. Here is exactly what the logic is doing under the hood:</p><ul><li><p><strong>The &#8220;Strong Signal&#8221; Fast-Track:</strong> The code checks the event for definitive identifiers. Does this event have a verified <code>cik_number</code>, an exact <code>company_domain</code>, or a hard <code>account_id</code>? <em>If Yes:</em> The event skips the waiting room. It is instantly promoted, sent through the resolvers, and written to Memgraph.</p></li><li><p><strong>The &#8220;Corroboration&#8221; Waiting Room:</strong> If the event only has a fuzzy text string (like <code>company_name = "Globel Corp"</code>), the code parks it in the stateful buffer and starts a time window. It waits to see if <em>another</em> distinct event arrives with that same fuzzy name. <em>If 2+ events accumulate:</em> The code decides this isn&#8217;t a one-off typo; it&#8217;s a real (if poorly named) entity. The threshold is met, and the batch of events is flushed out of the buffer and promoted to Memgraph. <em>If no other events arrive:</em> The ghost node eventually expires and is dropped entirely, saving the graph from permanent pollution.</p></li></ul><h3>Skepticism at the Ingestion Layer</h3><p>The biggest lesson from this architectural pivot is shifting the mindset from standard data engineering to context engineering.</p><p>In traditional pipelines, the goal is pure throughput. But when we are feeding an LLM, real-time context is completely useless if the underlying graph is flooded with noise. The only way an LLM agent can reason accurately is if the graph it queries has been aggressively defended against bad data at the ingestion layer.</p><p>We need to teach our context engineering pipelines to be skeptical rather than mere dumb pipes.</p><p><em>See you next week.</em></p><div><hr></div><p><strong>The repository:</strong> <a href="https://github.com/snudurupati/autonomous-knowledge-fabric">github.com/snudurupati/autonomous-knowledge-fabric</a></p><div><hr></div><p><strong>Sreeram Nudurupati</strong> | <a href="https://www.linkedin.com/in/snudurupati">LinkedIn</a></p><p><em>AI Architect | Building the Autonomous Knowledge Fabric in public: 90 days, no hand-waving.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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 Object Storage is Eating the Database World]]></title><description><![CDATA[When you scrub a YouTube video to 2:16, your browser doesn&#8217;t download the entire video file from the beginning. Instead, it sends an HTTP request with a Range header telling the server, &#8220;give me bytes 10, 230,000 to 10, 432, 000. The server only returns that slice.]]></description><link>https://www.nudurupati.co/p/why-object-storage-is-eating-the</link><guid isPermaLink="false">https://www.nudurupati.co/p/why-object-storage-is-eating-the</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 13 Apr 2026 06:15:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ysUW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff412fd5b-35d5-42f6-803d-d66d82d2fa8b_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Pattern</h2><p>Dumb storage coupled with a smart index and a ranged GET request is what made the decoupling of compute and storage in the modern cloud era. This pattern was first invented and made possible by the <em><strong>HTTP range header</strong></em>, making HTTPS requests formatted as Range: bytes=X-Y. A standard HTTP feature since 1999.</p><p>When you scrub a YouTube video to 2:16, your browser doesn&#8217;t download the entire video file from the beginning. Instead, it sends an HTTP request with a Range header telling the server, <em>&#8220;give me bytes 10, 230,000 to 10, 432, 000&#8221;</em>. The server only returns that slice. Any modern object store, whether it be AWS S3, Google Cloud Storage, or Azure ADLS, supports the same HTTP ranged request natively. So instead of downloading 10 GBs worth of parquet files and reading like 6 row groups out of it, you can ask S3 for exactly the byte ranges of those row groups, provided you have a smart index that can tell you which byte range those 6 row groups are in. S3 doesn&#8217;t care what&#8217;s in those bytes; it just serves it up as long as the intelligence to ask which bytes to ask for lives in your index.</p><p>That&#8217;s the exact <strong>&#8220;dumb storage, smart index&#8221;</strong> pattern I explore in this post, across three distinct domains: Data Lakes, Physical AI and Robotics, and now applied to Vector Search at scale.</p><p>You might ask, if the technology has existed since 1999, why has the primitive only now caught on? The answer is a few recent advancements that have made the idea possible for data architectures, owing to a few notable advancements in the last decade.</p><h3>The Latency Layer: NVMe in Cloud (2017)</h3><p>NVMe killed the SATA bottleneck. For high-performance systems like Databricks or Snowflake, or turbopuffer, this is the essential &#8220;hot/cold&#8221; divide: <strong>hot data stays on local NVMe</strong>, while cold data sits on S3. This local SSD caching is exactly what makes sub-10ms latency possible; without it, S3 round-trips would destroy performance.</p><h3>S3 Strong Consistency (2020)</h3><p>Before 2020, S3 was &#8220;eventually consistent,&#8221; making it a nightmare for databases to perform immediate reads after writes. The shift to <strong>strong consistency</strong> was the &#8220;floodgate&#8221; moment. It transformed object storage from a simple dumping ground into a viable transactional substrate, ending the era of complex workarounds.</p><h3>The Concurrency Fix: S3 Compare-and-Swap (2024)</h3><p>Compare-and-swap (CAS) was the final piece of the puzzle. Until late 2024, S3 lacked this fundamental concurrency primitive, without which two concurrent writers could corrupt shared state. Forcing architects to use external coordinators like DynamoDB to safely create a metadata layer where multiple concurrent writers could safely update the same state. Now that S3 supports atomic updates, the entire metadata layer can live on object storage.</p><p>So now that all the technology advancements have brought us to this point in time, let me show you how the <strong>&#8220;dumb storage, smart index&#8221;</strong> pattern is already being implemented across 3 distinct domains.</p><h2>Why Now?</h2><p>This week, AWS announced S3 Files: S3 buckets accessible as POSIX file systems. Legacy file-based applications can now read and write S3 directly without code changes. Object storage isn&#8217;t just eating databases anymore. It&#8217;s set to eat file systems too.</p><h2>Part 1 - Delta Lake (or your favorite kind of lettuce)</h2><p>Delta Lake (or Iceberg or Hudi) implements a transaction log that acts as a metadata-based index, speeding up query performance through file-level statistics, partition pruning, and file pruning. The transaction log helps a reader/writer get to the exact files required for the current operation over an object storage like S3. This is a common &#8220;dumb storage, smart index&#8221; pattern developed by Databricks over the last decade that has significantly eaten into legacy data warehouse revenues (RIP Teradata and Netezza), and forced proprietary data warehouses like Snowflake to reluctantly adopt open formats like Iceberg.</p><h2>Part 2 - Physical AI and MCAP</h2><p>Most engineers don&#8217;t know this one. MCAP is an open standard much like Apache Parquet, designed by Foxglove to efficiently store and retrieve Robotics telemetry data. Follows a similar pattern where each MCAP file contains a Summary section (transaction log) and Chunk offsets (Parquet row groups). Where a reader could fetch the exact data required using three ranged GETs instead of one full download.</p><p>The Summary section at the end of every MCAP file is a chunk index: it records the byte offset and length of every chunk in the file, along with which topics it contains.</p><p>Three ranged GETs to retrieve only what you need:</p><ol><li><p><strong>Footer</strong> (28 bytes) - where does the Summary section start?</p></li><li><p><strong>Summary section</strong> - which chunks contain <code>/robot/status</code>, at what offsets?</p></li><li><p><strong>Only those chunks</strong> - everything else is never touched.</p></li></ol><p>In production, MCAP files span hours of multi-robot telemetry, and this pattern skips gigabytes of unrelated sensor data.</p><h2>Part 3 - Vector Search (turbopuffer and LanceDB)</h2><p>Vector Search and Vector Databases are the backbone of every production AI application. However, we seem to be repeating the same pattern that we adopted in the legacy data warehouse world, i.e., use proprietary databases (Pinecone, Weaviate). With the cost of LLM token consumption spiralling, it doesn&#8217;t make any economic sense to add yet another proprietary black-box database to the mix. So how can we implement the same &#8220;dumb storage, smart index&#8221; pattern in the vector search world? That&#8217;s exactly what I have tried to implement in the demo codebase I built for this post.</p><p>My approach was to store embeddings in an object store, which solves the storage cost problem. Then my approach was to download all the vectors onto my system memory and perform a local cosine-similarity search. This works well with my demo dataset of around a thousand vector embeddings. However, I have scaled enough data pipelines in my career to know that my approach is pretty naive and would break as soon as I hit just GBs of vector embeddings.</p><p>The scalable, production solution is the same 3-step GET sequence as MCAP. A small index on S3 first (HNSW/IVF), ranged GET to find which embedding clusters match your query vector, and then ranged GET only those clusters.</p><p>I realized during building this demo that implementing a smart vector index is not a trivial problem to solve over a weekend. Thankfully, we have the likes of turbopuffer and LanceDB already solving for this.</p><h2>Why Should I Care?</h2><p>The <strong>&#8220;Dumb Storage, Smart Index&#8221;</strong> architecture is the strategic pivot that separates AI POCs from production-grade solutions.</p><p>Cursor pioneered this playbook. They were storing billions of vectors across millions of codebases, every index kept in memory, leading to astronomical costs. Moving to turbopuffer&#8217;s object-storage-native architecture cut their costs by 95%. But here&#8217;s the more interesting part: they didn&#8217;t just save money, they immediately started creating more vectors per user than before.</p><p>When infrastructure costs shrink, product ambition expands. Features that were shelved come back. That&#8217;s the real &#8220;so what&#8221; of this pattern. If you&#8217;re building on Pinecone, Weaviate, or Elasticsearch today, the question isn&#8217;t whether to move; it&#8217;s when. The architectural shift has already happened. The teams that adopt this pattern first build features that their competition can&#8217;t afford to build.</p><p>If you want to see the full pattern implemented across all three domains, Delta Lake, MCAP, and Vector Search, running against a local MinIO object store, the code is here: <a href="https://github.com/snudurupati/vectors-at-rest">github.com/snudurupati/vectors-at-rest</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[98% Less Physical AI Data. Zero loss of operational context.]]></title><description><![CDATA[How I implemented 'delta-keyframe-heartbeat' pattern to Robotics data.]]></description><link>https://www.nudurupati.co/p/98-less-physical-ai-data-zero-loss</link><guid isPermaLink="false">https://www.nudurupati.co/p/98-less-physical-ai-data-zero-loss</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 30 Mar 2026 18:50:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!E-th!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was simulating a robot fleet to generate meaningful data for my &#8220;Physical Context Fabric,&#8221; the ChatGPT moment for Physical AI, and I realized that a simulated Turtlebot3 running at 10 HZ, even if I collected every 10<sup>th</sup> event, generates approximately 1 event/second. That&#8217;s 28K events in 8 hours just for one robot, just for odometry and command velocity data. This is already unmanageable for my Knowledge Graph because the signal-to-noise ratio is way too high.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E-th!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E-th!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 424w, https://substackcdn.com/image/fetch/$s_!E-th!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 848w, https://substackcdn.com/image/fetch/$s_!E-th!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 1272w, https://substackcdn.com/image/fetch/$s_!E-th!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E-th!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png" width="1456" height="1272" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1272,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3779589,&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://www.nudurupati.co/i/192643345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.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_!E-th!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 424w, https://substackcdn.com/image/fetch/$s_!E-th!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 848w, https://substackcdn.com/image/fetch/$s_!E-th!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.png 1272w, https://substackcdn.com/image/fetch/$s_!E-th!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc6fcfa8-0bd1-475f-a1ed-d3914c4bf804_1724x1506.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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>Turtlebot3 simulation after 20 minutes, 20,000+ Event nodes, signal-to-noise ratio unusable.</em></p><p>Imagine the fate of some large-scale Robot fleet operators like Serve Robotics or Waymo who operate hundreds of autonomous robots per day and have to store and process not just odometry data but also LIDAR point cloud, IMU, image/ video, RADAR/SONAR, etc. data. That&#8217;s terabytes of data stored on the robot SSDs, waiting to be bulk uploaded when the robot is back at the dock. And by the time the data scientist gets a CSV dump 8 hours later, the trail is already cold, making it difficult to reconstruct what happened, if not impossible.</p><p>So the problem with bulk Physical AI data uploads that I see is:</p><ul><li><p><strong>Staleness</strong> &#8211; batch uploads that you are always looking backward.</p></li><li><p><strong>Upload costs</strong> &#8211; TB dumps over spotty connections fail, corrupt, out of order.</p></li><li><p><strong>Context loss</strong> &#8211; even when the full data arrives, raw sensor replay answers the &#8220;what&#8221;, not the &#8220;why&#8221;.</p></li></ul><p>However, this is not a new or novel problem. This is a decades-old data engineering problem that I have already seen and solved in my 18 years of data career. So I set out to solve the Physical AI data problem, the same way I have solved the Industrial IOT data problem using the tried and tested &#8220;Delta-Keyframe-Heartbeat&#8221; pattern. In this pattern, we make the Edge IoT, or in this case, the Robot Gateway, intelligent by introducing logic to send only the deltas (change in velocity or direction), periodic key frames that contain the full data state and robot health status as infrequent heartbeats. The delta ensures we conserve bandwidth, the periodic keyframes ensure we don&#8217;t lose the robot state in case of connection loss, and the heartbeat keeps us informed that the robot is active and operational.</p><p>To be specific about what each frame type in the &#8220;delta-keyframe-heartbeat&#8221; patterns does.</p><ul><li><p><strong>Delta</strong> &#8211; Is any kind of change in telemetry data, like position moved or velocity shifted significantly, or robot state changed from moving to stopped, etc. This delta is detected and calculated by the edge gateway and written only when something meaningful changes.</p></li><li><p><strong>Keyframe</strong> &#8211; A keyframe is a full state snapshot written periodically (say every 30 seconds), which serves as a ground truth of the robot state.</p></li><li><p><strong>Heartbeat</strong> &#8211; An alive ping every 60 seconds or so when there is no delta being generated to communicate the robot&#8217;s health, without sharing any real data.</p></li></ul><p>I implemented the same pattern in my own simulation, running a fleet of 3 Turtlebot3 robots over 24 hours. The gateway received <strong>233,353 raw telemetry events</strong> and <strong>wrote only 522</strong> to the knowledge graph, <strong>204 anomalies</strong>, <strong>114 keyframe snapshots</strong>, and <strong>3 robot identity nodes</strong>. That is a <strong>99.8% reduction</strong>. Every single anomaly was captured.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vn1H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vn1H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 424w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 848w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 1272w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vn1H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png" width="406" height="686.7446808510638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1590,&quot;width&quot;:940,&quot;resizeWidth&quot;:406,&quot;bytes&quot;:711704,&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://www.nudurupati.co/i/192643345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.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_!Vn1H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 424w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 848w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 1272w, https://substackcdn.com/image/fetch/$s_!Vn1H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ec076d5-7cbb-4385-8505-aa781ea59fd1_940x1590.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>Every meaningful event is captured in the Redis Event Stream.</em></p><p>This is what the knowledge graph looks like after 25 hours of fleet operation. Three robots, each with its own anomaly history and position context, queryable in real time. Still compressed and manageable, and with zero context loss.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AI-z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AI-z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 424w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 848w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 1272w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AI-z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png" width="1456" height="1290" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1290,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:938661,&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://www.nudurupati.co/i/192643345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.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_!AI-z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 424w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 848w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 1272w, https://substackcdn.com/image/fetch/$s_!AI-z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb01d99-662b-455a-850c-790d320f8403_2734x2422.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>24 hours of fleet telemetry: 3 robots, 204 anomalies, geographic clusters visible.</em></p><p>And because every anomaly carries a position, you can ask questions that raw replay can never answer. robot_001 kept stopping in two specific map regions. robot_002 stopped less frequently but in a tighter cluster. That is not a replay result; that is an operational context.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CIhV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CIhV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 424w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 848w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 1272w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CIhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png" width="936" height="358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:358,&quot;width&quot;:936,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41328,&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://www.nudurupati.co/i/192643345?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.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_!CIhV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 424w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 848w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 1272w, https://substackcdn.com/image/fetch/$s_!CIhV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f5dd68-3f10-41b0-ac6a-5938c3bf298f_936x358.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>Geographic anomaly clustering across 3 robots, robot_001 has two distinct hotspot regions.</em></p><p>The hardware problem in physical AI is largely solved. Tools like Foxglove let you replay exactly what the robot saw. But a reply only answers the &#8220;what&#8221;. Nobody is answering the &#8220;why&#8221;. The gap between raw telemetry and operational understanding is where I think the real infrastructure work needs to happen and frankly where I am spending my time.</p><p>The delta-keyframe-heartbeat pattern itself is not new or novel. I have seen and solved this exact problem across 18 years of data engineering in Industrial IoT. What is new is bringing this thinking to Physical AI, combining it with a streaming pipeline and a knowledge graph, and making the robot&#8217;s edge compute node intelligent enough to decide what matters before it ever hits the network.</p><p>This is Series 2 of my Physical Context Fabric open-source project. Series 1 covered standing up ROS2 natively on a Raspberry Pi 5 and connecting it to Foxglove during GTC week. The next post covers the part I am most excited about, a natural language Q&amp;A interface on top of the knowledge graph. Ask it why robot_001 kept stopping in the top left quadrant. Get an answer grounded entirely in what the robot actually did. No hallucination. No speculation. Purely context-driven.</p><p>If you are building a physical AI data infrastructure or just curious about the stack, the repo is fully open source and runs on a Raspberry Pi 5 and a MacBook Air. Come build with me.</p><p><a href="https://github.com/snudurupati/physical-context-fabric">Physical Context Fabric on GitHub</a></p><p>[<a href="https://www.nudurupati.co/p/the-chatgpt-moment-of-robotics-has">Series 1 &#8212; The ChatGPT Moment of Robotics Has Arrived</a>]</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[The ChatGPT Moment of Robotics Has Arrived]]></title><description><![CDATA[Spatial replay tells you what a robot did. Here is how to build the operational context to know why it did it.]]></description><link>https://www.nudurupati.co/p/the-chatgpt-moment-of-robotics-has</link><guid isPermaLink="false">https://www.nudurupati.co/p/the-chatgpt-moment-of-robotics-has</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Wed, 18 Mar 2026 04:46:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RBQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RBQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RBQO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RBQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7887113,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.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_!RBQO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!RBQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F132f11dc-3123-46b8-8de9-c0a8b270887a_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>Jensen Huang just announced the &#8220;ChatGPT moment&#8221; for robotics. But nobody is talking about what happens to the telemetry after the demo.</h3><div><hr></div><p>Yesterday, Jensen Huang walked onto the stage at the SAP Center and declared that the ChatGPT moment for autonomous physical AI has arrived.</p><p>There were 110 robots on the show floor. Humanoids, robo-taxis, autonomous factory arms. The hardware story for Physical AI is no longer a theoretical question&#8212;it is a shipping product roadmap.</p><p>But the slide that stopped me wasn&#8217;t the Vera Rubin architecture announcement. It was quieter than that. Huang put up what he called his most important slide of the keynote: <em>&#8220;Structured data is the foundation of trustworthy AI.&#8221;</em> And then: <em>&#8220;Unstructured data is the context of AI.&#8221;</em></p><p>He was talking about enterprise software agents. I kept thinking about fleets of robots.</p><div><hr></div><h3>What Physical AI Actually Generates</h3><p>A ROS2 robot: the software standard that runs on everything from a student&#8217;s TurtleBot3 to Boston Dynamics&#8217; Spot publishes a continuous, relentless stream of structured telemetry. Every movement, every sensor reading, every velocity command.</p><p>Here is what raw odometry from a simulated TurtleBot3 looks like at rest:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_e72!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_e72!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 424w, https://substackcdn.com/image/fetch/$s_!_e72!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 848w, https://substackcdn.com/image/fetch/$s_!_e72!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 1272w, https://substackcdn.com/image/fetch/$s_!_e72!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_e72!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png" width="364" height="480.48" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e925784f-d127-4bc1-bd11-e2876393b279_600x792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:792,&quot;width&quot;:600,&quot;resizeWidth&quot;:364,&quot;bytes&quot;:150503,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.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_!_e72!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 424w, https://substackcdn.com/image/fetch/$s_!_e72!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 848w, https://substackcdn.com/image/fetch/$s_!_e72!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 1272w, https://substackcdn.com/image/fetch/$s_!_e72!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe925784f-d127-4bc1-bd11-e2876393b279_600x792.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>ROS2 topic echo /odom &#8212; stationary robot, all zeros</em></p><p>And here is that same robot the moment you publish a velocity command (linear 0.2, angular 0.5), sending it into a circle:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zlsT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zlsT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 424w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 848w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 1272w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zlsT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png" width="378" height="473.98119122257054" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:638,&quot;resizeWidth&quot;:378,&quot;bytes&quot;:91588,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.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_!zlsT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 424w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 848w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 1272w, https://substackcdn.com/image/fetch/$s_!zlsT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F489093b8-1b20-40cc-bb64-95419fff2b40_638x800.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>ROS2 topic echo /odom &#8212; moving robot, x/y/orientation updating</em></p><p>The position updates 10 times per second. The orientation quaternion spins. This is kinematic state, continuously broadcast. Now realize that a real deployment robot generates this, plus LiDAR point clouds, camera feeds, IMU data, battery states, and nav stack outputs all,  simultaneously.</p><div><hr></div><h3>The King of the Replay Buffer: Foxglove</h3><p>If you want to visualize this firehose of data, <strong>Foxglove Studio</strong> is the best tool in the physical AI ecosystem.</p><p>It is genuinely excellent. You connect it to a live robot or a recorded MCAP file, and you get a beautiful, real-time visualization of every single topic. Here is what that looks like when connected to my TurtleBot3 sim, tracking position <code>x</code> plotted over time as the robot drives in a circle:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pf8F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pf8F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 424w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 848w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 1272w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pf8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png" width="575" height="452.18063186813185" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1145,&quot;width&quot;:1456,&quot;resizeWidth&quot;:575,&quot;bytes&quot;:260052,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.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_!Pf8F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 424w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 848w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 1272w, https://substackcdn.com/image/fetch/$s_!Pf8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b098109-b43b-474d-ab11-859f4f17fcbb_1800x1416.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>Foxglove Studio sine wave plot - /odom.pose.pose.position.x</em></p><p>That sinusoidal curve is the robot&#8217;s x-coordinate oscillating as it traces its path. Meanwhile, the 3D panel shows the robot&#8217;s coordinate frame updating in real-time against the world:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pthi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pthi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 424w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 848w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 1272w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pthi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png" width="606" height="421.6195054945055" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1013,&quot;width&quot;:1456,&quot;resizeWidth&quot;:606,&quot;bytes&quot;:507583,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.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_!Pthi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 424w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 848w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 1272w, https://substackcdn.com/image/fetch/$s_!Pthi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb71e49e-466f-4c53-a21c-6c69a73a85f6_3750x2608.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>Foxglove Studio 3D panel - robot frame in sim</em></p><p>If you need to inspect a system or replay an event, Foxglove is the undisputed answer. It handles the spatial and temporal reality of the robot perfectly.</p><p><strong>It answers the critical question: </strong><em><strong>What did the robot do?</strong></em></p><div><hr></div><h3>The Question Nobody is Answering</h3><p>But Foxglove and the visualization ecosystem at large are essentially a world-class replay buffer.</p><p>It does not answer: <em>Why did the robot stop unexpectedly at 14:32:07? What was it doing in the 30 seconds before that stop? Has it stopped in this specific map region before? Does this failure pattern correlate with a particular task type or a degrading battery level?</em></p><p>These are operational questions, and answering them requires more than just a sensor stream. It requires <strong>context</strong>. It requires understanding the relationship between discrete events, the history of a robot&#8217;s behavior in a specific environment, and the anomaly patterns across 50 deployments, not just one recording.</p><p>This is the operational context problem. And right now, nobody has built the data infrastructure layer to solve it.</p><div><hr></div><h3>Building the Physical Context Fabric</h3><p>I am open-sourcing a project to build that exact layer. I call it the <strong>Physical Context Fabric</strong>.</p><p>The architecture is a real-time streaming pipeline sitting directly above ROS2, feeding into a live knowledge graph.</p><blockquote><p><strong>The Pipeline:</strong> ROS2 topics &#8594; Pathway (Stream Processor) &#8594; Memgraph (Knowledge Graph)</p></blockquote><p>The schema is designed to connect the relational dots that raw telemetry leaves behind: <code>Robot &#8594; Task &#8594; Event &#8594; Anomaly &#8594; Environment_State</code></p><p>The Pathway layer watches the telemetry stream in real-time and detects anomalies. For example: a velocity drop below a specific threshold, held for <em>N</em> seconds, becomes an <code>unexpected_stop</code> event. That event is enriched with its full context window and written directly to Memgraph.</p><p>Suddenly, the queries that become possible aren&#8217;t just plotting lines on a graph. They look like this:</p><ul><li><p><em>&#8220;What specific events preceded the last 5 unexpected stops across the fleet?&#8221;</em></p></li><li><p><em>&#8220;Which map region has the highest historical anomaly rate?&#8221;</em></p></li><li><p><em>&#8220;How long do tasks of type X typically take before a hardware failure occurs?&#8221;</em></p></li></ul><p>Here is the first version of the context bridge in action, a Python node that reads <code>/odom</code> and <code>/cmd_vel</code> and emits structured JSON events in real-time:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rzE9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rzE9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 424w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 848w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 1272w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rzE9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png" width="728" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.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;:728,&quot;bytes&quot;:1328769,&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://www.nudurupati.co/i/191332352?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.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_!rzE9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 424w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 848w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 1272w, https://substackcdn.com/image/fetch/$s_!rzE9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a189bae-e852-4153-815d-3d8dd4e3493c_2256x948.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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 style="text-align: center;"><em>odom_subscriber.py JSON output streaming - timestamp, position, velocity, event_type: moving_and_turning</em></p><p>Each event carries a timestamp, position, velocity, commanded velocity, and an inferred event type. This is the raw material the knowledge graph ingests. <strong>This is what turns a sensor replay into operational context.</strong></p><div><hr></div><h3>Why This Matters Right Now</h3><p>Jensen Huang said it plainly on that stage: structured data is the ground truth of the AI era.</p><p>The Physical AI world is about to experience a massive scale-up. We are going to see a lot more robots, a lot more deployments, and a lot more fleet operators asking <em>why</em> their robots behaved the way they did.</p><p>The hardware roadmap is clear. The visualization tooling (thanks to teams like Foxglove) is elite. The glaring gap is the data infrastructure layer between raw telemetry and operational understanding.</p><p>That gap is what the <strong><a href="https://github.com/snudurupati/physical-context-fabric">Physical Context Fabric</a></strong> is built to fill.</p><div><hr></div><p><strong>The repository is live here:</strong> <a href="https://github.com/snudurupati/physical-context-fabric">github.com/snudurupati/physical-context-fabric</a></p><p>This is Post 1 of a series documenting the build in public. The full stack, including the Pathway anomaly detection engine and the Memgraph knowledge graph integration, is coming in the posts ahead.</p><p>If you are building in physical AI infrastructure or dealing with fleet-scale telemetry, I&#8217;d love to hear from you.</p><div><hr></div><p><strong>Sreeram Nudurupati</strong> | <a href="https://www.linkedin.com/in/snudurupati">LinkedIn</a> <em>Sreeram writes about context engineering and AI data infrastructure at <a href="https://www.nudurupati.co/">nudurupati.co</a>. He is also building <a href="https://texon.ai/">TexonAI</a>: context engineering for enterprise B2B.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[I Measured My AI Pipeline. The Number Changed Everything.]]></title><description><![CDATA[How real-time instrumentation exposed a 12.8ms result and what it means for enterprise AI context.]]></description><link>https://www.nudurupati.co/p/i-measured-my-ai-pipeline-the-number</link><guid isPermaLink="false">https://www.nudurupati.co/p/i-measured-my-ai-pipeline-the-number</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 16 Mar 2026 14:32:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nt6C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I set out to prove my AI pipeline could deliver context in under 60 seconds. The instrumentation told a different story. The real number was 12.8 milliseconds.</p><p>But getting to that number required three runs, two wrong measurements, and one architectural insight that changes how I think about real-time AI systems entirely.</p><div><hr></div><blockquote><p><strong>New here?</strong> This is Week 2 of a 90-day build-in-public project called the <strong>Autonomous Knowledge Fabric</strong> &#8212; a reference architecture that replaces stale batch RAG pipelines with a live knowledge graph fed by real-time event streams. The core problem: enterprise AI agents are failing in production not because the models are bad, but because the context they reason over is hours old. I&#8217;m building the fix in public, one sprint at a time.</p><p><strong>Week 1 recap:</strong> I introduced <em>Context Debt</em> &#8212; the gap between what your agent believes and what is actually true &#8212; and shipped a live SEC EDGAR ingestion pipeline using Pathway and Memgraph. <a href="https://www.nudurupati.co/p/context-debt-why-enterprise-rag-is">Read Week 1 here.</a></p></blockquote><div><hr></div><p>Last week, I introduced <strong>Context Debt</strong>, the growing gap between what your AI agent believes and what is actually true. I made a claim: the Autonomous Knowledge Fabric would deliver sub-60-second context freshness from live SEC filings to a queryable knowledge graph.</p><p>This week, I built the instrumentation to prove it.</p><p>The number I got back wasn&#8217;t what I expected. It was significantly better. And understanding <em>why</em> it was better taught me more about real-time AI architecture than any benchmark paper I&#8217;ve read.</p><div><hr></div><h2>The Graph Is Alive</h2><p>Before we get to the latency numbers, let me show you what two weeks of streaming data looks like.</p><p>This is the Autonomous Knowledge Fabric&#8217;s knowledge graph after 48 hours of ingesting live SEC 8-K filings:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nt6C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nt6C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 424w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 848w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 1272w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nt6C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png" width="1456" height="779" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:461838,&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://www.nudurupati.co/i/191128313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.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_!nt6C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 424w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 848w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 1272w, https://substackcdn.com/image/fetch/$s_!nt6C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb54f1b1-1c89-45da-820e-2363cb3e0df8_2694x1442.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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><em>Account nodes in red, Event nodes in orange, hub-and-spoke relationships</em></p><p><strong>186 nodes. 129 relationships.</strong> Zero manual curation. Every node a real company. Every edge a real SEC filing event.</p><p>The hub-and-spoke pattern tells the story immediately: Account nodes at the center, Event nodes radiating outward. The larger the hub, the more actively a company is filing. The graph isn&#8217;t just storing data. It&#8217;s already revealing structure.</p><p>The first company to emerge as the most active filer? <strong>Carbonite</strong>, with 14 events, all from 2016. Which brings me to the first lesson of Week 2.</p><div><hr></div><h2>When the Pipeline Is Right But the Data Is Wrong</h2><p>Carbonite was acquired by OpenText in 2019. It hasn&#8217;t filed independently since. Our pipeline found it because the initial SEC feed URL was returning historical filings, not current ones.</p><p>The pipeline was technically correct. It found the most active filer in its dataset. The dataset was wrong.</p><p>This is <strong>Context Debt in reverse</strong>, garbage-in, confident-wrong-out. And here&#8217;s the uncomfortable truth: a naive RAG system would have served those 2016 filings to an agent with full confidence, because the agent has no concept of &#8220;this data is from a different era.&#8221; The vector similarity score would be fine. The context would be a decade stale.</p><p>The fix was a feed URL update and a User-Agent header. The lesson was more durable: <strong>observability surfaces problems you didn&#8217;t know to look for.</strong> We only caught the 2016 dates because we were instrumenting every event with a timestamp. Without that, Carbonite would have quietly sat in our graph as a &#8220;high-risk account&#8221; based on decade-old filings.</p><p>After the fix, the feed returned companies like <strong>Applied Digital Corp</strong> (Item 5.02 - executive departure signal), <strong>MultiSensor AI Holdings</strong> (Item 1.01 - material agreement), and <strong>Azitra Inc</strong> (Item 3.01 - delisting notice). All 2026. All real. All actionable.</p><div><hr></div><h2>The Latency Investigation</h2><p>This is the part I want to linger on, because the journey from &#8220;810ms&#8221; to &#8220;12.8ms&#8221; is a microcosm of how production AI systems fail in ways that look like performance problems but are actually measurement problems.</p><p><strong>Run 1: 810ms P50</strong></p><p>The first latency reading showed 810ms end-to-end. Plausible. Disappointing. I&#8217;d hoped for faster. But something didn&#8217;t add up. The Bolt write to Memgraph was clocking at <strong>1ms warm</strong>. Where were the other 809ms going?</p><p><strong>Run 2: 2,434ms P50</strong></p><p>After a longer run, the number got <em>worse</em>; P50 jumped to 2.4 seconds. That&#8217;s when the measurement was clearly wrong, not the pipeline. </p><p>The diagnosis: <code>record_event_received()</code> was being called at <em>poll-cycle start</em>, the moment the RSS fetch began, rather than <em>per-entry-detected</em>. This meant we were measuring &#8220;time since we started fetching the feed,&#8221; not &#8220;time to process and write this specific event.&#8221; A 40-entry batch with a 30-second poll interval meant average measured latency included up to 30 seconds of queue wait time that had nothing to do with our processing speed.</p><p><strong>Run 3: 12.8ms P50</strong></p><p>After fixing the instrumentation and moving <code>record_event_received()</code> to fire per-entry, after title parsing, the real numbers emerged:</p><pre><code><code>&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;
AUTONOMOUS KNOWLEDGE FABRIC &#8212; LIVE STATS
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;
Timestamp:       2026-03-15 19:04:31 UTC
Events tracked:  39
P50 latency:     12.8ms
P95 latency:     14.1ms
P99 latency:     157.8ms
Min latency:     7.1ms
Max latency:     245.8ms
Mean latency:    17.8ms
Context freshness: RECENT
&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;
</code></code></pre><p><strong>P50 of 12.8ms. P95 of 14.1ms.</strong> Not sub-60 seconds. Sub-15 milliseconds for 95% of events.</p><div><hr></div><h2>What 12.8ms Actually Means</h2><p>For CXOs and architects who&#8217;ve been sold &#8220;real-time&#8221; by vendors who mean &#8220;hourly micro-batch&#8221;, let me put this in context:</p><pre><code><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474; System                        &#9474; Latency from event to queryable context        &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474; Nightly batch RAG             &#9474; 8&#8211;24 hours                                     &#9474;
&#9474; Hourly micro-batch            &#9474; 30&#8211;60 minutes                                  &#9474;
&#9474; "Real-time" vector sync       &#9474; 5&#8211;15 minutes                                   &#9474;
&#9474; AUTONOMOUS KNOWLEDGE FABRIC   &#9474; 12.8ms (processing) + ~15s (poll interval)     &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></code></pre><p>The poll interval, how often we check the SEC feed, is 30 seconds and fully configurable. In a production deployment with webhook-based ingestion (Salesforce, Zendesk firing events directly), that 30-second floor disappears entirely. You&#8217;re left with 12.8ms.</p><p>For the QBR scenario: a hostile takeover filing hits the SEC wire. Your agent knows about it in under a second. The Sales Director walking into that meeting has context that&#8217;s 14 milliseconds old, not 8 hours.</p><p>That&#8217;s not an incremental improvement. That&#8217;s a different category of system.</p><div><hr></div><h2>The Breakdown That Explains Everything</h2><p>Here&#8217;s the latency decomposition for three real events that ran through the pipeline this week:</p><pre><code><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474; Event &#9474;   Company    &#9474; fetch_ms &#9474; parse_ms &#9474; write_ms &#9474; total_ms &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474;  #1   &#9474; ispecimen    &#9474; 233.4ms  &#9474;  0.1ms   &#9474; 217.3ms  &#9474; 217.4ms  &#9474;
&#9474;  #2   &#9474; evolus       &#9474; 451.4ms  &#9474;  0.1ms   &#9474;   2.2ms  &#9474;   2.2ms  &#9474;
&#9474;  #3   &#9474; (subsequent) &#9474;    &#8212;     &#9474;  0.1ms   &#9474;   1.6ms  &#9474;   1.7ms  &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;
</code></code></pre><p>Three things jump out immediately:</p><ul><li><p><strong>Parse time is 0.1ms.</strong> The Pydantic schema validation, SEC item code extraction, risk signal classification all run in a tenth of a millisecond. This is the Rust core of Pathway doing what it was designed to do.</p></li><li><p><strong>Event #1 Bolt write is 217ms.</strong> This is the cold connection establishment, Memgraph&#8217;s first handshake. Every subsequent write is 1&#8211;2ms. The cold-start cost is a one-time tax, not a recurring one.</p></li><li><p><strong>The RSS fetch (233&#8211;451ms) is intentionally excluded</strong> from our latency measurement. That&#8217;s network time to SEC EDGAR&#8217;s servers, outside our control, not part of our processing cost.</p></li></ul><p>This decomposition is what I mean when I say observability is not optional. Without it, we&#8217;d have reported 800ms and moved on. With it, we know exactly where every millisecond goes.</p><div><hr></div><h2>What the Agent Actually Sees</h2><p>After all the instrumentation, here&#8217;s what your Sales Director&#8217;s agent receives when it calls <code>get_agent_context("carbonite")</code> on a live account:</p><p>JSON</p><pre><code><code>ACCOUNT INTELLIGENCE REPORT
Company: carbonite
Last Updated: 2026-03-15T17:21:17 (14 seconds ago)
Risk Signals: executive_departure, takeover_bid
Recent Events (13 total):
- Carbonite Inc filed 8-K on 2026-03-15. Item 2.05: 
  Departure of Directors or Certain Officers
- Carbonite Inc filed 8-K on 2026-03-15. Item 2.01: 
  Completion of Acquisition or Disposition of Assets
- Carbonite Inc filed 8-K on 2026-03-15. Item 1.01: 
  Entry into a Material Definitive Agreement
Context Freshness: LIVE
</code></code></pre><p>That string, formatted, structured, timestamped, and freshness-labeled, is injected directly into the LLM prompt as context. No vector search. No embedding lookup. No stale index. Just the current state of the account, 14 seconds after the last filing.</p><p>Compare that to what a batch RAG system injects: the same paragraph from a document that was last embedded at 2 am.</p><p>The model is identical in both cases. The context is not.</p><div><hr></div><h2>The Architecture Decision That Made This Possible</h2><p>I want to address something I&#8217;ve been asked several times since Week 1: <em>&#8220;Why Pathway? Why not just use Spark Structured Streaming, especially with the new Real-Time Mode (RTM)?&#8221;</em></p><p>I have five years of production experience with Kafka and Spark. I know the incumbent stack well enough to know exactly what it would cost us here. Yes, Databricks recently dropped micro-batching with Spark RTM, enabling concurrent processing stages to hit sub-100ms latencies. It&#8217;s an incredible engineering feat. But for <em>this specific architecture</em>, Pathway still wins. Let me be direct:</p><ul><li><p><strong>The JVM GC Penalty:</strong> Spark RTM still runs on the JVM. The JVM has a garbage collector. Garbage collection introduces unpredictable &#8220;stop-the-world&#8221; pauses. When your baseline parse time is 0.1ms, and your database write is 1ms, a 200ms GC pause isn&#8217;t a footnote&#8212;it&#8217;s a 100x latency spike that ruins your P99 determinism. Pathway&#8217;s engine is written in Rust. No GC. No pauses.</p></li><li><p><strong>The Stateful Complexity Trap:</strong> Building a live knowledge graph requires complex, stateful entity resolution. To minimize latency in Spark RTM, you have to jump through configuration hoops (like forcing Arrow batch sizes to 1, which severely bottlenecks Python UDF performance). Pathway&#8217;s incremental dataflow model was built natively to propagate complex delta updates. When a new SEC entry arrives, it processes exactly that entry and its graph relationships immediately, without forcing you to contort your logic to fit a rigid streaming API.</p></li><li><p><strong>The Operational Overhead:</strong> Running Spark RTM requires provisioning a dedicated JVM cluster. You have to disable autoscaling, disable Photon acceleration, and manage executor nodes. Pathway runs as a single Python process backed by a Rust core. One container. No cluster. For a reference architecture designed to be adopted by enterprise teams without a dedicated platform engineering group, that difference is not cosmetic.</p></li></ul><p>To be fair, if your enterprise already runs the latest Databricks runtime and has a team managing high-throughput pipelines (like AdTech attribution), Spark RTM is a massive leap forward. </p><p>But for this specific problem, continuous incremental updates to a live knowledge graph with deterministic sub-15ms latency, Pathway&#8217;s architecture is the right fit. Spark would require fighting the framework to get the behavior that Pathway gives you by default.</p><div><hr></div><h2>What&#8217;s Coming in Week 3</h2><p>The numbers are real. The graph is alive. Next week, I will build the system that makes the graph <em>trustworthy</em>, the <strong>3-Tier Entity Resolver</strong>.</p><p>Right now, &#8220;iSpecimen Inc.&#8221; and &#8220;ispecimen&#8221; are two different nodes in our graph. &#8220;Applied Digital Corp.&#8221; and &#8220;Applied Digital&#8221; could be two different accounts. Every duplicate node is a split relationship, a piece of risk context that never reaches the agent because it&#8217;s attached to the wrong entity.</p><p>The resolver is where most real-time knowledge graph projects fail. We&#8217;re going to solve it in three tiers: deterministic hashing (zero LLM cost, catches 60% of duplicates), graph-contextual neighbor matching (uses the graph&#8217;s own relationships to resolve identity), and LLM-as-judge for true ambiguity (batched, structured, minimal cost).</p><p>The Ghost Node pattern, how you resolve entities when the graph is too sparse to trust, is the architectural insight at the heart of it.</p><p><em>See you next week.</em></p><div><hr></div><p><strong>The repository:</strong> <a href="https://github.com/snudurupati/autonomous-knowledge-fabric">github.com/snudurupati/autonomous-knowledge-fabric</a></p><p><em>All latency numbers are measured from live pipeline runs. OpenTelemetry instrumentation code is in </em><code>/observability</code><em>. Reproduce it yourself.</em></p><div><hr></div><p><strong>Sreeram Nudurupati</strong> | <a href="https://www.linkedin.com/in/snudurupati">LinkedIn</a></p><p><em>AI Architect | Building the Autonomous Knowledge Fabric in public: 90 days, no hand-waving.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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 Debt: Why Enterprise RAG is Failing in Production]]></title><description><![CDATA[A thesis for Autonomous Knowledge Fabric]]></description><link>https://www.nudurupati.co/p/context-debt-why-enterprise-rag-is</link><guid isPermaLink="false">https://www.nudurupati.co/p/context-debt-why-enterprise-rag-is</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Tue, 10 Mar 2026 15:13:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NH28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NH28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NH28!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!NH28!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!NH28!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!NH28!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NH28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebeec336-dbee-491e-90f5-a8702c437456_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8067058,&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://www.nudurupati.co/i/190204868?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.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_!NH28!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!NH28!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!NH28!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!NH28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febeec336-dbee-491e-90f5-a8702c437456_2752x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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 Tier-1 enterprise sales team walks into a high-stakes QBR. Their AI-driven Account Intelligence agent, a system built on the industry-standard RAG stack, classified the account as &#8220;Stable.&#8221; Confident. Well-reasoned. </p><p>What the agent didn&#8217;t know and couldn&#8217;t know was that 40 minutes earlier, an SEC 8-K filing had hit the wire signaling a hostile takeover bid on that exact account&#8217;s parent company.</p><p>The agent wasn&#8217;t wrong because the model was bad. It was wrong because the context was stale.</p><p>This is the problem I&#8217;m spending the next 90 days solving in public. <strong>Context Debt.</strong></p><h3>The Debt Nobody Is Talking About</h3><p>In software engineering, we understand <strong>Technical Debt</strong>. In the age of Agentic AI, we must now account for <strong>Context Debt</strong>.</p><p>We are currently witnessing a massive divergence in the Enterprise AI stack. We are feeding 2026-speed reasoning models with 1996-speed batch processing pipelines.</p><blockquote><p><strong>Context Debt</strong> is the delta between an agent&#8217;s internal world-model and the ground truth of a high-velocity business environment.</p></blockquote><p>When your pipeline relies on nightly batches or even hourly micro-batches to refresh a vector store, you aren&#8217;t just lagging; you are accumulating Context Debt. In relationship-intensive workflows like M&amp;A, supply chain, and clinical trials, that debt doesn&#8217;t just accrue interest; it causes catastrophic hallucinations that no amount of prompt engineering can fix.</p><p><strong>Most of your agent's hallucinations aren't model failures. They're Context Debt coming due.</strong></p><h3>The Missing Middle: Beyond Vector Search</h3><p>The &#8220;Modern AI Stack&#8221; of 2024-2025 was built on a simple premise: <em>Retrieve a document, augment the prompt.</em> </p><p>But enterprise reality isn&#8217;t a collection of static documents; it is a dynamic web of relationships. If a key stakeholder leaves a company, that isn&#8217;t just a new data point. It&#8217;s a structural change to the entire account&#8217;s risk profile. Standard RAG treats this as a keyword update. </p><p>If you map the modern enterprise AI stack, there are two well-solved layers: the model layer at the top (GPT-4o, Claude, Gemini &#8212; mature, capable, improving fast) and the data layer at the bottom (your CRM, your ERP, your CDW platform, messy but existent).</p><p>What&#8217;s missing is the middle: a stateful, real-time layer that continuously resolves business entities, tracks relationships, and delivers live context to the agent at query time.</p><p>I&#8217;m calling this the <strong>Autonomous Knowledge Fabric</strong>, a pipeline that transforms high-velocity business events into a continuously updated Knowledge Graph, so your agents reason over live reality rather than a historical snapshot.</p><p>To solve <strong>Context Deb</strong>t, we have to move away from the &#8220;Search-and-Retrieve&#8221; paradigm and toward <strong>Stateful Stream-Graph-RAG</strong>.</p><h3>The Autonomous Knowledge Fabric Thesis</h3><p>Over the next 90 days, I am building and open-sourcing a reference architecture designed to solve the &#8220;Missing Middle&#8221; for the enterprise. The thesis is straightforward: <strong>Real-time context is a streaming problem, not a database problem.</strong></p><p>The stack is intentionally lean and operationally resilient:</p><ul><li><p><strong>Pathway:</strong> For high-consistency, stateful stream processing (Differential Dataflow).</p></li><li><p><strong>Memgraph:</strong> As a high-performance &#8220;Hot State&#8221; cache for real-time relationship traversal.</p></li><li><p><strong>Ghost Node Resolution:</strong> A multi-tier identity engine that resolves entities (e.g., &#8220;Acme&#8221; vs. &#8220;Acme Corp&#8221;) at stream-speed before they ever reach the agent.</p></li></ul><h3>Proving the Alpha</h3><p>Enterprise Architects don&#8217;t need more &#8220;Hello World&#8221; demos. They need defensible ROI and operational clarity. By the end of this sprint, I will demonstrate the <strong>Alpha of Real-Time Context</strong> through:</p><ol><li><p><strong>Context Freshness Metrics:</strong> Moving from an 8-hour &#8220;batch lag&#8221; to sub-60-second &#8220;context freshness.&#8221;</p></li><li><p><strong>The CFO Math:</strong> A transparent cost-benefit analysis comparing the compute overhead of streaming versus the risk-adjusted cost of &#8220;Context Debt&#8221; in $500k+ enterprise workflows.</p></li><li><p><strong>The Immutable Baseline:</strong> A side-by-side comparison against a professionally tuned Pinecone/LlamaIndex batch baseline. No strawmen, just a clinical look at where batch fails and where streams win.</p></li></ol><h3>Join the Architecture Review</h3><p>This isn&#8217;t just a repository; it&#8217;s a 90-day stress test of how we handle truth in production AI. I am building <a href="https://github.com/snudurupati/autonomous-knowledge-fabric">autonomous-knowledge-fabric</a> entirely in public because the &#8220;Missing Middle&#8221; is too critical a problem to solve behind closed doors.</p><p>If your team is hitting the &#8220;Stale Context&#8221; wall, or if you&#8217;re an architect tired of babysitting batch jobs that can&#8217;t keep up with your agents, let&#8217;s talk.</p><p><strong>The repository is live:</strong> <a href="https://github.com/snudurupati/autonomous-knowledge-fabric">github.com/snudurupati/autonomous-knowledge-fabric</a></p><div><hr></div><p><strong>Next Week:</strong> <em>The Ghost Node Pattern: Solving Entity Resolution in Sparse Knowledge Graphs.</em></p><div><hr></div><p><strong>Sreeram Nudurupati</strong> <em>AI Architect | Building the Autonomous Knowledge Fabric</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[Weights vs. Maps: The Myth of the ‘Magic’ AI]]></title><description><![CDATA[Why Your Fine-Tuning Failed the Multi-Hop Test (and How to Fix It)]]></description><link>https://www.nudurupati.co/p/weights-vs-maps-the-myth-of-the-magic</link><guid isPermaLink="false">https://www.nudurupati.co/p/weights-vs-maps-the-myth-of-the-magic</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 02 Mar 2026 16:17:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Q-Ci!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is the conclusion of an 8-week series: &#8220;From Data Engineer to AI Architect.&#8221; We&#8217;ve explored the shift from traditional data engineering to designing agentic systems built on stochastic LLM compute, where tokens, latency, and probabilistic behavior are first-class constraints. Along the way, we progressed from enforcing structure and determinism to building increasingly sophisticated RAG pipelines, orchestration layers, and multi-hop graph reasoning systems with explainability built in. We also examined Continued Pre-Training (CPT) and the practical realities of building knowledge graphs on local infrastructure. </p><p>Today, we declare the winner of our capstone: <strong>GraphRAG.</strong></p><div><hr></div><p><strong>Executive Summary:</strong></p><p>For the last couple of weeks, we have been running a high-stakes contextual &#8220;Bake-Off.&#8221; We pitted the reigning champion, a model fine-tuned using <strong>Continuous Pre-training (CPT)</strong> on specialized clinical data (the <strong>&#8220;Parametric Contender&#8221;</strong>), against a baseline model augmented by a structured <strong>Graph Substrate</strong> (the <strong>&#8220;Semantic Contender&#8221;</strong>).</p><p>The goal was to solve the <strong>&#8220;Missing Middle&#8221;</strong> in enterprise AI; the point where an LLM is fluent but factually untraceable. While CPT provided fluency, <strong>GraphRAG provided fidelity</strong>. The moment of truth arrived in our final &#8220;Multi-Hop&#8221; query.</p><p><strong>The Test:</strong> <em>&#8220;In our clinical records, what role does the &#8216;forearm&#8217; play in measuring glucose uptake for hypertensive subjects?&#8221;</em></p><p><strong>The Results:</strong></p><ul><li><p><strong>Contender A (Week 7 CPT):</strong> <code>"Data not found in substrate."</code></p></li><li><p><strong>Contender B (Week 8 GraphRAG):</strong> <code>"The forearm is the site where glucose uptake was measured..."</code></p></li></ul><div><hr></div><h2>&#128373;&#65039; Post-Mortem: Why Weights Forget What Maps Remember</h2><p>At first glance, this &#8220;failure&#8221; of fine-tuning is confusing. The model <em>was</em> trained on that exact data in Week 7. As an AI Architect, you must understand the <strong>plumbing</strong> of memory.</p><h3>1. Technical Deep Dive: The Parametric Fog vs. Explicit Edges</h3><p>When you train a model like Llama-3 (CPT), you are using <strong>Gradient Descent</strong> on massive amounts of text. Backpropagation smooths out information, prioritizing frequent patterns.</p><p>The relationship between &#8220;Forearm&#8221; and &#8220;Glucose Uptake&#8221; is extremely rare (low-frequency) across 3,500 abstracts. It exists as a fragile statistical ghost in the 8 billion parameters. When queried, that detail gets &#8220;drowned out&#8221; by more common patterns. <strong>Weights forget the rare fact.</strong></p><p>In contrast, our <strong>Semantic Substrate</strong> (Memgraph) materialized that rare fact as an explicit edge: <code>(Forearm)-[MENTIONS]-(Abstract_123)-[MENTIONS]-(Glucose_Uptake)</code>. When the query hits the graph, we walk that path with 100% fidelity. <strong>Maps remember the exact path.</strong></p><h3>2. Knowledge Graph Advantage: Explainability</h3><p>This is the largest business win for GraphRAG.</p><ul><li><p><strong>CPT (The Black Box):</strong> When it answers, it gives you a fluent prediction based on a memory it cannot cite. If a clinician asks, <em>&#8220;Which abstract justified this claim?&#8221;</em> the CPT model is a dead end. <strong>In an enterprise setting, this is a liability.</strong></p></li><li><p><strong>GraphRAG (The Glass Box):</strong> The response is a synthesis of extracted documents. It explicitly provides <strong>Source IDs</strong> (e.g., <code>[Abstract ID: abs_001]</code>). The model has provided an auditable decision path. <strong>This is explainable AI.</strong></p></li></ul><div><hr></div><h2>&#127959;&#65039; The AI Architect&#8217;s Comparison Matrix</h2><p>We have visualized the core metrics of our two contenders below. Since Substack doesn&#8217;t handle tables, we have generated an infographic performance matrix.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q-Ci!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7980383,&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://www.nudurupati.co/i/189654313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.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_!Q-Ci!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!Q-Ci!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fda09a7-d508-4684-ab5a-f706c6aec906_2816x1504.png 1456w" sizes="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"><svg role="img" 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"><g><title></title><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"><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"><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><strong>3. Business and Economic Impact</strong></h3><ul><li><p><strong>CPT (The Week 7 Model):</strong> The economic story is high upfront compute to train (even with LoRA). Updates require retuning, another costly compute job.</p></li><li><p><strong>GraphRAG (The Week 8 Substrate):</strong> The economic story is low update cost. Adding new data is computationally cheap (adding nodes to Memgraph). The primary cost is in the <strong>initial ingestion pipeline</strong> and <strong>Entity Resolution</strong>.</p></li></ul><h2>When to Use Continuous Pre-training (CPT)</h2><p>Despite the clear win in fact fidelity, CPT is not dead. As an AI Architect, you must understand its unique value:</p><ol><li><p><strong>Specialized Vocabulary:</strong> When your data uses dense <strong>acronyms, proprietary codes,</strong> or unique clinical jargon, CPT &#8220;seeds&#8221; the base model&#8217;s tokenizer with this dialect.</p></li><li><p><strong>Domain Tone &amp; Style:</strong> CPT can adapt Llama-3 to a specific format. A good example is transforming complex medical research into concise patient-facing summaries.</p></li><li><p><strong>Low-Resource Languages:</strong> CPT is the standard for introducing entirely new languages to a base LLM.</p></li></ol><h2><strong>Final Verdict: Architecture over Weights</strong></h2><p>The "Missing Middle" isn't solved by making models bigger or training them longer. It's solved by <strong>Context Engineering </strong>and<strong> Knowledge Graphs are the Key</strong>. By building a Graph Substrate, we moved from an AI that "remembers" to an AI that "researches." CPT gives you <strong>fluency</strong>, but GraphRAG gives you <strong>fidelity</strong>. </p><p>We have completed the transformation from Data Engineer to AI Architect. We have moved from raw data ingestion to fine-tuning Llama-3, and finally to building a queryable contextual nervous system. The substrate is built. Now, it's time to let the agents run.</p><p>This concludes this 8-week series, but stay tuned for my next series, where I combine two of my favorite topics, streaming and context engineering, to build a real-time context engine.</p><p>Get the full code here in the repo: <a href="https://github.com/snudurupati/agentic-ai-architect">https://github.com/snudurupati/agentic-ai-architect</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[Curing AI Hallucinations]]></title><description><![CDATA[Addressing AI&#8217;s Missing Middle via Continued Pre-training]]></description><link>https://www.nudurupati.co/p/curing-ai-hallucinations</link><guid isPermaLink="false">https://www.nudurupati.co/p/curing-ai-hallucinations</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Fri, 27 Feb 2026 14:54:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xfRC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xfRC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xfRC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xfRC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8913872,&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://www.nudurupati.co/i/189337289?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.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_!xfRC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!xfRC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa94d00-fb06-4bba-9c87-4ef901a596fd_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>In the enterprise, the biggest barrier to deploying reliable AI agents isn&#8217;t a lack of compute; it&#8217;s the <strong>&#8220;Missing Middle.&#8221;</strong></p><p>General-purpose LLMs are brilliant at reasoning, but they often lack the specific, high-fidelity context of a company&#8217;s internal world. When an agent is asked a question that requires deep domain knowledge it hasn&#8217;t &#8220;seen,&#8221; it fills the gap with plausible-sounding nonsense. This is the root of hallucinations.</p><p>To solve this, enterprises generally have two architectural options:</p><ol><li><p><strong>Continued Pre-training (CPT):</strong> Modifying the model&#8217;s <strong>Parametric Layer</strong> (its &#8220;brain&#8221;) so that specialized knowledge is baked directly into the weights.</p></li><li><p><strong>Knowledge Graphs (GraphRAG):</strong> Creating a <strong>Semantic Layer</strong> (a &#8220;library&#8221;) where relationships and facts are stored externally and retrieved as needed.</p></li></ol><p>This week, as part of a multi-week &#8220;Bake-Off,&#8221; I am putting <strong>Continued Pre-training</strong> to the test. I&#8217;ve built a specialized <strong>&#8220;Clinical Contender&#8221;</strong> to see if altering the model&#8217;s internal weights can bridge this context gap. Next week, we will implement a Knowledge Graph solution, concluding the series with a final side-by-side comparison.</p><div><hr></div><h2>Phase 1: What is Continued Pre-training?</h2><p>Continued Pre-training is the process of taking a &#8220;commodity&#8221; model (like Llama-3) and extending its self-supervised learning phase on a specialized, private corpus. Unlike fine-tuning, which teaches a model <em>how</em> to act, CPT teaches a model a <strong>new language</strong>.</p><h3>Why Enterprises Consider this Path:</h3><ul><li><p><strong>Vocabulary Priming:</strong> Teaching the model technical acronyms and jargon that don&#8217;t exist in general web crawls.</p></li><li><p><strong>Conceptual Density:</strong> Increasing the model&#8217;s internal &#8220;intuition&#8221; for domain-specific relationships.</p></li><li><p><strong>Data Sovereignty:</strong> Building a model that is natively &#8220;aware&#8221; of your proprietary data distribution.</p></li></ul><div><hr></div><h2>The Experiment: 500 Iterations on an M4 Mac</h2><p>To &#8220;walk the walk,&#8221; I performed a <strong>QLoRA-based</strong> run on my <strong>MacBook Air M4 (24GB RAM)</strong> using the <strong>MLX</strong> framework.</p><h3>The Methodology:</h3><p>To maintain architectural stability and prevent <strong>Catastrophic Forgetting</strong>, I engineered a &#8220;Substrate Mix&#8221; for the training data:</p><ul><li><p><strong>85% Domain-Specific Technical Data:</strong> High-fidelity abstracts and technical documentation.</p></li><li><p><strong>15% General Replay Data:</strong> A slice of WikiText-2 to act as a linguistic anchor.</p></li></ul><h3>The Performance Metrics:</h3><ul><li><p><strong>Training Iterations:</strong> 500</p></li><li><p><strong>Peak Memory Usage:</strong> <strong>9.456 GB</strong> (Successfully leveraging the M4&#8217;s Unified Memory).</p></li><li><p><strong>Throughput:</strong> ~68 Tokens/sec (Optimized for fanless thermal profiles).</p></li></ul><div><hr></div><h2>&#9989; Findings: The Impact on Parametric Memory</h2><p>The experiment yielded a specialized <code>adapters.safetensors</code> file. After 500 iterations, the <strong>Train Loss</strong> dropped by approximately <strong>19%</strong>, resulting in several notable shifts:</p><ol><li><p><strong>Increased Technical Precision:</strong> The model moved from generalities to technical standards. It refined definitions of complex acronyms and processes from vague &#8220;web-search&#8221; results to precise, industry-standard definitions.</p></li><li><p><strong>Structural Awareness:</strong> It demonstrated a more detailed understanding of internal mechanics and structural relationships within the specialized dataset.</p></li><li><p><strong>Linguistic Trade-offs:</strong> The model became highly technical, but the process highlighted a drift in the &#8220;Assistant&#8221; persona, resulting in a loss of conversational formatting (repetitive <code>&lt;|eot_id|&gt;</code> tokens) as the weights favored the raw technical substrate over instruction-following.</p></li></ol><div><hr></div><h2>The Business Impact Matrix: CPT vs. The Enterprise Reality</h2><p>For VPs and CXOs, the choice to pursue Continued Pre-training isn&#8217;t just a technical one; it&#8217;s a question of <strong>Total Cost of Ownership</strong> and <strong>Intellectual Property Portability</strong>.</p><ul><li><p><strong>&#127959;&#65039; Infrastructure: High-Density GPU Clusters (A100/H100) or High-Memory Apple Silicon</strong></p><ul><li><p><strong>Business Impact:</strong> High CapEx/OpEx. Requires significant upfront investment or aggressive cloud-compute burn.</p></li></ul></li><li><p><strong>&#9201;&#65039; Time-to-Value: 4&#8211;12 Weeks</strong></p><ul><li><p><strong>Business Impact:</strong> Agility Risk. The process involves extensive data prep, training, and safety testing. If the base model (e.g., Llama 3) is updated, you may be forced to re-train from scratch.</p></li></ul></li><li><p><strong>&#128101; Staffing: Requires ML Scientists &amp; Specialized Engineers</strong></p><ul><li><p><strong>Business Impact:</strong> Hiring Gap. High &#8220;specialist&#8221; dependency. These roles carry $250k+ price tags and represent a significant &#8220;flight risk&#8221; in a competitive market.</p></li></ul></li><li><p><strong>&#128269; Auditability: &#8220;Black Box&#8221; Weights</strong></p><ul><li><p><strong>Business Impact:</strong> Compliance Risk. It is difficult to trace the origin of a specific output back to a specific data point, creating barriers for regulated industries like Health or Finance.</p></li></ul></li></ul><h3>1. The Human Capital Factor: Upskilling vs. Specialist Hiring</h3><p>A CPT strategy requires a &#8220;Pit Crew&#8221; of PhDs and ML Scientists to manage weight decay and prevent the model from &#8220;losing its mind&#8221; (Catastrophic Forgetting). Conversely, leveraging existing <strong>Data Engineering</strong> talent to build Knowledge Graphs allows for a faster upskilling path. Data Engineers are already experts in schemas; transitioning them to &#8220;AI Architects&#8221; is often more sustainable than competing for scarce ML Research talent.</p><h3>2. Operational Stability: The &#8220;Llama-4&#8221; Problem</h3><p>The most significant business risk for CPT is <strong>Sunk Cost</strong>. If you spend $200k in compute to bake your proprietary data into Llama-3, and a more efficient Llama-4 is released next month, your investment is <strong>non-transferable</strong>. You are back at the starting line. A Knowledge Graph approach ensures <strong>State Sovereignty</strong>; your data lives in your database, not in the model weights, making it LLM-agnostic.</p><div><hr></div><h2>Architectural State of Play</h2><p>We now have a fully realized <strong>Clinical Contender</strong>, a model whose weights have been specialized for a technical domain. This represents our first successful approach to solving the &#8220;Missing Middle.&#8221;</p><p>Get the full code here in the repo: <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/06_multi_hop_reasoning_GraphRAG">https://github.com/snudurupati/agentic-ai-architect/tree/main/07_continued_pre_training</a></p><p><strong>Next Week: The Showdown.</strong> We implement the second option, a <strong>Knowledge Graph (GraphRAG)</strong> architecture. Once both are built, we will perform a final &#8220;Bake-Off&#8221; to determine which approach provides the best balance of accuracy, cost, and operational flexibility.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[The Corporate Brain: Eliminating Contextual Drift through Knowledge Graphs]]></title><description><![CDATA[Stop building chatbots and start architecting a nervous system: How Knowledge Graphs bridge the "Semantic Gap" to eliminate contextual drift in the modern enterprise.]]></description><link>https://www.nudurupati.co/p/the-corporate-brain-eliminating-contextual</link><guid isPermaLink="false">https://www.nudurupati.co/p/the-corporate-brain-eliminating-contextual</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 16 Feb 2026 16:15:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yWtO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yWtO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yWtO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yWtO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8680979,&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://www.nudurupati.co/i/188109733?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.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_!yWtO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yWtO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb55fc9-a79f-47ca-8f52-a6801c396371_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>The industry is currently obsessed with &#8220;Chat with your PDF&#8221; bots. But for an AI Architect, these are toys. In a high-precision enterprise environment, employee knowledge is a living, breathing network of dependencies.</p><p>Most internal AI initiatives eventually hit a plateau characterized by <strong>Contextual Blindness</strong>, the inability of a model to see the logical connective tissue between disparate data silos. To solve the <strong>Digital Employee Experience (DEX)</strong> crisis, we don&#8217;t just need bigger models; we need a more sophisticated &#8220;memory.&#8221; We need the <strong>Knowledge Graph</strong>.</p><div><hr></div><h2>The DEX Crisis: The &#8220;Missing Middle&#8221; and Contextual Drift</h2><p><strong>What is DEX?</strong> DEX is the sum of every digital interaction, from the first line of code in GitHub to the final status update in Jira. To truly optimize this experience, we must bridge the <strong>'Semantic Gap'</strong> between Slack, Jira, and GitHub once and for all. In high-stakes technical environments, DEX isn&#8217;t a luxury; it&#8217;s a mission-critical moat.</p><p><strong>Why Current AI Fails DEX:</strong> Most organizations are currently distracted by &#8220;Linear RAG.&#8221; They take a Vector Database and treat knowledge as isolated points in space, rather than a sequence of events.</p><p>This creates the <strong>&#8220;Missing Middle&#8221;</strong>, the layer between your raw data silos and the LLM&#8217;s reasoning. This is where <strong>Contextual Drift</strong> sets in. As data evolves across Slack, Jira, and GitHub, a vector-only system loses the &#8220;thread&#8221; of truth:</p><ul><li><p><strong>Relational Fragility:</strong> Vector search finds fragments that <em>look</em> similar but cannot verify if they are <em>logically</em> related.</p></li><li><p><strong>Contextual Blindness:</strong> The model might see a &#8220;GPU error&#8221; in a document but remains blind to the fact that a specific developer is currently fixing that exact error in a private branch.</p></li><li><p><strong>The Provenance Gap:</strong> Without a graph, an LLM cannot provide an audit trail of how it connected a Slack complaint to a technical resolution.</p></li></ul><div><hr></div><h2>The Solution: GraphRAG &amp; The Semantic Bridge</h2><p>To solve <strong>Contextual Blindness</strong>, we must decouple the <strong>Logic</strong> (the LLM) from the <strong>State</strong> (the Knowledge Graph). By using <strong>ArangoDB</strong> as our reasoning substrate, we solve the two most difficult technical hurdles in DEX:</p><h3>1. The Multi-Hop Problem: Bridging Slack to Jira</h3><p>Most internal questions are &#8220;multi-hop&#8221; by nature.</p><ul><li><p><strong>The Query:</strong> <em>&#8220;What was the resolution of the sensor anomaly discussed in Slack last Tuesday by the lead on Project Orion?&#8221;</em></p></li><li><p><strong>The Problem:</strong> Linear RAG might find the Slack thread or the Jira ticket, but it cannot logically traverse the link between them.</p></li><li><p><strong>The Semantic Bridge:</strong> In a Graph database like ArangoDB, we define the &#8220;verbs&#8221; that connect these entities, allowing the agent to &#8220;walk&#8221; from a conversation to a technical fix deterministically.</p></li></ul><h3>2. Entity Resolution: The Identity Handshake</h3><p>Corporate data is a &#8220;siloed aliases&#8221; nightmare.</p><ul><li><p><strong>Slack:</strong> <code>@Sreeram</code> | <strong>Jira:</strong> <code>snudurupati</code> | <strong>GitHub:</strong> <code>sreeram-dev</code></p><p>If your system doesn&#8217;t know these are the same physical person, your &#8220;Corporate Brain&#8221; has multiple personalities. We solve this through <strong>Entity Resolution</strong>. Mapping disparate aliases to a unique Global Entity ID in a graph database like ArangoDB before the data ever hits the graph.</p></li></ul><div><hr></div><h2>Architecting the Corporate Brain: A 10-Step Blueprint</h2><p>Here is the 10-step path from fragmented data to an autonomous reasoning engine using <strong>ArangoDB</strong> and <strong>LangGraph</strong>.</p><h3>1. The Secure Substrate</h3><p>Establishing a secure, authenticated connection to our <strong>ArangoDB</strong> instance. Governance is the first priority; the "Brain" must only access authorized nodes.</p><h3>2. Topological Definition</h3><p>Defining the <strong>Topology of Work</strong>. We create specific collections for <code>Employees</code>, <code>JiraTickets</code>, and <code>Commits</code>, turning &#8220;static rows&#8221; into &#8220;active entities.&#8221;</p><h3>3. Graph Logic Initialization</h3><p>Initializing the schema and defining the <strong>Semantic Bridges</strong>, the &#8220;Edge Collections&#8221; (like <code>HAS_IDENTITY</code> or <code>ADDRESSES</code>) that serve as neural pathways.</p><h3>4. Seeding the &#8220;Project Orion&#8221; Loop</h3><p>Creating a cross-domain trace: a Slack message references a project, which links to a Jira ticket, which links to a GitHub commit.</p><h3>5. Entity Resolution (ER)</h3><p>Implementing the &#8220;Identity Handshake&#8221; to normalize siloed aliases into a unified graph node. This is the foundation of cross-domain intelligence.</p><h3>6. Multi-Hop Pathfinder (AQL)</h3><p>Executing <strong>Deterministic Reasoning</strong> using ArangoDB Query Language (AQL). We ask the graph to &#8220;walk&#8221; the path from a handle to a project, then to a task, and finally to the code.</p><h3>7. Orchestration via LangGraph</h3><p>Defining a stateful agent that records every step in a <strong>&#8220;Glass Box&#8221;</strong> trace, making the AI&#8217;s reasoning fully auditable and transparent.</p><h3>8. Contextual Resolution</h3><p>Upgrading the agent to handle <strong>Discovery Queries</strong>. If a user asks about &#8220;GPU issues,&#8221; the agent resolves the Project Context and navigates the graph to find the expert assigned to the relevant task.</p><h3>9. Wiring the Agentic Workflow</h3><p>Compiling the nodes to ensure the agent <em>must</em> resolve an identity and traverse the semantic bridges before drawing conclusions.</p><h3>10. The Gap Detector (The Proactive Architect)</h3><p>The final polish: A &#8220;Critic&#8221; node that proactively identifies <strong>Stalled Work</strong>, identifying Jira tickets that have no linked GitHub commits.</p><div><hr></div><h2>The Business Case for Graph-Powered AI</h2><p>By leveraging a <strong>Knowledge Graph</strong> substrate like <strong>ArangoDB</strong>, we provide the enterprise with three massive business value propositions:</p><ul><li><p><strong>Explainable AI (XAI):</strong> We move away from &#8220;black box&#8221; hallucinations. Every answer includes a provenance trace, showing the exact AQL traversal that connected the intent to the action.</p></li><li><p><strong>Operational Auditability:</strong> The ability to &#8220;detect gaps&#8221; between management tools and technical reality provides leadership with a real-time risk-assessment engine.</p></li><li><p><strong>Organizational Velocity:</strong> By bridging silos through <strong>Entity Resolution</strong>, we eliminate the &#8220;Context Tax&#8221; that costs engineers hours of productivity every week.</p></li></ul><p>For organizations where data is a strategic asset and precision is a requirement, the <strong>Knowledge Graph</strong> isn&#8217;t just an option; it&#8217;s the engine of the modern Digital Employee Experience.</p><p>Get the full code here in the repo: <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/06_multi_hop_reasoning_GraphRAG">snudurupati/agentic-ai-architect</a></p><p><strong>Next Week:</strong> We move from architecture to a high-stakes competitive analysis. We are setting up a definitive "Bake-Off" between two of the most discussed strategies in the enterprise AI space: <strong>Continued Pre-Training vs. Knowledge Graphs (GraphRAG)</strong>. </p><p>While some argue that baking internal knowledge directly into model weights is the path to "true" intelligence, we will examine the cold realities of cost, latency, and the inevitable "Drift" that occurs when static weights meet a dynamic codebase. We&#8217;ll look at the trade-offs of both paradigms to see how they might coexist or where one might hold the edge in a mission-critical production environment, while the other is an expensive dead end.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[Building Self-Correcting Agents]]></title><description><![CDATA[CRAG: Moving from Linear Pipelines to Corrective Reasoning Loops]]></description><link>https://www.nudurupati.co/p/building-self-correcting-agents</link><guid isPermaLink="false">https://www.nudurupati.co/p/building-self-correcting-agents</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 02 Feb 2026 04:24:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!21Vt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!21Vt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!21Vt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!21Vt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8124506,&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://www.nudurupati.co/i/186572030?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.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_!21Vt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!21Vt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32036f84-5a1c-4faa-a215-91111d300157_2816x1504.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"><svg role="img" 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"><g><title></title><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"><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"><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>In Weeks 1-4 of the &#8220;<a href="https://github.com/snudurupati/agentic-ai-architect">Agentic AI architect</a>&#8221; course, we built pipelines. We moved data from A to B, vectorized it, and shoved it into a prompt. It worked, but it was a <strong>Black Box</strong>. If the retrieval failed, the system failed silently, often hallucinating an answer to cover its tracks.</p><p>As a Data Engineer, my instinct was to &#8220;fix the pipeline.&#8221; But as an <strong>AI Architect</strong>, I realized I needed to fix the <em>process</em>.</p><p>For <strong>Week 5</strong>, we are moving from &#8220;data in a graph&#8221; to &#8220;graph as the engine of thought.&#8221; The big shift here is moving from deterministic pipelines to reasoning loops that can self-correct. We implement <strong>Corrective RAG (CRAG)</strong> - an agentic workflow that doesn&#8217;t just retrieve data; it judges it, rejects it, and tries to fix its own mistakes before answering.</p><h3>Phase 1: The Mental Model (The &#8220;Loop&#8221;)</h3><p>As a Data Engineer, you&#8217;re used to <strong>Linear Logic</strong>: <em>Input -&gt; Query -&gt; Transformation -&gt; Output</em>. In AI, that linear path breaks because LLMs are &#8220;probabilistic&#8221;; they might get it right, or they might hallucinate. <strong>LangGraph</strong> is how we build a &#8220;Correction Loop&#8221; around that uncertainty.</p><ul><li><p><strong>The Linear Way (Standard RAG):</strong> You ask a question. The system grabs the first folder it sees, reads one page, and gives you an answer. If that page was wrong, the answer is wrong.</p></li><li><p><strong>The Self-Correcting Agent Way (LangGraph):</strong> You ask a question. The agent grabs a folder and stops to think: <em>&#8220;Wait, does this actually answer the question?&#8221;</em> If the answer is &#8220;No,&#8221; it goes back to the filing cabinet, looks for a different folder, and tries again.</p></li></ul><h3>Phase 2: What is &#8220;State&#8221;? (The Shared Notepad)</h3><p>In a SQL procedure, variables exist within the scope of the run. In LangGraph, we use a <strong>State Machine</strong>. Think of the <strong>State</strong> as a &#8220;Shared Notepad&#8221; that every part of your program can see and write to. As the agent moves through the process, it keeps track of vital information on this notepad:</p><ul><li><p>What was the question?</p></li><li><p>What have I found so far?</p></li><li><p>How many times have I tried to fix this? (The <code>loop_count</code>).</p></li></ul><h3>The Problem: The &#8220;Silent Failure&#8221;</h3><p>We start with a simple query: <em>&#8220;What is the security protocol for Project Alpha?&#8221;</em> In a standard RAG setup, the retriever grabs the top 3 documents. The first one is about generic ISO27001 standards, high vector similarity, but irrelevant content. A standard chain would blindly feed this to the LLM, resulting in a generic (and wrong) answer. We need a system that could say, <em>&#8220;Wait, this isn&#8217;t right.&#8221;</em></p><p>This is the "Moltbot" trap: letting agents loose without any grounding. If the agents popping up on moltbook.com right now would just stop and say, &#8220;Wait, this isn&#8217;t right,&#8221; the internet would be a much saner place. Instead, like a standard RAG chain, they hallucinate with absolute certainty. To move from a Data Engineer to an AI Architect, we need a system that has the <em>"ego"</em> to pause, evaluate, and pivot when the data doesn't match the intent.</p><h3>The Solution: The &#8220;CRAG&#8221; Architecture</h3><p>We use LangGraph to build a state machine with four distinct &#8220;workers&#8221; (nodes):</p><ul><li><p><strong>The Retriever:</strong> The muscle. It pulls data from our ArangoDB vector index.</p></li><li><p><strong>The Grader:</strong> The brain. A specialized prompt that scans retrieved documents for specific evidence (e.g., &#8220;Project Alpha&#8221;). If it sees junk, it grades the retrieval as &#8220;NO.&#8221;</p></li><li><p><strong>The Pivot (Transformer):</strong> The strategist. If the Grader says &#8220;NO,&#8221; this node rewrites the user&#8217;s query to be more specific (e.g., adding &#8220;technical protocols&#8221; or &#8220;encryption&#8221;) and loops back to the Retriever.</p></li><li><p><strong>The Generator:</strong> The finisher. It only runs when the Grader gives a &#8220;YES.&#8221;</p></li></ul><h3>The &#8220;Aha!&#8221; Moment: The Scan &amp; Filter Pattern</h3><p>The hardest part wasn&#8217;t the code; it was the logic. During testing, my agent kept failing even after patching the data with the &#8220;Golden Record.&#8221; The debug trace revealed the <strong>&#8220;Distractor Problem&#8221;</strong>:</p><ul><li><p><strong>Doc #1:</strong> ISO27001 (Irrelevant, but high similarity score).</p></li><li><p><strong>Doc #2:</strong> Project Alpha Security (The Golden Record).</p></li></ul><p>Our original Grader looked at Doc #1, said &#8220;garbage,&#8221; and gave up. We had to implement a <strong>Scan and Filter pattern</strong>, teaching the Grader to iterate through all retrieved results, discard the distractors, and lock onto the Golden Record.</p><h3>The Results</h3><p>Once we deployed the &#8220;CRAG&#8221; logic, the trace was beautiful to watch:</p><ol><li><p><strong>Iteration 1:</strong> Retrieved generic data. Grader said <strong>NO</strong>.</p></li><li><p><strong>Pivot:</strong> Agent rewrote the query.</p></li><li><p><strong>Iteration 2:</strong> Retrieved mixed data.</p></li><li><p><strong>Scan:</strong> Grader ignored Doc #1, found the Golden Record in Doc #2. Grader said <strong>YES</strong>.</p></li><li><p><strong>Generation:</strong> Produced a grounded, accurate response citing AES-256 and MFA.</p></li></ol><h3>Key Takeaway for Data Engineers</h3><p>Moving from Data Engineering to AI Architecture isn&#8217;t about writing more complex Python; it&#8217;s about designing <strong>Control Flow</strong>.</p><ul><li><p><strong>Data Engineering</strong> is about ensuring data gets to its destination.</p></li><li><p><strong>AI Architecture</strong> is about ensuring the system knows what to do when the data is wrong.</p></li></ul><p>You have now successfully moved from a script that crashes on empty data to an autonomous system that detects missing context, pivots its search strategy, filters results, and generates a grounded response.</p><p><strong>You are no longer just a Data Engineer; you are an AI Architect.</strong></p><p>Get the full code here in the repo: <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/05_agent_orchestration">snudurupati/agentic-ai-architect</a></p><p><strong>Next Week:</strong> We tackle the final boss, <strong>Multi-Hop Reasoning</strong>. What happens when the answer isn&#8217;t in one document, but split across three? We dive into Graph Traversal with AQL.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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 is great at finding words. It’s time to help it reason. ]]></title><description><![CDATA[From Semantic Similarity to Structural Reasoning: A Data Engineer&#8217;s Guide to the Multi-Model Future of AI.]]></description><link>https://www.nudurupati.co/p/ai-is-great-at-finding-words-its</link><guid isPermaLink="false">https://www.nudurupati.co/p/ai-is-great-at-finding-words-its</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Tue, 27 Jan 2026 05:33:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Hxas!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Week 4: Data Engineer to AI Architect Series</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_!Hxas!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hxas!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 424w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 848w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hxas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png" width="1408" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1914291,&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://www.nudurupati.co/i/185897424?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.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_!Hxas!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 424w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 848w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Hxas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda0ffce7-7e7b-411a-8c41-ab3b09d17cb5_1408x736.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"><svg role="img" 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"><g><title></title><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"><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"><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>For 18 years, SQL has been my bread and butter. I&#8217;ve lived through the rise of NoSQL, the Hadoop era, and the Cloud Data Warehouse boom. But as I transition into an AI Solutions Engineer role, I&#8217;ve realized a hard truth: <strong>The tools that helped us store the world&#8217;s data are failing to help us think with it.</strong> I&#8217;ve noticed a sobering reality: despite the hype, the success rate for AI projects is surprisingly low. <strong>MIT research</strong> shows nearly <strong>40% of companies</strong> with high AI investment see <strong>no significant business gains</strong>.</p><p>The primary culprit? <strong>The Context Problem.</strong></p><h3>Beyond Semantic Similarity: The Need for Context</h3><p>We&#8217;ve been told that Vector Databases are the &#8220;brain&#8221; of GenAI. In reality, they are more like a sophisticated index of &#8220;semantic vibes.&#8221; They measure the mathematical distance between strings of text, but they don&#8217;t understand the logical relationship between facts.</p><p>Simply vectorizing PDFs and storing chunks in a vector database doesn&#8217;t solve the underlying problem. A vector database might find two separate documents that mention &#8220;Project Alpha&#8221;, but it lacks the inherent logic to know that the <em>Project Manager</em> listed in a 2024 HR directory is the same person responsible for the <em>Security Breach</em> mentioned in a 2026 server log. Without the capability to traverse these connections, your retrieval system fails to capture the full picture, leading to the &#8220;I don&#8217;t know&#8221; loop or, worse, confident hallucinations.</p><h3>The &#8220;Structuring Crisis&#8221;: Why Multi-Model is the Solution</h3><p>The hardest part of AI isn&#8217;t retrieval, it&#8217;s the mess that comes before it. This is what I call the <strong>Structuring Crisis</strong>. Teams spend months manually writing scripts to parse 200-page PDF case files, breaking them into chunks, and attempting to extract metadata. Even after that labor-intensive work, they face a dilemma: Should the data live in a vector store for search? A relational system for filtering? Or a graph for relationships?</p><p>This &#8220;architectural tax&#8221;, the need to move data between three specialized databases, is where most AI projects struggle. This is precisely why <strong>Multi-Model Databases</strong> are the solution to the structuring crisis.</p><p>A Multi-Model approach solves the crisis by eliminating the need to choose:</p><ul><li><p><strong>Flexible Ingestion:</strong> You can ingest the &#8220;mess&#8221; as raw <strong>Documents</strong> (JSON) without a rigid schema, preserving every scrap of metadata from emails to log files.</p></li><li><p><strong>Contextual Linking:</strong> You can then define <strong>Edges</strong> (Relationships) between those documents as you discover them, turning your document store into a Knowledge Graph on the fly.</p></li><li><p><strong>Integrated Retrieval:</strong> When it&#8217;s time for the AI to &#8220;think,&#8221; you don&#8217;t have to hop between systems. You can perform a <strong>Vector Search</strong> to find the starting point and immediately execute a <strong>Graph Traversal</strong> to find the context, all in a single query.</p></li></ul><p>The symbiosis is simple: AI helps clean and connect the unstructured data, and the Multi-Model database provides a single, unified home for the resulting &#8220;Reasoning Backbone.&#8221; You aren&#8217;t just storing data anymore; you are building a system where the document, the vector, and the relationship live together.</p><h3>The Bakeoff: Vector Search vs. GraphRAG</h3><p>This week, I ran a &#8220;Glass Box&#8221; experiment in my lab. I loaded a small network into ArangoDB, representing a lead architect (me), a project (Project Alpha), and a security protocol (ISO 27001).</p><p>&#128073; <strong><a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/04_advanced_rag">GitHub Repo: Data Engineer to AI Architect - Week 4</a></strong></p><p>Then I asked: <em>&#8220;What security constraints are linked to Sreeram&#8217;s work?&#8221;</em></p><ul><li><p><strong>Vector RAG Answer:</strong> <em>&#8220;I don&#8217;t know.&#8221;</em></p><ul><li><p><strong>The Failure:</strong> The vector engine found the chunk about &#8220;Sreeram&#8221; and the chunk about &#8220;Project Alpha,&#8221; but it couldn&#8217;t &#8220;see&#8221; the relationship to the &#8220;ISO27001&#8221; document three degrees away. They were semantically similar but logically disconnected.</p></li></ul></li><li><p><strong>GraphRAG Answer:</strong> <em>&#8220;Sreeram&#8217;s work is governed by ISO27001, which mandates hardware-level encryption for the payment services used in Project Alpha.&#8221;</em></p><ul><li><p><strong>The Success:</strong> The system performed a <strong>Deep Traversal</strong>. It followed the logical edges from Person &#8594; Project &#8594; Service &#8594; Protocol.</p></li></ul></li></ul><h3>Why ArangoDB? (A Small Disclosure)</h3><p>Now, full transparency: I recently joined the team at <strong>Arango</strong>. But my choice of tool here isn&#8217;t just a matter of professional alignment; it&#8217;s about solving the &#8220;Architectural Tax.&#8221;</p><p>In a typical AI stack, you&#8217;d have to sync data between a Document store, a Vector DB, and a Graph DB. That is a data engineering nightmare. I chose ArangoDB because it is <strong>Multi-Model</strong>.</p><p>It handles document-style lookups, deep graph-style traversals, and native vector search with <strong>one query language</strong>. In the GenAI era, the baseline requirement is a database that lets you retrieve everything at once without moving data between three different systems.</p><h3>The Future: Context Engineering</h3><p>If you&#8217;ve spent the last few years mastering prompt engineering and vector indexing, those skills are your foundation, but they aren&#8217;t the ceiling. The next evolution of AI will be built on <strong>Context Engineering</strong>.</p><p>Graphs will be the backbone of this movement. They are the way to provide AI with the structural reasoning it needs to stop hallucinating and start performing. Context engineering isn&#8217;t just about the words; it&#8217;s about the connections between them.</p><p>&#8220;<em>A relational database can store your knowledge. A graph database lets you think with it.</em>&#8221;</p><p><strong>Next Week:</strong> We&#8217;ll move into <strong>Agentic Workflows</strong>. Showing how an AI agent can &#8220;self-correct&#8221; by querying the graph when it hits a dead end.</p><div><hr></div><p><strong>References:</strong></p><ul><li><p><a href="https://sloanreview.mit.edu/projects/expanding-ais-impact-with-organizational-learning/">MIT Sloan: Expanding AI&#8217;s Impact With Organizational Learning</a></p></li><li><p><a href="https://www.youtube.com/watch?v=DHOxNkytuBI">Knowledge Graph Development for Effective AI Systems</a></p></li><li><p><a href="https://arango.ai/resources/turbocharge-genai-with-graphs/">Turbocharge GenAI with Graphs</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[Code, Media, and Leverage: How I Navigated the 2025 Tech Market]]></title><description><![CDATA[The messy reality of building leverage, surviving 2025, and transforming for the AI era.]]></description><link>https://www.nudurupati.co/p/code-media-and-leverage-how-i-navigated</link><guid isPermaLink="false">https://www.nudurupati.co/p/code-media-and-leverage-how-i-navigated</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Fri, 23 Jan 2026 14:15:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AJ7n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AJ7n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AJ7n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AJ7n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7720959,&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://www.nudurupati.co/i/185509865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.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_!AJ7n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!AJ7n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c4ae42d-72db-4593-87f1-c5c1145d966d_2816x1504.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"><svg role="img" 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"><g><title></title><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"><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"><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>We&#8217;re a few weeks into 2026 now, and with some distance, it&#8217;s easier to see 2025 for what it really was: a correction year.</p><p>Post-COVID excess finally unwound. Hiring slowed, budgets tightened, and the bar for technical roles jumped, not just on depth, but on relevance. Being &#8220;good at coding&#8221; stopped being enough. Companies wanted people who could ship, explain <em>why</em> it mattered, and connect technical decisions to business outcomes from day one.</p><p>I don&#8217;t claim to have cracked some secret code. I made plenty of wrong turns, second-guessed myself often, and benefited from timing and luck as much as effort. But I did change how I approached the market, and that shift helped me land a Staff-level role going into 2026.</p><p>What follows isn&#8217;t a blueprint, just the lessons that made the biggest difference for me.</p><div><hr></div><h2>1. Advertise Yourself (Build Your Signal)</h2><p>There&#8217;s a comforting myth in engineering: <em>&#8220;Good work speaks for itself.&#8221;</em></p><p>In a noisy market, that&#8217;s simply false. Good work whispers. Noise wins.</p><p>For a long time, I assumed that if I just kept my head down and built solid systems, the right people would eventually notice. In 2025, that assumption stopped holding. If people didn&#8217;t know what I was working on, what I was curious about, or how I thought about problems, I effectively didn&#8217;t exist.</p><p>So I stopped treating my work like it was in permanent stealth mode. I started sharing learnings, partial ideas, architectural tradeoffs, and even things I hadn&#8217;t fully figured out yet. I leaned heavily on a framework popularized by Naval Ravikant: <strong>Code and Media as permissionless leverage.</strong></p><p>Not everything landed. Some posts went nowhere. Some ideas aged poorly. That was uncomfortable but necessary.</p><p><strong>The lesson:</strong> You might be capable, but value is invisible until it&#8217;s communicated. Being visible isn&#8217;t arrogance; it&#8217;s clarity. When you increase your surface area of luck, the market has something to react to.</p><div><hr></div><h2>2. Learn a New Skill (But Don&#8217;t Chase Hype)</h2><p>&#8220;Learn whatever&#8217;s hot&#8221; is lazy advice. If you chase every trend, you end up broad, shallow, and forgettable.</p><p>Instead, I tried to be deliberate about adjacency. I didn&#8217;t abandon my background in data engineering; I extended it. I focused on the bridge between where I already had depth and where the market was clearly heading: AI systems, RAG, GraphRAG, real-time architectures, and the unglamorous infrastructure problems underneath them.</p><p>In version two of this story, it might sound like a clean pivot from &#8220;data plumber&#8221; to &#8220;AI architect.&#8221; In reality, it was messier. I built things that didn&#8217;t scale. I over-engineered. I underestimated operational complexity more than once. But I was learning in the direction of leverage.</p><p><strong>The lesson:</strong> Don&#8217;t learn tools for their own sake. Learn skills that compound your existing experience in a new context. Be the bridge, not the tourist.</p><div><hr></div><h2>3. Code + Media = Leverage</h2><p>Naval Ravikant&#8217;s idea that code and media are permissionless leverage sounds abstract until you live it.</p><p>Code was still the foundation. Building real systems, especially ones that touched retrieval, orchestration, streaming, and AI infrastructure, gave me credibility. Shipping mattered far more than talking.</p><p>But code alone didn&#8217;t close the loop.</p><p>What surprised me was how often <em><strong>media</strong></em> made the difference, not podcasts or YouTube, just clear communication.</p><ul><li><p>Your resume is media.</p></li><li><p>Your interview answers are media.</p></li><li><p>Your blog posts, diagrams, and &#8220;About Me&#8221; blurbs are media.</p></li></ul><p>I noticed a pattern: my code got me in the room, but my ability to explain <em>why</em> the system was designed a certain way and what tradeoffs I accepted was what moved conversations forward.</p><p>That didn&#8217;t come naturally. I rewrote explanations repeatedly. I stumbled in interviews. I learned (slowly) how to connect technical decisions to business risk, cost, and reliability.</p><p><strong>The lesson:</strong> Code builds the value. Media translates it. If you neglect either, you leave leverage on the table.</p><div><hr></div><h2>4. The Recruiter Is an Ally (If You Let Them Be)</h2><p>Earlier in my career, I treated recruiters like hurdles, something to clear before talking to the &#8220;real&#8221; team. That mindset cost me opportunities.</p><p>In 2025, I changed tactics. I started treating good recruiters as partners. I asked direct questions. I asked for feedback. I listened for what <em>wasn&#8217;t</em> written in the job description.</p><p>Recruiters often know:</p><ul><li><p>What the hiring manager is worried about</p></li><li><p>Why the last candidate failed</p></li><li><p>Which skills are negotiable and which aren&#8217;t</p></li></ul><p>They don&#8217;t always volunteer that information, but they will if you treat them like collaborators instead of obstacles.</p><p><strong>The lesson:</strong> Prep <em>with</em> your recruiter, not just <em>for</em> them. An informed ally on the inside is a real advantage.</p><div><hr></div><h2>5. Using AI as a Force Multiplier (Not a Crutch)</h2><p>One thing I learned quickly: if you&#8217;re applying for AI roles and not using AI in your job search, you&#8217;re leaving efficiency on the table.</p><p>I treated LLMs like a Chief of Staff, not a resume-spamming machine.</p><ul><li><p>I used them to <em>tailor</em> resumes, not fabricate experience.</p></li><li><p>I used them to synthesize company strategy and competitive landscapes.</p></li><li><p>I used chat-based mock interviews to stress-test my explanations.</p></li></ul><p>The outputs weren&#8217;t perfect. I had to sanity-check everything. But the time savings and clarity were real.</p><p><strong>The lesson:</strong> AI won&#8217;t replace judgment, but it dramatically amplifies it if you already know what &#8220;good&#8221; looks like.</p><div><hr></div><h2>Looking Ahead: 2026 and the Shift to AI Production</h2><p>If 2025 was the year of the AI demo, 2026 is shaping up to be the year of AI production.</p><p>The novelty is gone. A chatbot that works 80% of the time is no longer impressive. What matters now are the hard, messy problems: Governance, Security, Accuracy, Cost, and operational reliability. We&#8217;re moving from the magical phase of AI to the industrial one. The opportunities won&#8217;t go to people who can use tools, but to those who can make systems dependable.</p><p>I&#8217;m still learning. I&#8217;m still wrong more often than I&#8217;d like. But the direction is clear.</p><p>Keep building. Keep shipping. And don&#8217;t be afraid to tell your story - clearly, honestly, and without pretending you have it all figured out. The opportunity is out there.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.nudurupati.co/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 The Glass Box! 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[RAG: ETL for Intelligence]]></title><description><![CDATA[Beyond the Prompt: Giving Your AI Infinite Memory]]></description><link>https://www.nudurupati.co/p/rag-etl-for-intelligence</link><guid isPermaLink="false">https://www.nudurupati.co/p/rag-etl-for-intelligence</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 12 Jan 2026 16:59:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c4ba9f21-38af-4857-935b-3a50664a7ff6_299x163.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Beyond the Prompt: Giving Your AI Infinite Memory</h3><p><strong>Week 3: Scaling from Simple Chats to Enterprise Knowledge with RAG</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_!X0_K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X0_K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X0_K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8596914,&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://www.nudurupati.co/i/184624300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.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_!X0_K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!X0_K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45647b1d-8a5e-4b98-8707-3ded67dde6c1_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>In <a href="https://nudurupati.co/2026/01/05/stop-texting-your-ai/">Week 2</a>, we explored the power of structure, transforming open-ended conversations into reliable and actionable data. It was a huge step forward in building systems we can trust.</p><p>This week, we get to tackle one of the most exciting challenges in modern AI: <strong>Knowledge</strong>.</p><p>We all know the feeling of chatting with a powerful model like GPT-5. It is incredibly smart, knowledgeable about the world, and helpful. But there is one thing it doesn&#8217;t know: <em>Us.</em></p><p>It doesn&#8217;t know the specific error codes in your legacy logs, your unique network topology, or the details of that new internal project you launched yesterday.</p><p>The good news? We have the tools to bridge that gap.</p><h3>The Opportunity: Why RAG is a Game Changer</h3><p>You might be thinking, <em>&#8220;Context windows are getting huge! With 128k tokens, can&#8217;t I just paste my entire document into the chat?&#8221;</em></p><p>For a quick prototype, absolutely! It&#8217;s a great way to test an idea. But as Architects, we have an opportunity to build something more scalable, efficient, and cost-effective.</p><p>Think of <strong>RAG (Retrieval Augmented Generation)</strong> not just as a fix, but as an upgrade to your AI&#8217;s operating system.</p><ol><li><p><strong>Efficiency:</strong> Instead of asking the model to read a &#8220;100-page book&#8221; for every single question (which takes time and money), RAG lets the model instantly flip to the exact page it needs.</p></li><li><p><strong>Focus:</strong> By providing only the most relevant information, we help the model give sharper, more accurate answers, avoiding the distraction of unrelated data.</p></li><li><p><strong>Scale:</strong> RAG allows your AI to access vast libraries of information, far more than could ever fit in a single prompt.</p></li></ol><h3>The Business Win: Solving Real Problems</h3><p>If you are explaining this to stakeholders, like a VP of Market Intelligence at a large telecom company, the value proposition is robust.</p><p><strong>The Challenge:</strong> Their team spends hundreds of hours every quarter manually sifting through competitor earnings transcripts, industry analyst PDF reports, and news releases just to answer one question: <em>&#8220;What are our top 3 competitors doing about 5G pricing in APAC?&#8221;</em></p><p><strong>The Opportunity:</strong> We can build a <strong>&#8220;Market Intelligence Engine&#8221;</strong> that indexes all those PDF reports and transcripts.</p><ul><li><p><strong>For the VP of Market Intelligence:</strong> It means instant synthesis. Instead of waiting three days for an analyst to summarize the data, they can ask, <em>&#8220;Compare our churn rate against Competitor X based on their Q4 earnings call,&#8221;</em> and get a citation-backed answer in seconds.</p></li><li><p><strong>For the Data Engineer:</strong> It means you are no longer just maintaining pipelines for dashboards. You are unlocking the value trapped in the &#8220;dark data&#8221; (unstructured text) that the strategy team is desperate to access.</p></li></ul><h3>RAG is Just ETL (with a little Math)</h3><p>For those of us coming from a Data Engineering background, RAG can sound intimidating with terms like &#8220;Embeddings&#8221; and &#8220;Vector Spaces.&#8221; But here is the secret: <strong>RAG is just an ETL pipeline.</strong> You already have the skills to build this.</p><p>In this week&#8217;s notebook, we build a &#8220;Glass Box&#8221; system to see this pipeline in action:</p><h4>1. Extract (The Source)</h4><p>We start by loading our raw data, in our case, a PDF that the model has never seen before. We use tools like <code>PyMuPDFLoader</code> to bring that text into our environment.</p><h4>2. Transform (The Art of Chunking)</h4><p>This is where we add our engineering touch. Just as we wouldn&#8217;t load a massive CSV into a database without cleaning it, we don&#8217;t load a whole book into a vector store as one block.</p><p>We &#8220;chunk&#8221; the text into smaller, meaningful windows. We use a technique called <code>RecursiveCharacterTextSplitter</code> with <strong>overlap</strong>. This ensures that we capture complete ideas, even if a sentence sits on the boundary between two chunks. It&#8217;s about preserving the <em>context</em> of the data.</p><h4>3. Load (Embeddings &amp; Vectors)</h4><p>This is the magical part where text becomes numbers. We pass our chunks through an <strong>Embedding Model</strong>.</p><p>The model turns a sentence like <em>&#8220;Competitor X plans to aggressively discount 5G plans in Q4 to capture market share&#8221;</em> into a vector, a list of numbers that represents the <em>concept</em> of that sentence.</p><p>We load these into a <strong>Vector Database</strong> (like ChromaDB). Now, instead of searching for keywords, we can search for <em>concepts</em>. If a user asks, <em>&#8220;What is the pricing strategy for next quarter?&#8221;</em>, the math will point them straight to this vector, even though the word &#8220;strategy&#8221; wasn&#8217;t in the original sentence.</p><h3>The &#8220;Glass Box&#8221; Inspector</h3><p>One of the best ways to build confidence in this new technology is to peek under the hood.</p><p>In our code, we build an <strong>inspection loop</strong>. Before the AI answers a user&#8217;s question, we make it show us exactly which chunks of text it found. It&#8217;s a great way to verify that our &#8220;ETL pipeline&#8221; is working as expected and to understand <em>why</em> the model gave a certain answer. It turns the &#8220;magic&#8221; into engineering.</p><h3>The Architect&#8217;s Quiz (Homework)</h3><p>One of the best ways to solidify new knowledge is to test it against real-world scenarios. Here are three questions to ask yourself as you play with the <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/03_rag_fundamentals">code</a> this week:</p><ol><li><p><strong>The &#8220;Granularity&#8221; Trade-off:</strong> In our notebook, we used a chunk size of <code>500</code> characters. What do you think happens to the retrieval quality if you change that to <code>50</code>? What if you change it to <code>5000</code>? <em>(Hint: Think about &#8220;Context&#8221; vs. &#8220;Noise&#8221;. Data engineering is all about finding the right balance!)</em></p></li><li><p><strong>The Staleness Factor:</strong> If you update the source PDF on your local drive tomorrow to fix a typo, does your Vector Database automatically know about the change? <em>(Hint: Think about how ETL pipelines work. Do vectors update themselves, or do we need to trigger a new &#8220;Load&#8221; job?)</em></p></li><li><p><strong>The Production Challenge:</strong> We set our retriever to look for the top 3 results (<code>k=3</code>). If a user asks a complex question that requires information scattered across <strong>10 different pages</strong>, what will happen to the answer? How might we solve this without just setting <code>k=100</code>?</p></li></ol><h3>The Next Frontier: Reasoning Across Documents</h3><p>We wrap up this week&#8217;s exploration with an interesting experiment. We ask our new RAG system, which is configured to find the top 3 most relevant facts, to do something broad:</p><blockquote><p><strong>User:</strong> &#8220;Summarize the whole document in 1 paragraph.&#8221;</p></blockquote><p>The result is usually a summary of&#8230; just the first few pages.</p><p>This isn&#8217;t a failure; it&#8217;s a discovery! We learn that basic retrieval is perfect for finding specific facts (&#8220;What is the error code?&#8221;). But it needs help with broad summarization (&#8220;What is this book about?&#8221;).</p><p>This sets the stage perfectly for <strong>Week 4</strong>. Next week, we will explore Advanced RAG patterns, such as re-ranking and contextual chunking, to help our AI understand the &#8220;big picture&#8221; just as well as the small details.</p><p>We are building something powerful, one block at a time.</p><p>See you in the&nbsp;<a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/03_rag_fundamentals">repo</a>.</p><p><em><strong>The Robot Brain Diaries</strong></em></p>]]></content:encoded></item><item><title><![CDATA[Stop Texting Your AI]]></title><description><![CDATA[How to Enforce JSON Output with Pydantic]]></description><link>https://www.nudurupati.co/p/stop-texting-your-ai</link><guid isPermaLink="false">https://www.nudurupati.co/p/stop-texting-your-ai</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 05 Jan 2026 16:02:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3fc8d9d7-f931-42e9-86fc-25fd11c8cf2b_300x163.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>How to Enforce JSON Output with Pydantic</h3><h5><strong>Week 2: Moving from &#8220;Vibes&#8221; to &#8220;Validation&#8221; with the Agentic AI Architect</strong></h5><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QkJ3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QkJ3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QkJ3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6803369,&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://www.nudurupati.co/i/184624301?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.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_!QkJ3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!QkJ3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa314999a-af08-4783-babf-6758d38fd1dd_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>In <a href="https://nudurupati.co/2025/12/29/the-stochastic-cpu/">Week 1</a>, we established that LLMs are not magic brains; they are <strong>Stochastic CPUs</strong>. They are non-deterministic engines that predict the next token.</p><p>If you treat them like a chat buddy, sending polite texts like <em>&#8220;Please analyze this email and give me a summary, thanks!&#8221;</em>, you are building fragile software. You are hoping the Stochastic CPU is in a good mood.</p><p>But we are Architects. We are in the business of engineering certainty.</p><p>To build production-grade agents, we need to stop &#8220;texting&#8221; our AI and start treating it like a function call. We need inputs that are typed and outputs that are guaranteed.</p><p>Welcome to <strong>Week 2: Structured Output &amp; Prompt Engineering as Code</strong>.</p><div><hr></div><h3>The &#8220;Hello World&#8221; of Enterprise AI: Classification</h3><p>Before we look at the code, let&#8217;s look at the landscape.</p><p>While LinkedIn is busy debating the &#8220;Promise vs. Reality&#8221; of AI or doom-scrolling about &#8220;AI Slop,&#8221; most engineers are stuck in analysis paralysis, waiting to see who &#8220;wins the race&#8221; between OpenAI and DeepSeek.</p><p>We aren&#8217;t waiting. We are building.</p><p>The backbone of Enterprise AI isn&#8217;t image generation; it&#8217;s <strong>Classification</strong>.</p><ul><li><p>Routing customer support tickets (Billing vs. Technical).</p></li><li><p>Scoring sales leads (High Intent vs. Kicker).</p></li><li><p>Detecting severity (P1 vs. P3).</p></li></ul><p><strong>The Traditional ML Path:</strong> If you have a dedicated Data Science team, a year of lead time, and 100,000 rows of clean, labeled data, by all means, train a BERT model or an XGBoost classifier. It is efficient, specialized, and cheap at scale.</p><p><strong>The Architect Way:</strong> But what if you need a production-ready classifier <em>today</em> and you don&#8217;t have labeled data? You write a schema. You use a zero-shot LLM. You have a working system by lunch.</p><p>This week, we are building exactly that: <strong>A SaaS Email Router</strong> that takes messy, angry customer emails and converts them into rigid, actionable JSON.</p><p><em>(Note: This pattern is the foundational building block for the Data Contract Validator we will build in our Capstone project.)</em></p><div><hr></div><h3>The Architecture: Chaos In, Structure Out</h3><p>The goal is to turn unstructured noise into structured signal. To do this, we are using <strong>LangChain</strong> and <strong>Pydantic</strong>.</p><p>Here is the difference between a &#8220;Script&#8221; and an &#8220;Architecture&#8221;:</p><h4>1. The Contract (Pydantic)</h4><p>We don&#8217;t ask the LLM for &#8220;a JSON.&#8221; We define exactly what that JSON looks like using a Pydantic model. This is our interface contract.</p><p>Python</p><pre><code>from pydantic import BaseModel, Field
from typing import Literal

class EmailAnalysis(BaseModel):
    category: Literal["billing", "technical_support", "sales", "complaint", "spam"] = Field(
        description="The primary intent of the email."
    )
    priority: Literal["high", "medium", "low"]
    summary: str = Field(description="A concise 1-sentence summary.")
    confidence: float = Field(ge=0, le=1, description="Confidence score 0.0 to 1.0.")

</code></pre><p><strong>Why this is powerful:</strong></p><ul><li><p><strong>Enforced Enums:</strong> We use <code>Literal</code> to restrict the category. The LLM <em>cannot</em> invent a category like &#8220;Unsure&#8221; or &#8220;Maybe Billing.&#8221; It must pick from our list.</p></li><li><p><strong>Constraints:</strong> We enforce that <code>confidence</code> must be a float between 0.0 and 1.0 using <code>ge</code> (greater or equal) and <code>le</code> (less or equal).</p></li></ul><p>If the LLM misses a field or returns a string instead of a float, Pydantic throws a validation error. In our architecture, the <code>PydanticOutputParser</code> catches this error and <em>automatically</em> asks the LLM to fix it. Making the code Self-healing.</p><h4>2. The Logic Layer (Why we need &#8220;Confidence&#8221;)</h4><p>You noticed the <code>confidence</code> field in the schema above. This isn&#8217;t just for show.</p><p>In a production system, getting the data structure right is only half the battle. You also need to know <strong>how much to trust it</strong>. By forcing the LLM to self-evaluate (<code>0.0</code> to <code>1.0</code>), we can build a Logic Layer on top of the prediction:</p><ul><li><p><strong>High Confidence (&gt; 0.9):</strong> Auto-process the refund.</p></li><li><p><strong>Medium Confidence (0.5 &#8211; 0.9):</strong> Route to a human queue with a &#8220;suggested&#8221; tag.</p></li><li><p><strong>Low Confidence (&lt; 0.5):</strong> Trigger a retry loop or flag for manual audit.</p></li></ul><p>Without this field, your application is flying blind.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CJzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CJzB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CJzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97221d95-e975-47a9-bee0-634a691d8d89_72x72.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#128161;&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="&#128161;" title="&#128161;" srcset="https://substackcdn.com/image/fetch/$s_!CJzB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!CJzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97221d95-e975-47a9-bee0-634a691d8d89_72x72.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong> The Architect&#8217;s Note: Temperature vs. Confidence</strong></p><p>A common point of confusion: <em>&#8220;If I set Temperature=0, isn&#8217;t the model already confident?&#8221;</em></p><p><strong>No.</strong> Think of it like a <strong>Weather Forecaster</strong>.</p><ul><li><p><strong>Temperature (0.0)</strong> is telling the forecaster: <em>&#8220;Always give me the most statistically likely prediction. No creativity. No &#8216;maybe it will snow in July&#8217;.&#8221;</em></p></li><li><p><strong>Confidence</strong> is asking the forecaster: <em>&#8220;Okay, you predicted rain. On a scale of 0 to 100, how sure are you?&#8221;</em></p></li></ul><p>You use <strong>Temperature</strong> to make the forecast consistent (deterministic), but you use the <strong>Confidence Score</strong> to decide if you should actually carry an umbrella (business logic).</p><h4>3. Prompts as Code (The YAML Strategy)</h4><p>Finally, stop hardcoding your prompt strings inside your Python functions. It is messy, hard to read, and harder to version control.</p><p>In this <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/02_structured_output">repo</a>, we treat <strong>Prompts as Code</strong>. We extract the logic into <code>classifier_prompt.yaml</code>.</p><p><strong>Why this matters:</strong></p><ul><li><p><strong>Version Control:</strong> You can see diffs in your prompt logic over time.</p></li><li><p><strong>Testability:</strong> You can swap out prompts without touching the deployment code.</p></li><li><p><strong>Determinism:</strong> It forces you to think of the prompt as a config file, not a magic spell.</p></li></ul><div><hr></div><h3>Trust, but Verify (LLM-as-Judge)</h3><p>You have your JSON. Great. But is it <em>correct</em>?</p><p>Most tutorials stop here. We don&#8217;t. In the <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/02_structured_output">repo</a>, <code>main.py</code> includes a <strong>Golden Dataset</strong>, a list of tricky emails with known &#8220;correct&#8221; answers. We use <strong>GPT-4o as a Judge</strong> to grade our cloud/local model&#8217;s output.</p><p>We don&#8217;t just &#8220;eyeball&#8221; it. We run a test suite.</p><div><hr></div><h3>Prompt Engineering Isn&#8217;t Dead, It Just Graduated</h3><p>Some people claim &#8220;Prompt Engineering is dead.&#8221; They are wrong. It just evolved from &#8220;guessing magic words&#8221; to <strong>System Design</strong>.</p><p>When building your YAML prompts, keep these four pillars in mind:</p><ol><li><p><strong>Context (Persona):</strong> Don&#8217;t just say &#8220;Classify this.&#8221; Say &#8220;You are a Tier 3 Support Manager.&#8221;</p></li><li><p><strong>Clarity:</strong> Be verbose. Ambiguity in the prompt leads to hallucinations in the output.</p></li><li><p><strong>Structure:</strong> Explicitly define the output format (like we did with Pydantic).</p></li><li><p><strong>Iteration:</strong> Don&#8217;t change the prompt based on one example. Run it against your Golden Dataset to ensure you didn&#8217;t fix one edge case only to break three others.</p></li></ol><p>When you lock these principles into a YAML file, your prompt becomes <strong>code</strong>: version-controlled, testable, and deterministic.</p><div><hr></div><h3>Conclusion: The Architect&#8217;s Checklist</h3><p>If you are building an Agentic System, ensure you can check these boxes:</p><ul><li><p><strong>No &#8220;Vibes&#8221;:</strong> Are your inputs and outputs strongly typed (Pydantic/JSON schemas)?</p></li><li><p><strong>Config, not Code:</strong> Is your prompt logic separated from your application logic (YAML)?</p></li><li><p><strong>Deterministic Base:</strong> Is your temperature set to 0 for logic tasks?</p></li><li><p><strong>Self-Awareness:</strong> Does your agent return a &#8220;Confidence&#8221; score for logic flow?</p></li><li><p><strong>Graded:</strong> Do you have a &#8220;Golden Dataset&#8221; to verify the agent&#8217;s accuracy?</p></li></ul><div><hr></div><h3>The Architect&#8217;s Quiz (Homework)</h3><ol><li><p><strong>The Assignment:</strong> Clone the repo: <a href="https://github.com/snudurupati/agentic-ai-architect">https://github.com/snudurupati/agentic-ai-architect</a></p></li><li><p>Run <code>python 02_structured_output/main.py</code>. Watch as the system processes the Golden Dataset and grades itself.</p></li><li><p><strong>The Twist:</strong> What happens to your system when the definition of &#8220;Priority: High&#8221; changes? Do you update the Python code, or just the YAML prompt?</p></li><li><p><strong>The Edge Case:</strong> If the LLM is 90% confident but technically wrong, how do you catch that in production?</p></li></ol><div><hr></div><h3>The Road Ahead: Why Structure Matters for RAG</h3><p>You might be asking, &#8220;Why do I need JSON if I just want to build a Chatbot?&#8221;</p><p>Next week, we tackle <strong>RAG (Retrieval Augmented Generation)</strong>. To build a RAG system that doesn&#8217;t hallucinate, you cannot just shovel documents into a context window. You need to structure your <em>queries</em> and your <em>retrieved data</em>.</p><p>If you can&#8217;t control the output shape of a simple email classifier, you have no chance of controlling a multi-document retrieval agent.</p><p>Stop guessing. Start Architecting.</p><p>See you in the <a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/02_structured_output">repo</a>.</p><p><em><strong>The Robot Brain Diaries</strong></em></p>]]></content:encoded></item><item><title><![CDATA[The Stochastic CPU]]></title><description><![CDATA[The Agentic AI Architect: Week 1]]></description><link>https://www.nudurupati.co/p/the-stochastic-cpu</link><guid isPermaLink="false">https://www.nudurupati.co/p/the-stochastic-cpu</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 29 Dec 2025 16:16:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e13e39bc-0fc3-49aa-8112-cb6d4a477501_300x163.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>The Agentic AI Architect: Week 1</h3><div><hr></div><p><strong>Why LLMs are just a new type of processor, and how to benchmark them.</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_!r3hT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r3hT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r3hT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6612248,&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://www.nudurupati.co/i/184624302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.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_!r3hT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!r3hT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F630a1975-3f95-40a1-be31-e90f6417e2d7_2816x1536.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"><svg role="img" 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"><g><title></title><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"><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"><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>Last week, I wrote about <em><a href="https://nudurupati.co/2025/12/16/the-agentic-data-engineer/">The Agentic Data Engineer</a></em>, and the response was overwhelming. 40,000 impressions and hundreds of new connections later, one thing is abundantly clear: <strong>Data Engineers are ready to evolve.</strong></p><p>We are tired of being &#8220;plumbers.&#8221; We want to be architects.</p><p>So, I&#8217;m doubling down. I am turning that single blog post into an open-source, 8-week curriculum called <strong>The Agentic AI Architect</strong>. I&#8217;m building it in public, and you can follow along.</p><p>I have renamed and restructured the repo to support this journey.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T4M8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T4M8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T4M8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#128073;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#128073;" title="&#128073;" srcset="https://substackcdn.com/image/fetch/$s_!T4M8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 424w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 848w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 1272w, https://substackcdn.com/image/fetch/$s_!T4M8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F696b5d24-69e4-427d-835b-f5aab4c99d9d_72x72.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p><strong>Star the Repo:</strong> <a href="https://github.com/snudurupati/agentic-ai-architect.git">github.com/snudurupati/agentic-ai-architect</a></p><p>We start today with <strong>Week 1: The Stochastic CPU.</strong></p><div><hr></div><h3>The Mindset Shift: It&#8217;s Not Magic, It&#8217;s Compute</h3><p>The biggest mistake I see developers make is treating LLMs like magic genies. You rub the lamp (send a prompt), and you get a wish (an answer).</p><p>To build production systems, you need to stop thinking of them as magic and start treating them as a <strong>Stochastic (Probabilistic) CPU.</strong></p><ul><li><p><strong>Your Laptop CPU:</strong> Deterministic. <em>2+2</em> always equals <em>4</em>.</p></li><li><p><strong>The LLM CPU:</strong> Probabilistic. <em>2+2<strong> </strong></em>is <em>probably</em> <em>4</em>, but depending on the temperature, it might be <em><strong>&#8220;</strong>Four&#8221;</em><strong> </strong>or &#8220;<em>Math is a social construct.&#8221;</em></p></li></ul><p>As an architect, your job isn&#8217;t to marvel at the intelligence; it&#8217;s to manage the constraints of this new processor.</p><div><hr></div><h4>1. Context Window is the New RAM (And it has Amnesia)</h4><p>If an LLM is a CPU, the Context Window is its RAM. But unlike your laptop, this RAM gets wiped clean after every single operation.</p><p><strong>The &#8220;Hidden&#8221; Cost of Chat:</strong></p><p>When you use ChatGPT, it feels like the model remembers you. It doesn&#8217;t. The application secretly copies your entire conversation history and pastes it back into the prompt for every new message. This means every time you ask a follow-up question, you aren&#8217;t just sending 5 words; you are re-sending the previous 5,000 words.</p><p><strong>Why &#8220;Quadratic Scaling&#8221; Matters (The Data Engineer Analogy):</strong></p><p>You might hear that Attention scales &#8220;quadratically.&#8221; What does that actually mean?</p><p>Think of it like a SQL Join. When an LLM processes text, it doesn&#8217;t just read linearly. It compares <em>every</em> token to <em>every other</em> token to understand the relationships (Attention).</p><ul><li><p><strong>In SQL terms:</strong> It is a <strong>Self-Cross Join</strong> (Cartesian Product) of the input data.</p><ul><li><p>Input: 10 tokens &#8594; Join checks 100 relationships.</p></li><li><p>Input: 100 tokens &#8594; Join checks 10,000 relationships.</p></li><li><p>Input: 100k tokens &#8594; Join checks 10,000,000,000 relationships.</p></li></ul></li></ul><p>This is why a 128k context window isn&#8217;t just &#8220;more storage&#8221;, it&#8217;s an exponentially harder math problem that slows everything down.</p><p><strong>Cloud (128k) vs. Local (32k):</strong></p><ul><li><p><strong>Cloud (GPT-4o):</strong> With a 128k window, you can &#8220;Join&#8221; an entire book or a massive codebase in one go. The cloud provider has the massive H100 clusters required to handle that explosion of compute.</p></li><li><p><strong>Local (Ollama/GPT-OSS:20B):</strong> If your local model has a 32k limit, that is your hard RAM ceiling. If you try to feed it a 50-page document, it&#8217;s like trying to load a 1TB CSV into a 16GB laptop. It will either crash (OOM) or you will have to truncate (delete) data, causing the model to &#8220;forget&#8221; the beginning of the document.</p></li></ul><div><hr></div><h3>The Data Pipeline of Thought: From Words to Vectors</h3><p>Before we write code, we need to understand the data pipeline. You are used to ETL (Extract, Transform, Load). LLMs have their own pipeline: <strong>Tokenize, Embed, Infer.</strong></p><h4>Step 1: Words &#8594; Tokens</h4><p>LLMs do not read &#8220;English.&#8221; They read numbers. The <strong>Tokenizer</strong> is a pre-processor that chops text into chunks.</p><ul><li><p><strong>Text to Token (The Chop):</strong> The tokenizer splits text into chunks.</p><ul><li><p>Input: &#8220;Applesauce&#8221;</p></li><li><p>Tokens: <code>"Apple"</code> and <code>"sauce"</code> (Two distinct chunks).</p></li></ul></li><li><p><strong>Token to ID (The Lookup):</strong> The system looks up these chunks in its fixed vocabulary dictionary.</p><ul><li><p><code>"Apple"</code> &#8594; <code>ID 452</code></p></li><li><p><code>"sauce"</code> &#8594; <code>ID 8812</code></p></li></ul></li><li><p><strong>ID to Embedding (The Meaning):</strong> The GPU looks up <code>ID 452</code> in its learned memory and retrieves a vector.</p><ul><li><p><code>ID 452</code> &#8594; <code>[0.02, -0.44, 0.91, ...]</code></p></li></ul></li></ul><p><strong>Why this matters:</strong> We don&#8217;t pay API providers for words; we pay for those integer chunks (IDs). And the conversion from ID to Vector? That is the model&#8217;s &#8220;brain&#8221; that it learned during training.</p><p><strong>The &#8220;Vocabulary&#8221; Hook:</strong></p><p>Every model comes with a fixed Vocabulary, a specific list of words it knows. If you swap the tokenizer (e.g., use Llama&#8217;s tokenizer with GPT-4&#8217;s model), the model will receive the wrong IDs. It&#8217;s like sending a French dictionary code to an English speaker.</p><ul><li><p><strong>Architect&#8217;s Note:</strong> This <code>Token -&gt; Embedding</code> translation is <strong>learned</strong> during training. It is the foundation of the model&#8217;s intelligence. This will become critical in <strong>Week 3 (RAG)</strong>, because if you use an embedding model that speaks a different &#8220;vector language&#8221; than your LLM, your search results will be garbage.</p></li></ul><div><hr></div><h3>Conclusion: The Architect&#8217;s Trade-Off</h3><p>As an architect, you don&#8217;t pick the &#8220;best&#8221; model. You choose the right one for the <strong>Constraint</strong>.</p><p>Here is how you decide:</p><ul><li><p><strong>The Context Constraint:</strong> Do you need to paste a 50-page PDF into the prompt?</p><ul><li><p><strong>Yes:</strong> You need <strong>Cloud</strong> (GPT-4o, Claude 3.7). Most local servers (Ollama) default to 8k or 32k context windows to prevent your RAM from exploding.</p></li><li><p><strong>No:</strong> If you are just summarizing emails, <strong>Local</strong> is fine.</p></li></ul></li><li><p><strong>The Latency Constraint:</strong></p><ul><li><p><strong>Cloud:</strong> Generally consistent (~1-2s).</p></li><li><p><strong>Local:</strong> Depends entirely on your hardware. On an M4 Mac, a small model (Llama 3.2 3B) is lightning fast (&lt;0.5s). A large model (GPT-OSS:20B) might take 30 seconds per reply. If your app requires sub-second responses, stick to small local models or optimized cloud endpoints.</p></li></ul></li><li><p><strong>The &#8220;Classic ML&#8221; Reality Check:</strong> Before you spin up a GPU cluster, ask yourself: <em>Do I actually need Generative AI?</em></p><ul><li><p>If you are classifying transactions as &#8220;Fraud&#8221; or &#8220;Not Fraud,&#8221; and you have 100,000 labeled examples, <strong>do not use an LLM.</strong> Use XGBoost or Logistic Regression.</p></li><li><p>Classic ML is <strong>reproducible</strong>, 1000x cheaper, and 1000x faster. Utilize LLMs for reasoning and handling ambiguity, rather than for simple pattern matching.</p></li></ul></li></ul><div><hr></div><h3>The Build: <code>llm_benchmark.py</code></h3><blockquote><p>&#8220;An ounce of action is worth a ton of theory.&#8221;</p></blockquote><p>For Week 1, we aren&#8217;t building a chatbot. We are building a <strong>Latency &amp; Cost Profiler</strong>. If you are going to put AI in production, you need to know exactly how much &#8220;thought&#8221; costs.</p><p>I wrote a script that races <strong>OpenAI (GPT-4o)</strong> against a local model (<strong>GPT-OSS:20B</strong>) running on my M4 MacBook Air with 24GB RAM. The results were surprising.</p><p><strong><a href="https://github.com/snudurupati/agentic-ai-architect/tree/main/01_stochastic_cpu">Link to Code: Week 1 &#8211; The Stochastic CPU</a></strong></p><p><strong>The Findings (M4, 24GB RAM):</strong></p><ul><li><p><strong>Cloud (GPT-4o-mini):</strong> <strong>1.6s</strong> latency. (Fast, but costs money).</p></li><li><p><strong>Local (GPT-OSS:20B):</strong> <strong>15.7s</strong> latency. (Free, but slow).</p></li></ul><p><strong>The Takeaway:</strong></p><p>My local machine struggled with the 20B model (15s is too slow for a chatbot). To make local viable on this hardware, I would need to scale down to a smaller model (like Llama 3.2 3B) or accept the cost of the Cloud.</p><div><hr></div><h3>The Architect&#8217;s Quiz (Homework)</h3><p>I&#8217;m digging deep into the internals of <em>why</em> these models work the way they do. If you really want to master this stack, try to answer these five questions before next week.</p><ul><li><p><em>Tip: Don&#8217;t just guess. Fire up your favorite model: ChatGPT, Gemini, or Claude and ask it to explain these concepts to you &#8220;like a Data Engineer.&#8221;</em></p></li></ul><ol><li><p><strong>The &#8220;Pre-Processing&#8221; Step:</strong> In classic ML, we manually create features (feature engineering). LLMs have a &#8220;Tokenizer&#8221; built-in. Why can&#8217;t we just feed them raw text or use our tokenizer?</p></li><li><p><strong>The Dictionary:</strong> Where does the model store its vocabulary?</p></li><li><p><strong>The Billing Question:</strong> Since &#8220;compute is compute,&#8221; why do OpenAI and Anthropic charge us by the <strong>Token</strong> and not simply by the <strong>Word</strong>?</p></li><li><p><strong>Vector Math:</strong> Does GPT use &#8220;One-Hot Encoding&#8221; to represent words, or something else?</p></li><li><p><strong>Positioning:</strong> When you send a sentence to an LLM, does it automatically know that &#8220;Select&#8221; came <em>before</em> &#8220;From&#8221;? Or do we have to explicitly tell it?</p></li></ol><div><hr></div><h3>What&#8217;s Coming Next?</h3><p>We have defined our compute. Next, we need to write the software.</p><p><strong>Week 2: Prompt Engineering as Code</strong></p><p>We are ditching the &#8220;prompt poetry.&#8221; No more &#8220;Please act as a helpful assistant.&#8221; Next week, we treat prompts as Software Contracts. We will force the LLM to output structured, valid JSON, handle errors, and build a deterministic classification system.</p><p><strong>Your Action Items:</strong></p><ol><li><p><strong>Fork the Repo:</strong> <a href="https://github.com/snudurupati/agentic-ai-architect.git">agentic-ai-architect</a></p></li><li><p><strong>Run the Benchmark:</strong> See how your machine handles local models.</p></li><li><p><strong>Do the Research:</strong> Ask your favorite AI to explain &#8220;Positional Embeddings&#8221; and see what you find.</p></li></ol><p>See you in the repo.</p><p><em>The Robot Brain Diaries</em></p>]]></content:encoded></item><item><title><![CDATA[The Agentic Data Engineer]]></title><description><![CDATA[Why You Already Have the Skills to Build with AI.]]></description><link>https://www.nudurupati.co/p/the-agentic-data-engineer</link><guid isPermaLink="false">https://www.nudurupati.co/p/the-agentic-data-engineer</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Tue, 16 Dec 2025 15:35:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c18d3c71-6e57-4aac-9767-618ab60a3bdd_300x158.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Why You Already Have the Skills to Build with AI</strong>.</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_!BlRA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BlRA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 424w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 848w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BlRA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5559101,&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://www.nudurupati.co/i/184624304?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.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_!BlRA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 424w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 848w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!BlRA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F440c5d66-ed30-4dc7-ac9b-796ea3ce8c9f_2848x1504.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"><svg role="img" 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"><g><title></title><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"><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"><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>&#8220;We spent the last decade building pipelines that move data. The next decade will be about building Agents that act on it.&#8221;</strong></p><p>If you work in data, the sudden rise of AI Agents might feel like an alien invasion. The jargon alone, RAG, MCP, Embeddings, Probabilistic Inference, sounds like a different language. It&#8217;s easy to feel like our hard-earned skills in SQL, ETL, and Python scripting are about to become legacy tech.</p><p>But after diving deep into building a few end-to-end AI Agents, I realized something surprising: <strong>This isn&#8217;t alien territory. It&#8217;s familiar ground.</strong></p><p>The gap between a <strong>Data Engineer</strong> and an <strong>AI Systems Engineer</strong> is smaller than you think. You don&#8217;t need to build the model; you just need to engineer the infrastructure that makes it useful. You don&#8217;t need to change who you are; you just need to elevate how you think.</p><p>The journey from writing scripts to architecting intelligence happens in three stages.</p><div><hr></div><h2><strong>Level 1: The Engineer (Mastering the Tools)</strong></h2><p><em>The Tactical Shift: From Scripting to Contracts</em>.</p><p>I used to treat Python primarily as a scripting tool, a flexible way to glue API responses into pandas DataFrames or Parquet files. In the world of AI, however, that flexibility is a bug.</p><p>When you connect a Large Language Model (LLM) to a business system, ambiguity is dangerous. If you send a loose JSON blob to an LLM, it might hallucinate. It guesses. This is where your existing data engineering rigor becomes a superpower. We aren&#8217;t just validating data anymore; we are defining the &#8220;contracts&#8221; that allow AI to safely interact with the world.</p><ul><li><p><strong>Pydantic:</strong> You use this today for data validation. In the Agentic world, it defines the <strong>reality</strong> for the AI. It tells the model exactly what structure the output must have, preventing hallucinations.</p></li><li><p><strong>FastAPI:</strong> You use this to serve data. For an agent, these endpoints become its &#8220;hands.&#8221; It ensures the AI cannot try to pull a parameter that doesn&#8217;t exist.</p></li></ul><p>We aren&#8217;t learning magic; we are just applying <strong>strict typing</strong> to <strong>synthetic intelligence</strong>. The code looks almost identical; the purpose just shifted from &#8220;storage&#8221; to &#8220;action.&#8221;</p><p>This shift turns us from &#8220;plumbers&#8221; who fix leaks into &#8220;architects&#8221; of logic. When you build an Agent, you are effectively cloning yourself. You write the logic for a task <em>once</em> (e.g., &#8220;Check Inventory&#8221;), and the AI executes it endlessly, handling the edge cases and natural language parsing. This is how you become a &#8220;Force Multiplier.&#8221; You aren&#8217;t typing faster; you are building systems that scale your own output.</p><div><hr></div><h2><strong>Level 2: The Manager (Optimizing Operations)</strong></h2><p><em>The Operational Shift: From Integration to Protocol</em></p><p>As you mature in your role, you stop looking at code as just syntax and start seeing it as <strong>operational capability</strong>.</p><p>One of the biggest headaches in Data Engineering is integration fatigue. But for a Manager, the headache is <strong>Operational Expense (OpEx)</strong>. We hire brilliant humans, but then we bog them down with Tier-1 support tickets, manual sanity checks, and writing custom connectors for yet another API.</p><p>The AI world offers a solution via the <strong>Model Context Protocol (MCP)</strong>. Think of MCP as &#8220;ODBC for AI.&#8221;</p><ul><li><p><strong>JDBC</strong> lets us connect any BI tool to any database without rewriting the driver.</p></li><li><p><strong>MCP</strong> lets us connect any AI model (Claude, GPT-4) to any tool (your database, your internal APIs) without rewriting the integration code.</p></li></ul><p>From an architecture perspective, this is pure efficiency. We separate the &#8220;Brain&#8221; (the AI) from the &#8220;Tools&#8221; (the execution). As data engineers, we are the ones who build the Tools. We define the <em><strong>get_customer_data</strong></em> function, and the AI just calls it.</p><p>But the real value here is <strong>Deflection</strong>. In my recent build, I created a &#8220;Bureaucratic Agent.&#8221; It wasn&#8217;t allowed to process a refund until it read the policy PDF and verified the claim.</p><ul><li><p><strong>The Old Way:</strong> A human support agent reads the ticket, searches the wiki, checks the date, and clicks &#8220;Refund.&#8221; Cost: High.</p></li><li><p><strong>The Agentic Way:</strong> The system does the &#8220;reading&#8221; and &#8220;checking&#8221; automatically. It only escalates the complex cases.</p></li></ul><p>You are no longer just &#8220;automating a task&#8221;; you are structurally reducing the operational cost of the business.</p><div><hr></div><h2><strong>The Context Layer: RAG is Just a Join</strong></h2><p><em>Bridging Operations and Strategy</em>.</p><p>Before we look at strategy, we need to demystify one last piece of jargon: <strong>RAG (Retrieval-Augmented Generation)</strong>. It sounds complex, but let&#8217;s look at it through a Data Engineering lens.</p><p>RAG is simply a <strong>Join</strong>.</p><ul><li><p><strong>Left Table:</strong> The User&#8217;s Query.</p></li><li><p><strong>Right Table:</strong> Your Knowledge Base (Vector DB).</p></li><li><p><strong>Join Condition:</strong> Semantic Similarity.</p></li></ul><p>When we build a RAG pipeline, we are engineering a &#8220;Just-In-Time&#8221; context join. We retrieve the relevant policy PDF, &#8220;join&#8221; it to the user&#8217;s prompt, and <em>then</em> let the model generate an answer. This transforms your static documents into active decision-making tools.</p><div><hr></div><h2><strong>Level 3: The Strategist (Building the Moat)</strong></h2><p><em>The Strategic Shift: From Passive Reports to Active Systems</em>.</p><p>When you zoom out to the executive level, this shift is about <strong>Reinvention</strong>. You stop asking &#8220;How do I move this data?&#8221; and start asking &#8220;How does this data create value?&#8221;</p><p>For years, our output has been <strong>passive</strong>. We built dashboards. We waited for a human to look at the dashboard, interpret the line chart, and make a decision. Now, we are building <strong>active</strong> systems.</p><ul><li><p><strong>Old Way:</strong> The pipeline moves data to a table so a human can decide to approve a refund.</p></li><li><p><strong>Agentic Way:</strong> The pipeline moves data to a context window so the system can propose the refund itself.</p></li></ul><p>For years, companies have hoarded data, hoping it would be valuable someday. That &#8220;someday&#8221; is today.</p><ul><li><p><strong>Building a Data Moat:</strong> Competitors can copy your features, but they cannot copy your <strong>context</strong>. By grounding AI agents in your proprietary data (your logs, your policies, your customer history), you create a service that no generic model (like ChatGPT) can replicate.</p></li><li><p><strong>New Revenue Streams:</strong> We aren&#8217;t just optimizing existing processes; we are creating new products. A &#8220;Consulting Agent&#8221; that sells your internal expertise to customers 24/7 is a new line of business.</p></li><li><p><strong>Valuation:</strong> Companies that successfully infuse AI into their core operations are valued fundamentally differently. They are seen as scalable technology platforms rather than operation-heavy service providers.</p></li></ul><p>We are moving from <strong>Deterministic Systems</strong> (rigid rules) to <strong>Probabilistic Systems</strong> (reasoning engines). The data engineer&#8217;s role is to build the deterministic guardrails, the schemas and access controls that allow the business to safely ride this wave.</p><div><hr></div><h2><strong>The Missing Criticals: Security &amp; Observability</strong></h2><p>A word of caution as you embark on this journey: What I&#8217;ve described is a prototype. Bringing this to production requires two things that data engineers are uniquely positioned to solve:</p><ol><li><p><strong>Security:</strong> An agent needs <strong>Authentication</strong> (Who are you?) and <strong>Authorization</strong> (Are you allowed to see this table?). We cannot give an AI &#8220;admin&#8221; access. It needs scoped, least-privilege tokens.</p></li><li><p><strong>Observability:</strong> When an ETL job fails, we check logs. When an Agent fails, we need to trace its <em>thoughts</em>. We need to know <em>why</em> it decided to skip the refund.</p></li></ol><p>I will be exploring these critical pillars in future posts.</p><div><hr></div><p><strong>Conclusion</strong></p><p>If you can build a data pipeline, you can build an AI Agent. The components, Python, APIs, Structured Data, SQL/Vector queries, are already in your toolkit.</p><p>The models themselves, GPT-4, Claude, Llama, are becoming commodities. They are powerful, but they are generic. The true competitive advantage for any company isn&#8217;t the AI model; it is the <strong>context</strong> that the model can access.</p><p>As a data engineer, you control that context. You manage the pipelines, the schemas, and the quality. You hold the keys to the only thing that creates a moat. You don&#8217;t need to reinvent yourself; you just need to realize that you are now the most dangerous person in the room.</p><div><hr></div><p><strong>Code &amp; Next Steps</strong> I am building this out in public to demystify the process. You can find the full working code for the Agent, the MCP Server, and the RAG implementation in my GitHub repository here: <a href="https://github.com/snudurupati/agent-fde-demo">snudurupati/agent-fde-demo</a></p><p>Keep watching this space. Next, I&#8217;ll try to tackle the &#8220;dark matter&#8221; of AI engineering: securing the agent with OAuth2/JWTs and tracing its thoughts with OpenTelemetry.</p>]]></content:encoded></item><item><title><![CDATA[𝗬𝗼𝘂𝗿 𝗔𝘁𝘁𝗲𝗻𝘁𝗶𝗼𝗻 𝗜𝘀 𝗬𝗼𝘂𝗿 𝗢𝗦]]></title><description><![CDATA[Design your permissions, don&#8217;t live on defaults.]]></description><link>https://www.nudurupati.co/p/25-11-16</link><guid isPermaLink="false">https://www.nudurupati.co/p/25-11-16</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Sun, 16 Nov 2025 15:47:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/11ded174-418e-4435-9a9d-c5f757bdc9d8_300x200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Design your permissions, don&#8217;t live on defaults.</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_!7PTY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7PTY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7PTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.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;:1893937,&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://www.nudurupati.co/i/184624305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.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_!7PTY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7PTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3454fa8-2b0b-4c23-a09a-4e1c3c9400e3_1536x1024.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"><svg role="img" 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"><g><title></title><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"><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"><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><h2><strong>Thesis</strong></h2><p>&#8220;The ability to choose how I spend my time and mental bandwidth is my operating system&#8221;<br>When I run processes outside that design, like taking on consistent late evening work obligations, fragmented evenings, constant context switches, everything else malfunctions.</p><h2><strong>Personal Defaults</strong></h2><p>I&#8217;m a morning person. Always have been. My best rest and recovery are 10 pm-4 am, and my sharpest work is before dawn. When I ignore that and let after-hours obligations preempt sleep and spill into family time, the costs show up fast: forgetful in meetings, short with my 4-year-old&#8217;s bedtime routine, reading less, caring less. That&#8217;s on me for leaving my scheduler open.</p><p>&#8220;The ability to choose how I spend my time and my mental bandwidth is not a luxury for me, it&#8217;s my operating system. When stripped away, everything else malfunctions.&#8221;</p><h2><strong>What an OS Does</strong></h2><p>Autonomy over my attention and energy is my fundamental architecture, not a feature, the underlying platform on which everything else runs on. This metaphor highlights sovereignty. An operating system controls resource allocation, determines what processes get priority, manages what runs in the background. If that&#8217;s truly not mine to control, then I am not really running my own OS but running someone else&#8217;s software on my hardware.</p><p>This perspective also clarifies the current environment that we live in. We are surrounded by entities, platforms, employers, cultural expectations that want to install themselves as our OS or at least run a persistent background process. Treating our attentional autonomy as foundational rather than negotiable is a necessary defense against this age of massive distractions.</p><h2><strong>Interdependence, By Consent</strong></h2><p>The tension I see is that we are interdependent beings. Some of the most meaningful things in life: relationships, kids, commitments, care; involve voluntarily granting access to our attention and letting them make legitimate claims on our time and mental bandwidth. That&#8217;s not a drain; it&#8217;s wholesome and dopamine-replenishing. The question is, are you choosing which permissions to grant or has your system been rooted without your consent?</p><p>Here&#8217;s the uncomfortable bit: if something can schedule over my sleep, preempt my focus, and seize my attention on demand, that&#8217;s not &#8220;hustle&#8221;, that&#8217;s root-level access I failed to manage. It snuck in as &#8220;one quick late call,&#8221; then installed updates, then rewrote my defaults. If my mind&#8217;s scheduler isn&#8217;t mine, I&#8217;m not free; I&#8217;m just highly managed by defaults I didn&#8217;t design.</p><p>Interdependence doesn&#8217;t contradict sovereignty. My kid&#8217;s bedtime gets whitelisted access. Reading &#8220;just one more book&#8221; at 9 pm isn&#8217;t a drain; it&#8217;s a trusted process that returns energy. Same with relationships, real care, real commitments, they get explicit permissions, not a blank SSH key to my brain. The difference is consent, clarity, and kill-switches.</p><h2><strong>Why This Matters Beyond Calendar Ethics</strong></h2><p>Multitasking is the human version of &#8220;just add more context.&#8221; It feels powerful but it&#8217;s not. My head isn&#8217;t a data lake; it&#8217;s closer to an L2 cache. Push too much through it and you pay in cache misses, and heat. Every late meeting was an interrupt that blew away useful state. I&#8217;d show up foggier the next morning, then compensate by stacking more tasks, then miss details, then open more tabs. That loop looks productive from the outside but is a leak from the inside.</p><p>If an LLM analogy helps: models &#8220;hallucinate&#8221; because they must keep predicting even when the prompt is noisy or the facts aren&#8217;t there. Humans &#8220;hallucinate&#8221; under multitasking because we keep acting while our working memory is shredded and half of our attention is stuck on the last thing. Different mechanisms, same shape of failure: too many tokens, too little signal.</p><h2>Running My Own OS</h2><p>I&#8217;m not optimizing for output anymore; I&#8217;m optimizing for <strong>throughput with integrity</strong>. That means less context stuffed into my day, fewer parallel threads, and more deliberate retrieval of what I need right now. I&#8217;m keeping the early mornings and the bedtime stories. And I&#8217;m uninstalling anything that thinks it owns my scheduler. Control over my attention isn&#8217;t a perk, it is the platform. This isn&#8217;t a perfect playbook; it&#8217;s me debugging my life in production. <strong>What&#8217;s your operating system and are you the one running it?</strong></p>]]></content:encoded></item><item><title><![CDATA[𝗛𝘂𝗺𝗮𝗻 𝘃s AI 𝗧𝗵𝗶𝗻𝗸𝗶𝗻𝗴: 𝗣𝗿𝗼𝗯𝗮𝗯𝗶𝗹𝗶𝘀𝘁𝗶𝗰 𝗼𝗿 𝗗𝗲𝘁𝗲𝗿𝗺𝗶𝗻𝗶𝘀𝘁𝗶𝗰?]]></title><description><![CDATA[The Debate I Keep Seeing.]]></description><link>https://www.nudurupati.co/p/ai</link><guid isPermaLink="false">https://www.nudurupati.co/p/ai</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 27 Oct 2025 12:31:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d6a424db-24e0-49d6-8a0d-a520365a73cc_300x200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><h2><strong>The Debate I Keep Seeing</strong>.</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Flka!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Flka!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Flka!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Flka!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Flka!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Flka!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.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;:2203775,&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://www.nudurupati.co/i/184624306?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.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_!Flka!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Flka!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Flka!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Flka!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed980e8b-98c0-4c89-8d80-74271acf74ef_1536x1024.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"><svg role="img" 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"><g><title></title><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"><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"><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>These days, all I see in my LinkedIn feed are intense arguments surrounding AI and LLMs. It&#8217;s either over-the-top salesy optimism like &#8220;AI agents are no longer experiments; your next 5 hires could cost $0,&#8221; or a lot of naysaying like &#8220;LLMs are at or near their peak&#8230; the &#8216;game-changer&#8217; crowd is in for disappointment,&#8221; to downright fearmongering: &#8220;Your AI will confidently lie with your logo on it,&#8221; or &#8220;AI will wipe out millions of jobs in the next 24 months.&#8221; There is also a middle-ground crowd, though few and far between, who say, &#8220;LLMs cannot be AGI by definition. An LLM is a static model; once trained, it does not change, unlike our brains.&#8221;</p><p>I have been contemplating a similar question since I was first introduced to Large Language Models. I am not a data scientist, but during my initial foray into data science, one cardinal rule I learned is: &#8220;Don&#8217;t use machine learning for problems that have a deterministic way of solving them.&#8221;</p><div><hr></div><h2><strong>Should We Use LLMs for Deterministic Tasks?</strong></h2><p>Large Language Models are fundamentally probabilistic in their core function, so the question is: should we even be using LLMs for more deterministic tasks like spelling &#8220;strawberry&#8221; or adding &#8220;2 + 2,&#8221; or for more serious functions like reliably and consistently answering questions such as &#8220;What were my sales last quarter?&#8221;. Maybe not, given the cardinal rule of not using a probabilistic system to solve a deterministic problem. Problem solved, right? So stop wasting your money on all these AI agents and stick to the tried-and-true systems.</p><p><strong>Humans Are Probabilistic Too</strong>.</p><p>Not so fast. We humans, so adept at spelling and solving basic arithmetic as well as complex and abstract problems, have probabilistic hardware too. Neural activity has inherent noise and randomness, and neurotransmitter release is probabilistic by nature. At the computational level, human thinking shows clear probabilistic patterns. We make decisions under uncertainty and update our beliefs based on evidence (at least the more rational among us do), very Bayesian-style. In fact, we would be paralyzed if our thinking and reasoning systems were fully deterministic when faced with uncertainty. So, if human thinking and reasoning are indeed probabilistic, then how come we are so good at deterministic tasks? It turns out our &#8220;probabilistic determinism&#8221; is a result of our brain&#8217;s <strong>hierarchical, modular architecture with redundancy</strong> and <strong>grounded, multi-modal training</strong>.</p><div><hr></div><h2><strong>Where Human &#8220;Probabilistic Determinism&#8221; Stems From?</strong></h2><p><strong>Hierarchical, Modular Architecture with Redundancy</strong></p><p>When we try to spell &#8220;strawberry,&#8221; we don&#8217;t rely on generic probabilistic pattern matching; we have dedicated neural circuits for phonology, orthography, motor control, etc. These specialized subsystems have been reinforced millions of times with human feedback and are redundant, where the same information is represented in overlapping ways across many neurons. These specialized neural circuits are so well trained that they are practically deterministic under normal conditions. In summary, human brains compile overlearned skills into near-deterministic routines. However, LLMs lack this modularity: they&#8217;re a large probabilistic blobs, primarily predicting the next token. I believe agentic AI with access to external tools is already addressing this shortcoming of LLMs.</p><p><strong>Grounded, Multi-Modal Learning in Humans</strong></p><p>When we learned to add &#8220;2 + 2,&#8221; we didn&#8217;t learn this by just reading a book, but also by manipulating physical objects, seeing quantities, and hearing this across multiple contexts. Thus, our learning is multi-modal, grounded in physical reality, and is encoded redundantly across many of our neural subsystems. Whereas LLMs learn from text alone, so for an LLM &#8220;2 + 2&#8221; is just a token pattern without any grounded understanding of quantity. While vision-language models can process text and images together, the learning is often centered around correlations between image features and text descriptions rather than truly <em>grounding</em> concepts in sensory experience.</p><h2><strong>How to introduce Grounded, Multi-modal Learning in AI?</strong></h2><p><strong>Embodied Learning and Robotics</strong></p><p>Embodied AI and robotics are much closer to how humans learn. The idea is to give AI systems physical bodies to manipulate objects, sensors to experience cause and effect, and training through interaction rather than just observation. To draw an analogy: you can read every book about golf, understand the physics of ball flight, memorize the biomechanics of the perfect swing, and know all the theory about weight transfer and club path, but the first time you swing a club, you might miss the ball altogether (at least the less athletic among us).</p><p><strong>Does Embodied Learning Really Matter? (Stephen Hawking as a Counterpoint)</strong></p><p>Here you might ask: how important is the body for human learning? Look at the case of Dr. Stephen Hawking, he did his best work after his body was severely disabled, and all he was left with was a brilliant and active mind. The counterpoint: Dr. Hawking had a normal childhood with about 20 years of sensorimotor experiences. He learned to walk, manipulate physical objects, and experienced physics directly as a child.</p><p><strong>Simulated Embodiment at Scale</strong></p><p>LLMs have little to no grounding, primarily learning from text and pattern matching without an underlying world model. AI models may need grounded, multimodal learning to establish basic concepts and build from there. Projects like Tesla&#8217;s Optimus and various robotics labs are working on this. However, learning via robotics is slow and expensive. This is where simulated embodiment comes into play. Physics simulators like <strong>NVIDIA Isaac Sim</strong> let AI practice orders of magnitude faster than through physical robotic embodiment.</p><div><hr></div><h2><strong>A Story Analogy (and a Spoiler)</strong></h2><p>To end on a lighter note, spoiler alert. <strong>Do not read further</strong> if you (for whatever reason) are yet to watch the movie <em>Good Will Hunting</em>.</p><p>I was rewatching the movie. Every decade or so it presents me with a brand-new interpretation, and it suddenly occurred to me. Will possesses extraordinary intellect; he&#8217;s read nearly every book there is to read, absorbed every fact, every theory, and yet he can&#8217;t use his genius to build a meaningful life.</p><p>In many ways, an LLM is like Will Hunting: it has ingested statistical patterns in human language but remains ungrounded, fluent without understanding, articulate without perception, intelligent without empathy. &#8220;There&#8217;s a difference between knowing the path and walking the path.&#8221;</p><p>Secondly, the dynamic between Will and Sean (Robin Williams) represents the kind of mentorship AI needs, human guidance that is emotional, not just technical. As I embark on this journey of embodied-AI learning, I intend to be a Sean for AI&#8217;s Will Hunting, and I&#8217;ll keep posting my learnings, philosophical musings, and realizations about this topic in this space.</p>]]></content:encoded></item><item><title><![CDATA[AI Workloads as First-Class Apps]]></title><description><![CDATA[A Data Engineer&#8217;s perspective on how to make sense of all the AI Noise.]]></description><link>https://www.nudurupati.co/p/ai-workloads-as-first-class-apps</link><guid isPermaLink="false">https://www.nudurupati.co/p/ai-workloads-as-first-class-apps</guid><dc:creator><![CDATA[Sreeram Nudurupati]]></dc:creator><pubDate>Mon, 20 Oct 2025 12:38:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fa48842d-01b3-495e-af4e-4f47ff7ecd04_300x200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A Data Engineer&#8217;s perspective on how to make sense of all the AI Noise.</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_!tOiq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tOiq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tOiq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10019349,&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://www.nudurupati.co/i/184624307?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.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_!tOiq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 424w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 848w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!tOiq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f22a92-97ad-49ac-b4be-d8f025e635c9_2816x1504.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"><svg role="img" 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"><g><title></title><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"><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"><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>Last week, I attended the dbt Coalesce summit, where I served as booth duty and spoke with attendees, explaining how AI agents can help data engineers increase productivity, reduce their cloud data warehouse spend, and enhance data quality throughout the data stack. There was a recurring theme, a recurring question: my CDW, my DE tool, and my orchestrator all individually have built-in copilots, so what&#8217;s the need for yet another AI layer? While I am still pondering an answer to that question, another different but relevant question popped into my mind: What&#8217;s up with all these acquisitions by all these data and analytics companies lately?</p><div><hr></div><h2>Lots of Noise, One real Signal.</h2><p>In the past few months, I have been closely following all of Databricks&#8217; acquisitions and partnerships alone. First, they agreed to acquire Neon, the company behind serverless PostgreSQL, and the reason given was to enhance AI agent-building capabilities. Like most data engineers who haven&#8217;t fully bought into the Agentic AI hype yet, I wrote it off as Databricks just trying to eliminate the data ingestion middleware like Fivetran and Matillion and get the freshest data straight from the source; this idea was reinforced by their partnership with SAP that came later. However, the acquisition of Mooncake Labs and now their partnership with Cognite and OpenAI, they all seem to be really playing into their Lakebase + Agent Bricks strategy.<br>So when I try to isolate a signal from all the AI noise, it is clear that Databricks expects AI beyond just copilots and analytics; they are heavily betting on AI Apps as first-class citizens of the data analytics ecosystem.</p><p>Now let&#8217;s try to unpack what first-class AI Apps look and feel like from a Data Engineer&#8217;s perspective.</p><div><hr></div><h2>AI Apps: The Art of the Possible</h2><p>AI Apps as first-class analytics citizens means treating AI apps as core data products and not as side priorities. In my limited data engineering world-view and based on what I have researched so far, first-class AI apps could mean multimodal applications that can simultaneously process multiple types of data like voice, text, medical diagnostics, images, and radar data. Some applications of multimodal AI apps could be in the healthcare field where AI analyzes information from diverse sources like clinical notes, medical images, and other documents and generates a personalized patient treatment plan.</p><p>AI Apps could be also be AI agents that can autonomously build and maintain workflows. As data engineers, the latter is of more curiosity to us, and some possibilities of such first-class AI Apps could be:</p><ul><li><p><strong>Explainable KPI Copilot</strong> &#8211; A natural language interface that answers questions like &#8220;why did profit dip last quarter despite an increase in total revenue&#8221; and proves the answer with lineage, SQL, and provides row-level drilldowns. It always backs up every generated metric with traceable data.</p></li><li><p><strong>Closed-loop metrics improvement</strong> &#8211; A natural language analyst that proposes experiments for a specific metric, ships a feature flag, observes that metric, and proposes the next iteration with guardrails.</p></li><li><p><strong>Enterprise RAG with existing Data Warehouse</strong> &#8211; A governed retrieval and generation service that answers business questions using your data warehouse as the system of record, with citations, lineage, and write-backs, and SLOs like any other app. This solves the problem of business stakeholders wanting to ask natural language questions that they can trust and verify.</p></li></ul><p>While AI apps as first-class citizens are absolutely possible, there are risks that can bring enterprise adoption to a standstill.</p><div><hr></div><h2>Why AI Adoption Stalls</h2><p>The fastest way to stall AI adoption is to ship a shiny agent with no audit trail. When messy stuff starts showing up, when the AI agent reads some PII data that it isn&#8217;t supposed to, a KPI number can&#8217;t be reproduced or traced back to the source, or a friendly agent updates a record or opens a ticket without the right permissions. When decision-making is a black box, with no transparency into what query ran, what docs were read, or who approved the scope. Thats when trust in the agent fades, audit teams step in, leadership loses confidence in AI, and we&#8217;re back to manual reviews.</p><div><hr></div><h2>What good looks like</h2><p>Good means every agentic answer and action is traceable. Every KPI links straight to the underlying table, the owner, and the version. Agentic AI apps only run with purpose, bound credentials, narrow tool scopes, and use short-lived sessions. Reproducing a result needs to be made boring, replaying the same prompts, tool calls, and SQL with the same inputs. Safety checks aren&#8217;t bolted on; they run before execution, and anything risky gets routed to a human.</p><p>For executives, there&#8217;s a single page that shows where agents are deployed, what data they can touch, what broke last week, and what business results they delivered.<br>We need to build apps that both think and write, on governed data, with real SLOs. The teams that make low-latency state, evaluation, and guardrails boringly reliable will cut through the hype, and then AI starts paying dividends.</p>]]></content:encoded></item></channel></rss>