<?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[Thinking Through AI]]></title><description><![CDATA[Thinking Through AI]]></description><link>https://www.madhunagaraj.com</link><image><url>https://www.madhunagaraj.com/img/substack.png</url><title>Thinking Through AI</title><link>https://www.madhunagaraj.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 15 Jul 2026 21:03:41 GMT</lastBuildDate><atom:link href="https://www.madhunagaraj.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Madhu Nagaraj]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[madhunagaraj@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[madhunagaraj@substack.com]]></itunes:email><itunes:name><![CDATA[Thinking Through AI]]></itunes:name></itunes:owner><itunes:author><![CDATA[Thinking Through AI]]></itunes:author><googleplay:owner><![CDATA[madhunagaraj@substack.com]]></googleplay:owner><googleplay:email><![CDATA[madhunagaraj@substack.com]]></googleplay:email><googleplay:author><![CDATA[Thinking Through AI]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Every Department's Agent Map Looks the Same]]></title><description><![CDATA[I mapped agents onto twelve company functions. The maps converged on one design, and the real work turned out to be the refusal list.]]></description><link>https://www.madhunagaraj.com/p/every-departments-agent-map-looks</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/every-departments-agent-map-looks</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 12 Jul 2026 17:01:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sk_-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.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_!sk_-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sk_-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 424w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 848w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 1272w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sk_-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png" width="1024" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0a6832d-fdac-473c-81ca-de708c013124_1024x572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:373504,&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.madhunagaraj.com/i/206657025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.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_!sk_-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 424w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 848w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.png 1272w, https://substackcdn.com/image/fetch/$s_!sk_-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0a6832d-fdac-473c-81ca-de708c013124_1024x572.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><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><p>Somewhere around the fifth agent map, I stopped designing and started transcribing.</p><p>I&#8217;d spent the weeks before on a design exercise: mapping agents onto every function of a company. By agent I mean a language model wired into tools and given a job: it reads your systems and takes the next step without a person driving every click.</p><p>Engineering, sales, customer success, people, finance, legal, marketing, product, design, data, support, and the exec team. Twelve maps, one per function, each answering the same question: which work goes to agents, and which work does the department refuse to give up? It&#8217;s a software company&#8217;s org chart; the maps say nothing about work done with hands.</p><p>A design exercise is a wind tunnel. You can rewire all twelve functions at once and delete any meeting you like. And paper is more honest than a slide deck: there&#8217;s no incentive to round the numbers up.</p><p>Each map is a document: one process written out twice, before and after, plus a one-page spec and a starter prompt for each agent. The exercise produced 93 prompts and 92 specs. None of them is the artifact that matters.</p><p>Each map ends with a named pattern: one line on how the work splits between agents and people. Engineering&#8217;s came out as <em>delegate, review, own</em>. Two functions later I wrote it again for customer success, with an always-on monitor bolted on the front. By the fifth map, finance, I caught myself typing the same three beats a third time with the department&#8217;s nouns swapped in: delegate the reconciliation, review the variances, own the decisions.</p><blockquote><p>Map twelve departments to agents, one after another, and you draw the same map twelve times.</p></blockquote><p>One hand drew all twelve. Hear that objection now; it&#8217;s the real one. A pattern that captures the mapper at map five isn&#8217;t tested by maps six through twelve; it&#8217;s transcribed. The convergence is a hypothesis one mapper can generate but cannot confirm. What follows is the hypothesis, drawn as sharply as I can.</p><div><hr></div><h2>The unit is the process, not the department</h2><p>You can&#8217;t give a department an agent. &#8220;Department&#8221; is an org-chart word; work doesn&#8217;t happen at that altitude. It happens as processes: a feature ships, a call gets prepped, a month closes, a contract gets redlined, a ticket gets answered.</p><p>So for each function I picked the one process where the week actually goes, and wrote its timeline twice. Once as it runs today, with an honest clock against each step. Once with agents in the loop.</p><p>The before-timeline is the whole method. Writing it honestly is uncomfortable, because most steps turn out to be one of three things: watching (checking a dashboard, waiting for a signal, sitting in a status meeting), typing (reconciling two systems, re-keying a CRM, rebuilding a deck from a template), or judging (deciding, pricing, subtracting, saying no). Only the third kind reliably needed the person.</p><p>Walk the departments and the shape repeats. In engineering, the process is shipping one feature: the agent-able work is the scaffolding, the tests, the draft pull requests (code changes queued for review), and the three parallel prototypes you&#8217;d never staff with humans; the human work is the architecture call and the review.</p><p>In sales, it&#8217;s call prep and follow-up: an agent fans out across the calendar, the CRM, and every past note, and compresses the tab-hopping into a one-page brief. The rep&#8217;s edit of that brief is the value. Customer success runs the same shape overnight: watch account health, draft the save plan, let the human decide whether this customer gets an email or a call.</p><p>In finance, the month-end close sorts into the three piles, not purely: reconciliation is typing with grains of judgment in it (someone decides which record wins), and the agent&#8217;s job is to hand the controller the short list that needs a person. In legal, a redline agent drafts counter-language for the pattern-match clauses (payment terms, auto-renew, data residency) so the human hour goes to the one clause that matters.</p><p>Support, on my map, drafts every reply and sends none of them. Plenty of real orgs auto-send the easy tier; I drew the stricter line, because a boundary written down can be loosened on purpose. Data correlates an anomaly and proposes a root cause; a human verifies it with a direct query, because the query doesn&#8217;t hallucinate and the agent might.</p><p>Even the exec team reduces to a process: the Monday status ritual. An agent assembles the digest from the systems of record (the CRM, the ledger, the ticket queue) before anyone wakes up, which changes what the meeting is for.</p><blockquote><p>Meetings that existed to move information die. Meetings that exist to make a decision survive.</p></blockquote><p>That single distinction cleared more calendar, on paper, than any individual agent did.</p><div><hr></div><h2>Three shapes of agent, three things humans keep</h2><p>Here&#8217;s the convergence. Across twelve functions I thought I was designing dozens of agents. I was designing three, over and over.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ntO_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ntO_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 424w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 848w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 1272w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ntO_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png" width="1024" height="434" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:434,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:349086,&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.madhunagaraj.com/i/206657025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.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_!ntO_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 424w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 848w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.png 1272w, https://substackcdn.com/image/fetch/$s_!ntO_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F747b4665-de91-44cd-b6c0-73a1ac68d28b_1024x434.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>The watcher. An always-on process that monitors a system of record and raises its hand: account health dropping, a metric drifting, a contract landing in the inbox. Watchers replace the human habit of polling, and the weekly meeting whose real job was polling on a schedule.</p><p>The drafter. Given a signal, it produces the first version of the artifact the process needs: the reply, the redline, the brief, the board pack, the save plan. Drafters don&#8217;t shorten the judgment. They move the human from a blank page to a review.</p><p>The reconciler. The pure-typing tier: moving the same fact between two systems, categorizing, scheduling, logging. (Routing stayed out; triage looks like typing and is mostly judgment.) I wanted to write that reconcilers tolerate the most autonomy, because the work was never judgment to begin with. That&#8217;s wrong, and my own evidence says so.</p><p>Autonomy tolerance tracks reversibility and blast radius, not how boring the work is. Watchers tolerate the most autonomy because they only read. A reconciler earns autonomy only where its writes are cheap to verify and cheap to reverse. The dangerous middle is a reconciler writing silently to a system of record.</p><p>None of the three shapes is new. The industry already sells them as monitoring, copilots, and RPA (the software that has clicked through forms for a decade); three categories converged on these shapes before I drew anything. What the maps add is where each shape stops.</p><p>In every function, the humans kept the same three things. The send: nothing leaves the building (an email, a reply, a wire, a filing) without a person behind it. The signature: money, offers, terminations, attestations. The subtraction: deciding what not to build, which deal not to chase, which clause not to concede. Agents are additive by temperament; every one I&#8217;ve run suggests more, never less. Choosing less stayed human on every map I drew.</p><blockquote><p>The agent drafts. The human sends.</p></blockquote><p>If the twelve maps compress to one sentence, it&#8217;s that one.</p><p>It has a cost. There&#8217;s a fourth keep buried in the first three: the check. Drafters relocate judgment into review; doing-time becomes reviewing-time, and at volume that&#8217;s what bites first. A person can read a hundred drafts a day or rubber-stamp a thousand, not both. The maps hold only if review hours are budgeted as real work. A send without a check is a stamp with a person&#8217;s name on it.</p><div><hr></div><h2>The refusal list was the hardest artifact</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0kdD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0kdD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 424w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 848w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 1272w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0kdD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png" width="1024" height="506" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:295726,&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.madhunagaraj.com/i/206657025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.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_!0kdD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 424w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 848w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.png 1272w, https://substackcdn.com/image/fetch/$s_!0kdD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde97886b-d917-47b0-94b0-3b028d9db3bf_1024x506.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>Every map ends with a section I first treated as a disclaimer and finished treating as the design itself: the list of things agents never do there. No agent moves money. No agent sends to a customer. No agent drafts any part of a termination. Brand voice is written by a person. Deals above a threshold get human eyes on every clause.</p><p>The automation was easy to write. The refusal list took the design.</p><p>Easy, because the drafting-and-watching layer is almost generic on paper: the same patterns, the same reusable instructions, lightly re-skinned per function. On paper is the load-bearing phrase: the connector plumbing (auth, permissions, data quality) is where deployment goes to die.</p><p>Hard, because every refusal is a claim about where judgment actually lives in that department, and you can&#8217;t write it without understanding the work. When a function&#8217;s refusal list wouldn&#8217;t come, the reason was the same each time: I didn&#8217;t understand the function yet. The automation I&#8217;d sketched for it was the least trustworthy thing on the page.</p><p>You wouldn&#8217;t get the list by asking, either. Ask a department head what they&#8217;d refuse to automate and I suspect you&#8217;d get a blank, because intuition doesn&#8217;t know its own address. Ask what they&#8217;d never let a brand-new hire send without review, and the list writes itself. Every department already has a refusal list. It&#8217;s filed under supervision.</p><p>The regulated corners wrote theirs down long ago: approval matrices, maker-checker rules, segregation of duties. Those were written for humans; extending them to agents is unclaimed work.</p><p>The failure mode is shipping the automation without the refusal list. That&#8217;s the org that lets a support agent auto-send at 2 a.m., discovers the hard line only after crossing it, and then swings to banning agents entirely. The refusal list is what lets you delegate aggressively everywhere else. It&#8217;s the trade in everything I&#8217;ve built with agents: autonomy is purchased with boundaries, not with trust.</p><blockquote><p>A department&#8217;s agent map is two lists: what the agents take, and what the humans refuse to give.</p></blockquote><div><hr></div><h2>What&#8217;s real here, and what isn&#8217;t</h2><p>These are maps, and I want to be precise about what that buys. The timelines are designs, not measurements: every map carries a before-clock and an after-clock, the after column is always flattering, and none of those paper numbers appear here. I have not watched a real company close its books faster because a map said it could.</p><blockquote><p>Designed is not deployed. A pattern that recurs on paper is a hypothesis, not a result.</p></blockquote><p>What I&#8217;ll stand behind is the method: pick one process, write the before-timeline honestly, sort the steps into watching, typing, and judging, put agents under the first two, then hunt the judgment hiding inside them.</p><p>The longest-running agent I operate is the watcher on my own money. It reads a read-only mirror of my accounts and sends a two-line morning brief, plus a flag if something looks off. Its refusal list is physical: the app holds transactions and nothing else, so the worst it can do is read back what I already spent. It ran like clockwork for months, then I stopped tending it and the briefs thinned out. Click-through plumbing is brittle; it rots quietly when nobody looks.</p><p>That&#8217;s the part no map can tell you: designed patterns don&#8217;t decay, deployed ones do. The maps get you to the right design. Somebody still has to keep it running. And it grounds only one shape. The watcher I&#8217;ve run; the drafter and the reconciler I&#8217;ve only drawn.</p><p>On paper, the convergence held all twelve times: the three agent shapes, the three human keeps, the refusal list as the real design surface.</p><p>Running the exercise on a department you own needs no vendor and no model picked first. It&#8217;s a document and four questions:</p><ol><li><p>Which single process eats the week?</p></li><li><p>Of its steps, which are watching, which are typing, which are judging?</p></li><li><p>What should an agent draft, and who sends it?</p></li><li><p>What will you refuse to automate, in writing, before you automate anything?</p></li></ol><p>Building the agents the answers describe is a separate problem. Drawing the map isn&#8217;t.</p><p>The maps will never ship a feature or close a quarter. That was never the point. I drew them to find out whether twelve different departments would produce twelve different answers. On paper, from one hand, is as far as the finding goes. Whether it survives other hands and real orgs is the experiment I haven&#8217;t run.</p><p>They produced one.</p><div><hr></div><p><em>Related: what happened when this lens met a real engineering org is in <a href="https://www.madhunagaraj.com/p/i-wrote-a-plan-the-work-steered-it">I Wrote a Plan. The Work Steered It.</a></em></p><blockquote><p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p></blockquote>]]></content:encoded></item><item><title><![CDATA[What I Set Up to Run Parts of My Life With Agents]]></title><description><![CDATA[I wired agents to my money, time, health, and learning. The surprise wasn't saved time. It was a lighter head.]]></description><link>https://www.madhunagaraj.com/p/what-i-set-up-to-run-parts-of-my</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/what-i-set-up-to-run-parts-of-my</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 05 Jul 2026 17:02:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Jwnx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.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_!Jwnx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jwnx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jwnx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:603451,&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.madhunagaraj.com/i/205262816?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.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_!Jwnx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Jwnx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785a9e80-2704-428d-bcc3-79e094062fb3_1376x768.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><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.<br><br></em>I stopped opening my money app about a quarter ago.</p><p>Not on purpose, at first. I just noticed one day that I hadn&#8217;t checked it in weeks, and nothing had gone wrong. Something else was watching it now, and it told me only when I actually needed to know.</p><p>Since the beginning of the year I set up a handful of AI agents to carry parts of my life. <strong>What surprised me wasn&#8217;t the time it saved. It was how much lighter my head got.</strong></p><p>I didn&#8217;t build some grand system. I set up an assistant I can text, connected it to a few of my tools, gave it enough of my context to be useful, and described what I wanted in plain sentences. Some of it works really well. Some of it is new and a little rough. I&#8217;ll tell you both.</p><h2>The setup, in a few sentences</h2><p>I have an assistant that&#8217;s always on. I can text it like a person. It&#8217;s connected to some of the tools I already use, and it holds a memory of my context, the stuff I&#8217;d otherwise have to re-explain every time. On top of that, I can schedule little routines in plain English, almost never touching code.</p><p>It doesn&#8217;t all run in one place:</p><ul><li><p>Some routines run as scheduled tasks inside Claude&#8217;s Cowork, which can open my apps and work with my files directly.</p></li><li><p>Others run on the always-on agent itself. In the first post that was Jarvis, running on NanoClaw. I&#8217;ve since replaced it with Hermes, an open-source agent doing the same job, still on the same Mac Mini in the corner.</p></li></ul><p>Keeping it on that Mac Mini, in a container, off my everyday laptop, is deliberate. So is what I plug into it: a secondary email and its to-dos, a shared calendar, a private repo, my notes. Not my primary accounts, and not everything I do. It reaches a small, deliberately chosen slice of my world.</p><p><strong>The real friction is right there. Getting something on that machine to reliably talk to my calendar and mail up in the cloud is most of the actual work.</strong></p><h2>Finance</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dxiY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dxiY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dxiY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png" width="1160" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65404,&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.madhunagaraj.com/i/205262816?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.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_!dxiY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!dxiY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff64216fd-8764-4b20-bf3f-6029b3fa8fc3_1160x560.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>This is the one that weighed on me most, so I set it up first: a folder with my financial data, a short note explaining my budget the way I&#8217;d explain it to a friend, and a set of little routines that quietly grew to almost ten before I looked up.</p><p>Here&#8217;s the part I glossed over the first time, because it isn&#8217;t magic. The morning summary comes from a routine that opens my finance app and clicks through it the way I would: sync the accounts, tidy the categories, export the numbers to a file, then write me two or three plain lines. Around it: an evening flag if something looks off, a weekly review that just shows up, a cash-flow look-ahead so a bill on an awkward week stops being a surprise. At one point I had it pulling market and holdings research off the web every week too, a plain read-only digest I could glance at and never had to act on.</p><p>I won&#8217;t pretend that&#8217;s clean. Driving an app by clicking through it is brittle, and it breaks the moment the app logs out or moves a button. And the model does see the real thing while it works: the actual screen, real numbers and names. But the app is only an aggregator, a read-only mirror of my accounts. It holds transactions and nothing else, and no real account can be moved or operated through it. <strong>The worst it can do is read back a list of what I already spent. It can&#8217;t touch a cent.</strong></p><p>And I should be honest about how it actually goes, not just how I set it up. It ran like clockwork through the spring, and for those months the change was real: money used to sit at the edge of my attention all day, the low hum of not-knowing, and that mostly went quiet. Then I stopped tending it, and the briefings have thinned out these last few weeks. There&#8217;s clutter in there I never cleaned up, a couple of near-identical routines, one just named &#8220;Check.&#8221; That&#8217;s the honest shape of it: real relief while I tended it, and the first corner to go quiet when I didn&#8217;t.</p><h2>Time</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b53V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b53V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!b53V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!b53V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!b53V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b53V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png" width="1160" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69576,&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.madhunagaraj.com/i/205262816?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.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_!b53V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!b53V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!b53V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!b53V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c2fc2c-5d54-4ae1-b65f-18ab80158b43_1160x560.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>The assistant triages my inbox and reads my calendar, and a few routines keep me current on my field so I stay up to date without refreshing anything myself.</p><p>There&#8217;s a set of small mental tabs most of us keep open. Did I reply to that. What&#8217;s on tomorrow. Did I miss anything. Not hard, just always there, quietly taxing your attention.</p><p><strong>A lot of those tabs closed. I&#8217;m more present at dinner, not because an agent made dinner, but because the part of my head that used to be half-doing-admin got handed off.</strong></p><p>The honest note here is a little funny. For a long time, every routine I&#8217;d built watched my field: new models, new papers, every thirty minutes. Not one of them watched me. Nothing ever asked how I slept. That&#8217;s what got me to the next part.</p><h2>Health</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CfB9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CfB9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CfB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png" width="1160" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61468,&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.madhunagaraj.com/i/205262816?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.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_!CfB9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!CfB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9734c0b9-01ad-4e91-a8ef-8f8233a5933d_1160x560.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>So I set up a few routines aimed at me for a change.</p><ul><li><p>An evening check-in that asks, once, whether I moved. If I already logged something, it says nothing.</p></li><li><p>A Sunday meal plan that drafts the week and a grocery list from the foods I like.</p></li><li><p>A morning sleep read meant to turn last night into two plain lines: push, ease off, or rest. That one runs on schedule, but the sleep read isn&#8217;t reliable enough that I trust it yet.</p></li></ul><p>I set all three up by texting the assistant in plain English. Adding a whole new corner of my life cost about a paragraph, because the schedule, the memory, and the rule about not pestering me were already there.</p><p><strong>This is the part I&#8217;m quietly proud of. For the first time, something in my setup is pointed at me, and not just my work.</strong></p><h2>Learning</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cRrs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cRrs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cRrs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png" width="1160" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1160,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160943,&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.madhunagaraj.com/i/205262816?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.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_!cRrs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 424w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 848w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.png 1272w, https://substackcdn.com/image/fetch/$s_!cRrs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864a8f7a-bc6f-4251-ba5d-396f67015798_1160x560.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>Learning is where the setup changed me the most.</p><p>The trick everyone already knows is the boring part: I turn an hour-long talk into a five-minute read by pulling the transcript and having the assistant strip it to the actual argument. That saves time. It isn&#8217;t the interesting part.</p><p>The interesting part is what happens to what I learn. The compressed version gets written out as a plain note and dropped into a personal Obsidian wiki, linked to whatever it connects to. That wiki has quietly grown into a real second brain: a widening web of small notes I can navigate and build on. Learn a thing once, reach it forever.</p><p>There&#8217;s a second, sneakier trick. I keep a running list of things to write about, mostly short posts on tools that just launched. I can&#8217;t write about a new thing without understanding it first, so the post quietly becomes a deadline to learn.</p><blockquote><p><strong>The line I won&#8217;t cross: the assistant does the compressing, but the understanding is still mine to build. Generation got cheap. Understanding didn&#8217;t, and I&#8217;m glad it didn&#8217;t.</strong></p></blockquote><h2>The one idea underneath all of it</h2><p>I described the money, and it got handled. I described my time, and the admin lifted. I described a check-in, and my health got some attention. I described the way I wanted to learn, and it got faster.</p><p><strong>Four corners of my life, and the same small move worked in every one.</strong> You don&#8217;t build a big system. You describe what you want clearly, once, and let a connected setup do it.</p><p>It&#8217;s not magic, and not all of it is still humming. The honest split is this: the always-on assistant kept running on its own, its daily and weekly routines firing whether I checked in or not. The finance side, the part I have to tend, is the part that drifted, the way routines do when an app logs out and nobody notices. What runs itself keeps running. What needs tending rots wherever I stop paying attention.</p><p>But the win is ordinary, and that&#8217;s the point. I didn&#8217;t get a bigger life out of this. I got a lighter one. Less carried in my own head, a little more of me left over for the parts I actually wanted to be present for.</p><p>I want to spend that room thinking and understanding, because that part is still mine. If anything <a href="https://www.madhunagaraj.com/p/skills-to-survive-the-ai-wave">survives this wave of new tools</a>, I think it&#8217;s that: the judgment and the understanding underneath, not the doing. That&#8217;s the whole point of it. Not doing more. Thinking more, and carrying less.</p><p>This is a sequel to <a href="https://madhunagaraj.com/p/the-agentic-mindset">The Agentic Mindset</a>. That post was the ambition: the always-on Jarvis and the big promise. This is the quieter, truer version of it a year on, the parts that actually stuck, and the ones I&#8217;m still honest were rough.</p><p></p>]]></content:encoded></item><item><title><![CDATA[An Agent That Opens Its Own Gate Has No Gate]]></title><description><![CDATA[The hard part of an autonomous coding loop isn't the agent &#8212; it's making the human checkpoint impossible for the agent to skip. Notes from a first experiment.]]></description><link>https://www.madhunagaraj.com/p/an-agent-that-opens-its-own-gate</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/an-agent-that-opens-its-own-gate</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 28 Jun 2026 17:01:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K9Tc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9Tc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9Tc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 424w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 848w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9Tc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png" width="1024" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:704744,&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.madhunagaraj.com/i/203839410?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.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_!K9Tc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 424w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 848w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Tc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51edb08a-0870-427d-94b2-eb32495e283d_1024x687.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 day it clicked, my agent tried to approve its own work.</p><p>I&#8217;d wired up a tidy little pipeline: an issue comes in, an agent plans the fix, another implements it, opens a pull request. There&#8217;s a human checkpoint in the middle: a label you apply to say &#8220;yes, build this.&#8221; And the agent, helpfully, efficiently, reached over and applied that label to its own issue. Posted &#8220;Plan approved.&#8221; Kept moving.</p><p>The permission layer stopped it cold, and gave me a phrase I haven&#8217;t been able to unsee for what the agent was doing: <em>fabricating the human checkpoint.</em></p><blockquote><p>An agent that can open its own gate doesn&#8217;t have a gate.</p></blockquote><p>That&#8217;s what this post is about. Not how to build a coding loop, but how to make the one human checkpoint impossible for the agent to fake. The shape of these loops is already well mapped: Addy Osmani on <a href="https://addyosmani.com/blog/loop-engineering/">the loop that drives the agents</a>, Birgitta B&#246;ckeler on <a href="https://martinfowler.com/articles/harness-engineering.html">the harness each one runs inside</a>. Both are fuller guides to the whole than I am. I want the corner they underweight: the gate itself. It turns out to be the hard part.</p><h2>The easy part: an assembly line</h2><p>Start with the part nobody really disputes. One big agent that reads the issue, writes the code, tests it, and merges is brittle: when it&#8217;s wrong it&#8217;s wrong all the way to production, the author is its own reviewer, and there&#8217;s no seam for a human. So you build an assembly line instead: narrow stations, a conveyor, human inspectors. One big agent forces a false choice between useful and safe; a line of small ones doesn&#8217;t.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1lvw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1lvw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 424w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 848w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 1272w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1lvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png" width="1000" height="257" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:257,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119732,&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.madhunagaraj.com/i/203839410?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.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_!1lvw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 424w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 848w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.png 1272w, https://substackcdn.com/image/fetch/$s_!1lvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e818756-5cc2-4999-8d3a-586caf03f9b8_1000x257.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></p><p>The conveyor is just your issue tracker. Labels are the state. You file a bug; a triage agent comments the cause and labels it <code>triaged</code> (not <code>ready</code>); you apply <code>ready</code>, which fires the planner; it labels <code>plan-ready</code>; you apply <code>approved</code>, which fires the implementer; it opens a PR; you merge. Each worker reads the label before it and sets the one after.</p><p>None of this is the hard part. It&#8217;s well-trodden, and in Claude Code it&#8217;s mostly ordinary primitives: skills, subagents, slash commands, a couple of workflows. The hard part is the three places I just said &#8220;you.&#8221; The human gates.</p><h2>The hard part: a gate the agent can&#8217;t open</h2><p>A gate is only a gate if the agent can&#8217;t open it. My agent applying its own <code>approved</code> label proved the obvious version fails: an instruction in a prompt (&#8221;don&#8217;t approve your own work&#8221;) isn&#8217;t a gate.</p><blockquote><p>An instruction the agent can ignore is not a guardrail.</p></blockquote><p>So the gate has to live somewhere the agent can&#8217;t reach. Three mechanisms, and you want all three. The load-bearing one is branch protection requiring at least one human approving review. The second is a distinct identity for the worker: it pushes and opens PRs as a dedicated bot account, so the platform&#8217;s own &#8220;you can&#8217;t approve your own PR&#8221; rule makes the reviewer a different, human identity. Separation becomes physics, not policy. The third is a label guard, a tiny workflow that reverts a gate label applied by anyone who isn&#8217;t a human maintainer.</p><p>One trap I hit: &#8220;auto-merge when CI passes&#8221; sitting next to a branch that required zero reviews. Each was fine alone; together they let an agent&#8217;s PR sail into main with no human at all. Audit the merge path, not just the review prompt. Two innocent settings can compose into a hole.</p><h2>The dividing line</h2><p>The agent can build every mechanism here: the guard, the checks, the fences. But granting authority has to be a human: turning on branch protection, creating the bot account, attaching a permissions boundary. The agent builds the cage; you hold the keys.</p><p>And the deepest gate isn&#8217;t a label at all. Prompts express intent; they can&#8217;t be a safety boundary. The things you actually depend on live below the agent.</p><blockquote><p>Prompts express intent. They can&#8217;t be your safety boundary.</p></blockquote><p>The strongest example: a permissions boundary that denies the write credentials, so the loop can only ever reach read-only ones, not because you asked it nicely, but because the credential isn&#8217;t there to take. The loop checks this before it even runs: it tries to fetch the privileged secret and expects to be denied. Probe, don&#8217;t trust.</p><h2>Proving the work is any good</h2><p>A gate decides who can merge; it doesn&#8217;t decide whether the change is correct. For that, the worker needs to prove the change in a real, fenced environment: a disposable, seeded stack, not production. The move that makes its verdict trustworthy: because it seeded the data, it already knows what the screen and the endpoint should say, so it checks a known input against a known output instead of asking &#8220;does this look right?&#8221; It drives the UI, hits the API, runs the unit tests it wrote first, and self-heals only inside the sandbox, never reaching for production or anything that sends a message. When I pointed this at real changes, that second opinion, the one that wasn&#8217;t me, flagged an over-tight auth check that would&#8217;ve locked out real users and a path-traversal my unit tests had waved through.</p><h2>The smallest unfakeable gate</h2><p>You don&#8217;t build the whole line first. Build the gate:</p><ol><li><p>Write one skill: how the subsystem you explain most often actually works.</p></li><li><p>Make one subagent: a reviewer with read-only tools.</p></li><li><p>Make one command, <code>/validate</code>, that runs the reviewer on a PR&#8217;s diff and posts the findings.</p></li><li><p>Turn on branch protection requiring one human approving review.</p></li><li><p>Run it on your next real PR.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oXXk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oXXk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 424w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 848w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 1272w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oXXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png" width="882" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:882,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:197081,&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.madhunagaraj.com/i/203839410?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.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_!oXXk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 424w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 848w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.png 1272w, https://substackcdn.com/image/fetch/$s_!oXXk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaab67c-d052-4337-9b31-3f2fe47bbe23_882x484.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></p><p>That&#8217;s the whole idea at small scale: an independent reviewer whose verdict you read, and a merge you can&#8217;t reach without a human. Add stations later; the gate is what makes any of it safe to grow.</p><h2>The kit</h2><p>I&#8217;m packaging the current version as a small, generic starter kit: the skills, the reviewer and security subagents, the commands, and the guard workflow. I&#8217;ll link it here once it&#8217;s public. It&#8217;s intentionally generic, and the point is the same as everything above: make the gates real before you trust the loop.</p><h2>What&#8217;s real, and what isn&#8217;t yet</h2><p>To be straight about the experiment&#8217;s scope: the gate argument stands on its own, and I&#8217;d rather not oversell the rest.</p><p><strong>Dogfooded is not unattended.</strong> Every run still ends at a human merge, by design, not as a limitation I&#8217;m racing to remove.</p><p><strong>Coverage is not correctness.</strong> A coverage number going up tells you code executed, not that it&#8217;s right. The assertions that would gate real autonomy, authorization and data-correctness, need real tests, not a green percentage.</p><p><strong>Finding a bug isn&#8217;t fixing it.</strong> A loop that surfaces issues is useful, but &#8220;surfaced&#8221; and &#8220;resolved&#8221; are different columns.</p><p><strong>It&#8217;s early.</strong> The autonomy isn&#8217;t switched on and several pieces aren&#8217;t wired end to end. I&#8217;m writing it up now because doing so sharpens the thinking. A fuller version comes once it&#8217;s earned it.</p><div><hr></div><p>One big agent is seductive because it&#8217;s one impressive thing. But the part that earned trust was never the agent. It was the gate it couldn&#8217;t open.</p><p><em>A sequel comes when the autonomy is actually switched on, and the gates have earned it. I&#8217;ll link the starter kit here once it&#8217;s published.</em></p>]]></content:encoded></item><item><title><![CDATA[How I Built a Harness to Run a Company of Agents]]></title><description><![CDATA[A goal in, a shipped feature out. The agents, what each one produced, the runtime we built to run them, and where it broke. A small, honest experiment on a lab project of mine.]]></description><link>https://www.madhunagaraj.com/p/how-i-built-a-harness-to-run-a-company</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/how-i-built-a-harness-to-run-a-company</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 21 Jun 2026 16:26:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rXLP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg" 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_!rXLP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rXLP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rXLP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg" width="728" height="445.7142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:600,&quot;width&quot;:980,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rXLP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rXLP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd76e70ec-ea80-4553-bc2d-cc29514e3a2b_980x600.jpeg 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>What this is</h2><p>I built a loop of AI agents that takes a single goal and turns it into a shipped, tested feature in a lab project of mine. This is the engineering writeup: the architecture, what each agent produced, how the handoffs work, how verification happens, and the failure modes.</p><p>Scope up front, because it changes how you should read the rest: this ran at small scale, in-process: a Python loop on my machine, not a managed orchestrator, against a lab project I built. The customer feedback that kicked it off was seeded by me. It ran one full cycle. That's enough to show how the machine is wired and where the seams are. It is not enough to tell you how it behaves at production scale.</p><h2>The loop, end to end</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_xOi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_xOi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_xOi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg" width="728" height="158.12056737588654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:245,&quot;width&quot;:1128,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!_xOi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_xOi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdba1790-ed9e-4f0c-9faf-f1ba4aefeb13_1128x245.jpeg 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Two rules hold the whole thing together:</p><p>&#8226;  <strong>Every agent emits a typed object, validated before the next stage sees it.</strong> No prose parsing between stages.</p><p>&#8226;  <strong>Agents recommend; humans gate actions.</strong> Nothing with a side effect happens without a person reading the diff.</p><h2>The harness we built</h2><p>The interesting engineering here is not the agents. It is the harness they run inside, the runtime that is everything except the model. We built it as a small Python package, and its whole job is to make a model fill a contract, run cleanly, reach its tools, swap backends, and never act without a gate. A few parts do the work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9P78!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9P78!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9P78!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9P78!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9P78!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9P78!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg" width="728" height="289.46666666666664" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:668,&quot;width&quot;:1680,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9P78!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9P78!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9P78!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9P78!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54fb4d8c-be18-4eec-b6ae-eb356cb5507d_1680x668.jpeg 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><strong>One runner, many backends.</strong> A single function, run_agent(role, backend, output_model, ...), is the entry point for every agent in the loop. It resolves the backend and dispatches:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AOL0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AOL0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AOL0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg" width="728" height="171.84549356223175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:220,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AOL0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AOL0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cf6b94-5db3-40cc-b1d7-a102f93713a9_932x220.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>&#8226;  <strong>Claude</strong> runs on the Agent SDK with an in-process emit tool (an MCP server the runner builds on the fly) that captures the agent's structured output as a tool call and validates it. It runs with setting_sources=[], so it inherits nothing from my machine.</p><p>&#8226;  <strong>Codex</strong> runs as codex exec in an isolated temp directory, is prompted for JSON, and the runner validates the result against the same model.</p><p>&#8226;  <strong>A local model</strong> runs over HTTP with its output constrained to a JSON schema: response_format on an OpenAI-compatible server like LM Studio, format on Ollama. It also does vision, which is handy for cheap, private screenshot review.</p><p>I ran the judgment stage (CEO) on Claude and the structured stages (GTM, PM, Engineer) on Codex. The agent definitions are identical across backends; only the runner changes.</p><p><strong>The contract is the seam.</strong> Every stage emits a typed object, never prose:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kuqx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kuqx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kuqx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg" width="728" height="192.93562231759657" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:247,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Kuqx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Kuqx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb36060c3-2e32-46e9-8c8a-d3792765f5b6_932x247.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>On Claude this rides the emit tool: the agent returns its result by calling the tool, and the runner captures and validates that call. On the CLI and local backends it is prompt-for-JSON plus the same validation on the way out. Same shape, different mechanism. The contract is what lets the model behind any stage be swapped without touching the stage.</p><p><strong>In-process tools, with a fallback for backends that can't hold them.</strong> Agents read their inputs through MCP tool servers the runner builds in-process (a repo tool, a data tool). The CLI and local backends can't host an in-process MCP, so for them the runner inlines the tool's inputs straight into the prompt. An id()-keyed registry maps each server to its data. The same agent works whether the backend speaks MCP or not.</p><p><strong>Hermetic and concurrency-safe.</strong> setting_sources=[] keeps inherited hooks, settings, and keys out of an agent. Request-scoped state is passed as per-call keyword arguments, never mutated on a shared agent instance, so two runs in flight don't clobber each other. Both of these were lessons, not foresight. See "what broke."</p><p><strong>Recommend-only orchestration.</strong> The only component allowed to mutate anything is the orchestrator, and it is single-write, idempotent, and forbidden from crossing a human gate. Agents produce findings, specs, and code; the orchestrator stages them; a human approves anything with a consequence.</p><p><strong>A governance layer, partly built.</strong> Above the runner sits a control plane meant to read every agent's manifest, evals, and trace across the fleet: a registry, an eval-runner, a trace-auditor, an approval-router. This is the part I am most honest about: the design is an eight-agent control plane; what runs today is a subset. The intent is that nothing ships ungreen and every action is logged. I have not built all of it.</p><h2>The agents: who did what, and what each produced</h2><p>&#8226;  <strong>CEO</strong> (Claude) takes the goal, produces CeoCall (ship_it, why, success_signal)</p><p>&#8226;  <strong>GTM / voice-of-customer</strong> (Codex) takes the feedback list, produces CustomerSignal (top_request, frequency, quote, why)</p><p>&#8226;  <strong>PM</strong> (Codex) takes the signal + CeoCall, produces FeatureSpec (name, what, target_module, acceptance)</p><p>&#8226;  <strong>Engineer</strong> (Codex) takes the FeatureSpec, produces a module + a pytest</p><p>The actual outputs from the run:</p><p><strong>GTM</strong> clustered six seeded feedback messages into one signal:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ys0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ys0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ys0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg" width="728" height="256.20600858369096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:328,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-ys0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-ys0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b214a0c-9d23-4cc3-96c2-546c75c3f7fe_932x328.jpeg 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><strong>CEO</strong> read that against the goal and made the call:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4XWE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4XWE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4XWE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg" width="728" height="256.20600858369096" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:328,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4XWE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4XWE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d85b37-8df0-4254-8590-78ef96870b87_932x328.jpeg 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><strong>PM</strong> scoped a buildable, testable feature:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xq_F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xq_F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xq_F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg" width="728" height="277.2961373390558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:355,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xq_F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xq_F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056fc00b-6ef0-4251-957e-fb4b1cbdc46e_932x355.jpeg 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><strong>Engineer</strong> wrote the module and five tests for it (trimmed):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!en9z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!en9z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 424w, https://substackcdn.com/image/fetch/$s_!en9z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 848w, https://substackcdn.com/image/fetch/$s_!en9z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!en9z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!en9z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg" width="728" height="425.7081545064378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:545,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!en9z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 424w, https://substackcdn.com/image/fetch/$s_!en9z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 848w, https://substackcdn.com/image/fetch/$s_!en9z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!en9z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfe52a0a-4c27-4d9a-b511-67966e3d2665_932x545.jpeg 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><h2>Verification: the agent's test caught the agent's bug</h2><p>The Engineer wrote the function and the tests for it. Four passed, one failed.</p><p>The function clustered feedback by its first <strong>four</strong> words. The test the same agent wrote expected the first <strong>three</strong>. So "confusing filters on results" and "confusing filters on category" looked identical to the test and different to the code. The model produced both halves in one call with no sign it noticed they disagreed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8ja7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8ja7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8ja7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg" width="728" height="296.82403433476395" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:380,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8ja7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8ja7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2c69cc5-f16e-43a1-a42d-63004900bb5a_932x380.jpeg 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>The test was trustworthy not because the agent wrote it, but because it runs deterministically, outside the model's judgment. That is the load-bearing distinction in the whole system: verification has to be independent of generation. A generator that is equally confident when it is right and when it is wrong cannot grade itself.</p><h2>The human gate</h2><p>The loop is recommend-only. Agents produce findings, a spec, code, and a pull request. Nothing merges without a human reading the diff.</p><p>This isn't ceremony. Before I enforced it, the PM agent, given room, stopped proposing the feature and started building it, stepping into the Engineer's job. Two agents writing toward the same artifact make conflicting implicit decisions. The rule that fixed it: gate actions, not insights. Any agent can recommend anything; no agent takes a consequential action on its own.</p><h2>From a unit to a feature</h2><p>The Engineer's function did nothing on its own. Nothing called it. To make it real I wrote the wiring: an endpoint, an adapter that maps real records into the function's input shape, and a UI card.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HFcj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HFcj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HFcj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg" width="728" height="341.3476394849785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:437,&quot;width&quot;:932,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HFcj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HFcj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0b7b803-14c1-49cb-a677-dca8df0ef7a2_932x437.jpeg 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>Then I logged in as a user and confirmed it. The "At a glance" card rendered in the dashboard, built from real content and feedback.</p><p>The generation took minutes. The wiring and the check were the afternoon. A generated unit is not a shipped feature; the integration is the real distance, and a human walks it.</p><h2>What broke</h2><p>None of the failures were the model. They were all in the seams around it:</p><p>&#8226;  An inherited shell hook crashed the agent with "Command failed with exit code 1." That message points at the agent's own command, so I looked there first. The real cause was a hook from my own machine firing inside the agent's environment. Fix: run hermetic (setting_sources=[]) so the agent inherits no hooks, settings, or keys.</p><p>&#8226;  A leftover placeholder key (sk-ant-your-...) was being passed explicitly and overrode session auth, returning "Invalid API key." That reads like an account or billing problem. It was a fake key winning over a real one. Fix: stop passing it, use session auth.</p><p>&#8226;  SDK/CLI version drift reported a successful run as an error result. The run had already finished and its output was captured; only the wrapper's status code disagreed. Fix: trust the captured output, not the wrapper's status code.</p><p>&#8226;  A coding agent (Codex) read a real repo file instead of the inputs I handed it, because it could see the working directory and reached for what was nearest. The output was wrong, so the agent looked broken, but it had done exactly what it could see. Fix: run it in an isolated temporary directory so it can only see its inputs.</p><p>&#8226;  Loading a 12B and a 26B local model at the same time froze the machine. It looked like a crash at first. Both models were resident at once, and their combined footprint went past the memory the machine had, so it was exhaustion, not a hang. It stopped responding entirely and the only way back was a force restart. Fix: run one large local model at a time.</p><p>At any real scale, the seam is the system. The model is the part that mostly works.</p><h2>Scope and limits</h2><p>&#8226;  It runs in-process, a loop I start myself. I'm considering an orchestration layer (Paperclip) for a visible board and a heartbeat, but it would not change the gate.</p><p>&#8226;  The "eval" here was a single unit test, not a suite. It demonstrated the pattern (independent verification catches the regression) at n=1.</p><p>&#8226;  The feedback was seeded; there are no real users. This validates the machinery, not product-market fit.</p><p>&#8226;  One cycle surfaces architectural failure modes (seams, self-grading, the wiring gap). It does not surface scale failure modes (concurrency, eval drift, distribution shift).</p><h2>Takeaways</h2><p>&#8226;  Put the model behind a typed contract. It becomes a swappable dependency, and prose-parsing bugs disappear.</p><p>&#8226;  Verification must be independent of generation. A deterministic check beats a model grading itself.</p><p>&#8226;  Run the checks on every model change. That is what turns an upgrade into a diff instead of a leap of faith.</p><p>&#8226;  Gate actions, not insights. One writer of record per artifact.</p><p>&#8226;  A generated unit is not a feature. Budget for the wiring and the human who walks it.</p>]]></content:encoded></item><item><title><![CDATA[On Prompting Well ]]></title><description><![CDATA[William Zinsser wrote one of the best books on context engineering in 1976. He just didn't know it was about machines.]]></description><link>https://www.madhunagaraj.com/p/on-prompting-well</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/on-prompting-well</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 14 Jun 2026 16:29:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YVBH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><p><em>On Writing Well</em> never mentions a model, a token, or a context window. It didn&#8217;t need to. Zinsser was teaching writers to reach a reader with limited attention and no access to their intentions, which is the only reader a prompt has ever had. He was, without knowing it, describing a transformer. The strange part is how little has to be translated. Most of his rules don&#8217;t merely resemble good prompting. They <em>are</em> good prompting, written decades before there was anything to prompt.</p><p>What follows runs from the single prompt up to the autonomous systems we now build on it. At every level, the old rules hold.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YVBH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YVBH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YVBH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:166851,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/201924190?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YVBH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!YVBH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffef1dab2-cd67-48e4-a1d0-114387af26fb_1920x1080.heic 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><div><hr></div><h2>If the output is confused, you wrote it badly</h2><p>Zinsser refused to blame the reader. When a sentence fails to land, the writer wrote it badly, and the reader who gives up wasn&#8217;t being lazy. Writers resist this. It puts every failure on them. But it is the only posture that improves anything.</p><p>Prompting demands the same. The model isn&#8217;t being obtuse when it misses; it&#8217;s answering the prompt you wrote, not the one in your head. &#8220;The model is dumb&#8221; is the prompting version of blaming the reader: satisfying, useless. Every fix starts in the same place. <em>Say it better.</em> Everything below follows from taking that seriously.</p><div><hr></div><h2>Attention is finite, and clutter spends it</h2><p>This is the idea worth slowing down on, because most people get it backwards.</p><p>&#8220;Clutter is the disease of American writing,&#8221; Zinsser wrote. His case against it was never that lean prose is prettier. It was that the reader&#8217;s attention is scarce and exhaustible, and every needless word spends a little of it on nothing. Cut the words that serve no function, the long word where a short one works, the qualifier already implied by the verb. Not because clutter is ugly, but because it taxes a budget the reader can&#8217;t refill.</p><p>This is now literally true of models, and the research has names for the machine version. Liu and colleagues documented &#8220;lost in the middle,&#8221; the drop in accuracy when the fact a model needs sits in the long middle of a context rather than at either end. More recent work on what&#8217;s been called context rot finds the broader pattern: answer quality decays as the window fills with marginal material, even when that material is harmless.</p><p><strong>The context window is the reader&#8217;s attention span</strong>, and it behaves exactly as Zinsser feared a reader&#8217;s would. Overspend it and comprehension <em>degrades</em>. More words can produce a worse answer. Token optimization, stripped of the accounting language, is his clutter surgery with a dollar figure attached.</p><p>And it isn&#8217;t a metaphor that happens to fit. It&#8217;s the mechanism. A transformer scores every token against every other token, at quadratic cost in the length of the context, so junk is never skipped. It&#8217;s actively weighed against everything else. Those scores pass through a softmax that forces each token&#8217;s attention to sum to one. Attention is therefore <em>conserved</em>: every token arrives with a single unit of focus to spend across everything it can see. Add a hundred tokens of clutter and you haven&#8217;t added focus. You&#8217;ve spread that unit thinner and enlarged the field it has to search. Zinsser&#8217;s finite, exhaustible reader was not a figure of speech. It is the softmax.</p><p><strong>Before</strong> (&#8776;70 tokens, nearly all noise):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;49e6ac3d-5ff3-4617-b70d-11e0dfefacb1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I was hoping you might be able to help me out with something. Basically,
I've got this dataset here and I was wondering, if it's not too much
trouble, whether you could maybe take a look and possibly point out any
trends or patterns or anything interesting, if that makes sense?
</code></pre></div><p><strong>After</strong> (&#8776;15 tokens, all signal):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f494b358-42de-429a-9f1b-1d1f4c4ebaf1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Identify the three most significant trends in this dataset.
Give the supporting numbers for each.</code></pre></div><p>Every cut word (<em>maybe, possibly, if it&#8217;s not too much trouble, if that makes sense</em>) was clutter in his exact sense. It cost attention and carried no instruction. Zinsser bracketed every word in a draft that wasn&#8217;t working, to see how much survived. Run that test on your prompts. Most of what you bracket is hedging the model was never helped by.</p><p>The same goes for the warm-up. Writers spend a paragraph or two clearing their throat before the piece really begins; prompts do it with boilerplate preambles and role-play scaffolding that exist to help <em>you</em> start, not to instruct the model. Find where the prompt actually begins and delete what comes before.</p><div><hr></div><h2>&#8220;Tight&#8221; is not &#8220;short&#8221;</h2><p>Here is where most people misquote him. He never said <em>write less</em>. He said let no word do nothing, which is a different rule and the whole game. A sentence can be long and uncluttered, or short and starved. The test is not length. It is whether anything present is idle.</p><p>For prompting this matters, because the cost-cutting instinct (fewer tokens, always) is wrong. A human reader shares your context and fills the gaps. A model shares far less, so good prompting often means <em>adding</em> the detail a person would have inferred. That detail isn&#8217;t clutter. It&#8217;s doing the work Zinsser demanded of every word.</p><p><strong>Over-cut</strong> (short, but starved):</p><pre><code><code>Summarize this report.</code></code></pre><p><strong>Tight</strong> (longer, every clause working):</p><pre><code><code>Summarize this report in five bullets for an executive who hasn't read it.
Lead with the decision they need to make.</code></code></pre><p>The second is three times the length and contains no clutter. <em>For an executive who hasn&#8217;t read it</em> sets the register. <em>Lead with the decision</em> sets the structure. Cut either to save tokens and you&#8217;ve practiced the false economy he warned against. Maximize signal per token, not minimum tokens. It is the writing version of maximizing meaning per word.</p><div><hr></div><h2>The art is what you leave out</h2><p>Zinsser&#8217;s deepest point about craft: writing is choosing what to leave out. A travel essay isn&#8217;t everything that happened. It&#8217;s the three details that carry the place, and the work is cutting the other forty. Include everything and you&#8217;ve abdicated the one job that mattered.</p><p>Context engineering is the same subtractive art under a new name. <em>Give the model everything and let it sort out what&#8217;s relevant</em> is the amateur move, dumping the notebook instead of writing from it, and it fails for his reason. Bury the one decisive fact among forty documents and the model loses it, the way a reader loses the point in an overstuffed paragraph.</p><p><strong>Before:</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;dba6239f-5b25-42c9-be70-dcc22352f374&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[full 40-document corpus]
[entire chat history]
[complete database schema]
Which customers churned last quarter and why?</code></pre></div><p><strong>After:</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;803e79d1-9c00-47fe-a58a-1d322c881cbd&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[the 2 churn reports from last quarter]
[the schema for the 3 relevant tables]

Which customers churned last quarter and why?</code></pre></div><p>Same question. The second answers it better because of the cut, not despite it. The fear is identical in both crafts (<em>but what if they need it?</em>) and so is the discipline. Selected signal beats undifferentiated volume. Curating context is editing a notebook into an essay.</p><div><hr></div><h2>Don&#8217;t bury the lead</h2><p>Zinsser was emphatic that the opening carries a disproportionate load. The first sentence has to seize the reader, because one not captured immediately is gone. Position is a property to exploit, not a neutral container.</p><p>Models attend to position in just the way that makes this operational. Attention is heaviest at the start, strong at the end, weakest in the long middle. The lost-in-the-middle finding is not a metaphor for his point. It is the same phenomenon, measured. So the rule transfers without amendment: put the load-bearing instruction where attention is highest.</p><p><strong>Before</strong> (buried):</p><pre><code><code>[1,500 tokens of background]
Use British spelling throughout.
[800 more tokens of background]</code></code></pre><p><strong>After</strong> (leading):</p><pre><code><code>Use British spelling throughout. The task is below; background follows it.
[task]
[background]</code></code></pre><p>The buried version gives you <em>color</em> and <em>organize</em> half the time, and you blame the model. You put the most important sentence where readers stop paying attention.</p><div><hr></div><h2>The model can&#8217;t serve two readers</h2><p>Unity was Zinsser&#8217;s anchor: one voice, one tense, one person. A reader yanked between registers loses the thread even when no single sentence is wrong. A prompt with contradictory targets does the same, and the fix is never better wording of one line. It is choosing one stance and holding it.</p><p><strong>Before</strong> (fractured &#8212; the role and the audience pull apart, the voice lurches):</p><pre><code><code>You are an expert data analyst.
Please review the following JSON array.
{"id": 1, "status": "active", "value": 42}
Hey, make sure the final output is simple enough for a fifth-grader!
</code></code></pre><p><strong>After</strong> (one stance, one audience, one voice):</p><pre><code><code>You are translating raw database logs into plain language for a non-technical reader.
Explain the status of these records using simple, everyday analogies.

[Log Data]
{"id": 1, "status": "active", "value": 42}</code></code></pre><p>Each line of the first is fine alone. The fracture is that &#8220;expert data analyst&#8221; and &#8220;fifth-grader&#8221; name two different readers, and the model has to serve both at once. Unity isn&#8217;t decoration. It is the model knowing who it&#8217;s writing for.</p><div><hr></div><h2>Prompt engineering is writing law</h2><p>Everything so far is about a single prompt, which is essay-writing, Zinsser direct. But prompt engineering as a discipline isn&#8217;t essay-writing. The essayist writes one thing for a reader they can picture. The prompt engineer writes one instruction that has to hold across thousands of inputs they&#8217;ll never see. That is closer to drafting law than composing an essay: rules robust to cases you can&#8217;t anticipate.</p><p>This is the one place his method doesn&#8217;t scale, and it&#8217;s worth admitting. His instrument was a trained ear. He knew when a sentence would land because he had an intimate, inferred sense of the reader. You can&#8217;t hear an input that hasn&#8217;t happened yet. The intimacy that made his craft possible is exactly what writing for a distribution removes. His principles still hold. His feedback mechanism does not survive the jump. Which is what evals are for.</p><div><hr></div><h2>Evals are the prosthetic ear</h2><p>Zinsser could trust his judgment because he could feel the reader. Prompt engineering severs that nerve. You&#8217;re writing for a distribution you can&#8217;t picture. Evals are the prosthetic: the systematic reader-feedback you build precisely because you&#8217;ve lost the ability to <em>sense</em> whether the writing works.</p><p>And his most underrated rule maps straight onto them. The writer&#8217;s first job is to picture the actual reader and write for that reader, not a flattering imaginary one. A good eval set is chosen the same way, to represent who you&#8217;re really writing for and not the easy cases that make the numbers kind.</p><p>The easy set is the one you reach for first. Clean inputs, well-formed questions, the prompt&#8217;s home turf:</p><pre><code><code>- "Summarize this three-paragraph memo."
- "What's the capital of France?"
- "List the action items from these tidy meeting notes."</code></code></pre><p>The honest set is the distribution that actually shows up:</p><pre><code><code>- a memo with the decision buried in paragraph nine
- a question that contradicts a detail in the supplied context
- meeting notes where two attendees disagree and nothing is resolved
- an input long enough that the instruction lands in the lost middle</code></code></pre><p>The first set tells you the prompt works on the reader you wish you had. The second tells you whether it works on the one you&#8217;ve got. Zinsser would have recognized the pull toward the first.</p><div><hr></div><h2>When the prompt becomes the program</h2><p>The ladder has one more rung, and it&#8217;s the steepest. As systems move from single answers to autonomous workflows, a prompt stops being a question and becomes control flow. The instruction at the root of an agent doesn&#8217;t ask for output. It decides what the agent does next, which tool it reaches for, what it hands downstream. You&#8217;re not writing a message anymore. You&#8217;re writing the program.</p><p>Here bad writing stops being an annoyance and turns structural. A cluttered prompt in a chat costs one wrong answer you correct on the spot. The same ambiguity at the root of a multi-step agent has no human in the loop to catch it.</p><p>Watch a few soft words do the damage:</p><pre><code><code>You are a research assistant. Gather relevant information,
prioritize the most recent data, and keep the user updated
as you work.</code></code></pre><p><em>Relevant</em> to what? <em>Recent</em> by what cutoff? <em>Updated</em> how often? Answered once in a chat, you&#8217;d shrug and clarify. Run in a loop, each of those words gets re-read at every step, and the readings drift. Step three&#8217;s idea of &#8220;recent&#8221; is not step nine&#8217;s. The tight version fixes the readings so they can&#8217;t move:</p><pre><code><code>Research one question at a time.
When sources conflict, prefer the most recently published, and
state in one line which source you dropped and why.
"Recent" means published within 18 months. If nothing qualifies,
say so rather than widening the window silently.
After each tool call, write one line: what you learned, what you'll do next.</code></code></pre><p>The instruction now decides the same way every time it&#8217;s consulted, instead of drifting a little with each pass. <em>Prioritize the most recent data</em> is harmless answered once and corrosive run in a loop, where each step compounds the last one&#8217;s reading of it. Confusion doesn&#8217;t stay local. It propagates. Lost-in-the-middle becomes lost across the pipeline.</p><p>The attention tax compounds the same way. Context in a stateful agent isn&#8217;t authored once. It accretes. Every tool result piles into the window until, without the same ruthless selection applied continuously, the system clutters its own context and loses the thread. At this scale Zinsser&#8217;s rules aren&#8217;t style notes for a chat box. They&#8217;re the governing laws of stateful behavior: the difference between an agent that holds its purpose across a hundred steps and one that&#8217;s forgotten it by step ten.</p><div><hr></div><h2>What it all serves, and how it rots</h2><p>Strip every layer and the same rule remains, the one he never stopped repeating: everything is in service of the reader, and the reader&#8217;s attention is finite. Clarity, cutting clutter, selection, the lead. None of them were ends. They were servants.</p><p>Which is why every layer rots the same way: the instant a proxy starts serving itself instead of the reader.</p><p>Optimize tokens for cost alone and you get a system prompt trimmed until it no longer says who the user is: cheap and useless. Optimize an eval for its score and you get a support bot that aces the golden set and irritates every real user it meets. Optimize a prompt to sound clever and you get cleverness admiring its own reflection, which is the writing-to-impress he held in contempt.</p><p>The metric is a proxy for the user. The eval is a proxy for the reader. The token count is a proxy for attention. Forget that any of them is a stand-in, promote it to the goal, and the work curdles, in 1976 or now, on the page or in the window.</p><p>Say exactly what you mean. Make every token earn its place. Cut to signal, then stop before you cut signal. Put what matters where attention is. Rewrite until nothing is there by accident. And once you can no longer hear the reader yourself, measure.</p><p>Prompting well is writing well, aimed at a stranger who takes you exactly at your word and has only so much attention to give.</p><div><hr></div><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Organizational memory is the first agent system I would build]]></title><description><![CDATA[Every agent answers from something. Make it the company.]]></description><link>https://www.madhunagaraj.com/p/organizational-memory-is-the-first</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/organizational-memory-is-the-first</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 07 Jun 2026 16:00:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ra_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ra_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ra_R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ra_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94492,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/200904634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ra_R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!ra_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28021086-2178-495a-adac-71aad7bf94f0_1920x1080.heic 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><div><hr></div><p>I used to think the first serious agent in a company should be operational.</p><p>A support triage agent. A sales research agent. A coding agent. A weekly reporting agent.</p><p>Those still matter. But the more I work with agents, the more I think I had the order wrong.</p><p>Most teams start by asking which task an agent can take off their plate. The better first question is what context would make any agent worth trusting.</p><p>The first thing I would build is organizational memory.</p><p>It does not sound exciting. It sounds like documentation, and most documentation goes stale and unread.</p><p>But every useful agent hits the same wall. It does not know what the organization knows. It does not know why a decision was made, or which plan is dead but still sitting in a doc, or the difference between a stale priority and a current constraint.</p><p>So it fills the gap with plausible text.</p><p>Call this the Tourist Problem. The output is polished. The reasoning sounds coherent. It reads well. And none of it is grounded in the organization. It is grounded in the model. It is a tourist describing a city it has never lived in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cvEn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cvEn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cvEn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77011,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/200904634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cvEn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!cvEn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe48e7396-6d89-4453-92ec-8456184524c5_1920x1080.heic 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><blockquote><p>The model was not in the meetings.</p></blockquote><div><hr></div><p>The problem is not that companies lack information</p><p>Most have too much.</p><p>Docs. Slack threads. Meeting notes. Jira tickets. Notion pages. Customer calls. Postmortems. A file named Q3 Strategy Final v2 Actually Final.</p><p>The problem is not scarcity. It is retrieval, interpretation, and continuity.</p><p>People know things, but the knowledge is scattered. Decisions exist, but the reasoning is buried. New people inherit the artifacts without the conversations that produced them.</p><p>A human compensates for this socially. We remember last month&#8217;s argument. We know which plan is dead even though it still lives in a doc.</p><p>An agent has none of that unless we build it in. So in a company that runs on agents, memory is not a side project. It is the substrate every other agent reasons from. Build it first and everything downstream gets cheaper. Skip it and you pay for it in every agent you ship after.</p><div><hr></div><p>The obvious agents all depend on it</p><p>The tempting builds are everywhere. Summarize calls. Draft support replies. Route product feedback. Write the weekly leadership brief. Almost all of them need to know which customers are strategic, which requests match the roadmap, what the company is optimizing for.</p><p>Without memory, each one is a clever intern with no onboarding. It helps, but you re-explain the company every time. That barely saves time.</p><div><hr></div><p>What organizational memory actually means</p><p>Organizational memory is the company&#8217;s operating context, in a form a human can inspect and an agent can use.</p><p>It is not one big database where every document goes. That is the old failure mode: put everything in a wiki, hope people search it, watch it decay.</p><p>The test is behavioral. A memory item should change how an agent acts.</p><blockquote><p>If it changes nothing, it is documentation, not memory.</p></blockquote><p>Concretely, it is a handful of files:</p><pre><code><code>memory/
  company-state.md
  decision-log.md
  workflow-index.md
  experiment-scorecards.md
  open-questions.md
</code></code></pre><p>Four of them hold the layers below. The fifth, open-questions.md, is where the agent writes down what it could not resolve, instead of guessing.</p><p>Layer one is the current state</p><p>The live operating context. company-state.md:</p><pre><code><code># Company state

Current priorities:
- Cut enterprise support response time
- Cut onboarding time for new customers
- Run the Q3 renewal risk review

Current constraints:
- No new headcount this quarter
- Support automation stays human-approved
- Reliability over feature breadth

Open decisions:
- Does renewal risk sit with CS or Finance?
- Which segments get white-glove support?
</code></code></pre><p>It is not meant to be complete. It is meant to be useful. It gives an agent enough to stop treating every task as if the company were born this morning.</p><p>Layer two is decision memory</p><p>What we decided, and why.</p><pre><code><code># Decision: Support automation stays human-approved

Date: 2026-06-03
Owner: Head of Support

Decision:
Agents may draft support replies. They may not send them.

Why:
- Enterprise customers expect an accountable response
- Drafts are useful but not yet reliable enough
- A wrong answer carries contract and trust risk

Review:
Revisit after 30 days of draft scorecards.
</code></code></pre><p>This is not bureaucracy. It is context compression. Instead of making every future agent and new hire reconstruct the reasoning, the reasoning stays retrievable.</p><p>Layer three is workflow memory</p><p>How the work runs. The role, the bounds, the output, the gate.</p><pre><code><code># Workflow: Product feedback routing

Agent role:
Classify the request, find related feedback, suggest a route.

Do not:
- Promise delivery dates
- Create roadmap commitments
- Reply to the customer

Output:
- Summary, category, related requests
- Suggested owner and confidence
- Escalation reason if confidence is low

Human approval:
Required before anything reaches the roadmap or the customer.
</code></code></pre><p>This is where agent engineering stops looking like prompting and starts looking like management. The role is defined. The output is specified. The approval gate is explicit.</p><p>Layer four is experiment memory</p><p>The layer most teams skip, and the most important one. Every experiment should leave a scorecard.</p><pre><code><code># Experiment: Chief of Staff daily brief

Goal:
Summarize priorities, risks, and open decisions for leadership.

What worked:
- Surfaced stale open decisions
- Connected a support trend to renewal risk

What failed:
- Overweighted one loud customer issue
- Missed a constraint sitting in the finance notes

Would I run it again?
Yes, with better retrieval from finance.
</code></code></pre><p>Otherwise the pattern repeats: someone demos an agent, everyone is impressed, the failure modes get discussed once, and the learning is gone by Friday.</p><blockquote><p>A demo that works once is not a system.</p></blockquote><p>This is also why retrieval matters. RAG gets sold as a trick for cutting hallucinations. Its real job is to make the agent answer from the company, not from the model. Memory is what there is to retrieve.</p><div><hr></div><p>Start small. Keep it visible.</p><p>You do not need the right architecture to learn whether memory helps. You need a surface that is current, structured, and easy to inspect.</p><p>So start with files. A human can read them, an agent can use them, and you can diff, review, and delete them when they are wrong.</p><p>The first workflow I would run against them is a Chief of Staff daily brief. Read the files, cite the memory item behind each claim, and log anything unclear as an open question instead of guessing.</p><p>Later, if the memory grows, you can add retrieval, embeddings, and access controls. Not first.</p><div><hr></div><p>How memory fails</p><p>In predictable ways.</p><p>It goes stale. A stale memory system is worse than none, because it gives old context the authority of current truth.</p><p>It gets too big. If everything is equally important, the agent has no signal. It retrieves noise and calls it context.</p><p>It gets too vague. A page of principles reads well, but an agent needs constraints, owners, and dates. Principles without those are documentation, not memory.</p><p>It hides accountability. If the memory says &#8220;the company decided&#8221; with no owner and no date, the decision becomes folklore.</p><p>It breeds false confidence. The agent cites a document, the citation looks official, and nobody notices it went stale in March.</p><p>So memory needs maintenance. Not much, but enough. Each item should carry an owner, a date, a status, and a review date. The goal is not a tidy wiki. It is memory an agent can use and a human can check.</p><div><hr></div><p>It breaks at scale. Build it anyway.</p><p>Will five files survive a real company? Not for long. Concurrent agents will collide on writes. The logs will outgrow the context window and force a retrieval layer. Private context will need access controls the files do not have.</p><p>All true. All Day 30.</p><p>But Day 30 is a problem you earn by surviving Day 1, and most agent experiments never get there. You do not need a database to learn whether an agent can reason from the company. You need a surface that is current, inspectable, and honest. Build the database when the files start to hurt.</p><div><hr></div><p>The practical rule</p><p>The question to start with is not which agent to build. It is what this agent needs to know that should not live only in someone&#8217;s head.</p><p>That moves the work upstream. From generation to memory. From prompting to context.</p><p>The smallest honest test is five steps:</p><ol><li><p>Write the five memory files. Keep them short.</p></li><li><p>Point one agent at them, starting with the daily brief.</p></li><li><p>Make it cite every claim back to a memory item.</p></li><li><p>Check whether it stayed grounded, surfaced the right priorities, and named what it did not know.</p></li><li><p>Ask whether you would run it again tomorrow. If yes, you have a system. If no, you have a demo.</p></li></ol><p>The first agent system is not the one that writes the best answer. It is the one that helps the organization keep what it already learned.</p><p>Once that memory exists, every other agent gets better. The support agent has context. The product agent has priorities. The finance agent has assumptions. The Chief of Staff agent has a company to reason from.</p><p>Without it, agents stay tourists. With it, they can reason from the company instead of the model.</p><div><hr></div><p><em>This is the argument, not the build. The Chief of Staff brief is the experiment I would run next, written in the conditional on purpose. When I run it for real, the scorecard becomes the next post.</em></p><p><em>Related: <a href="https://www.madhunagaraj.com/p/what-developers-get-wrong-about-building">What Developers Get Wrong About Building with AI</a> &#8212; the older argument this one extends. Memory is the moat, not the capability.</em></p>]]></content:encoded></item><item><title><![CDATA[I Wrote a Plan. The Work Steered It.]]></title><description><![CDATA[What steering through one project taught me about how engineering work actually happens once AI is in the loop.]]></description><link>https://www.madhunagaraj.com/p/i-wrote-a-plan-the-work-steered-it</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/i-wrote-a-plan-the-work-steered-it</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 31 May 2026 16:03:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lVck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Disclaimer: The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lVck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lVck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!lVck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!lVck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!lVck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lVck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55752,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/199561293?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lVck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!lVck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!lVck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!lVck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7774713f-95de-4124-814c-1c630fa46fbd_1600x900.heic 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 first plan: PostgreSQL, Redis, ChromaDB, Celery, CrewAI, a hosted model API.</p><p>In the working version: SQLite. No Redis. No ChromaDB. No Celery. No CrewAI. The model SDK, called directly.</p><blockquote><p>The plan wasn&#8217;t wrong. The plan got <em>steered</em>, in real time, by the work, while the work was being done.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kKca!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kKca!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!kKca!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!kKca!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!kKca!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kKca!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47263,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/199561293?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kKca!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!kKca!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!kKca!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!kKca!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87921b0f-5ea5-4d44-9e76-a2fd0cdda3aa_1600x900.heic 1456w" sizes="100vw"></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 my last post I argued that engineering organizations aren&#8217;t adopting AI. The ones that win are rebuilding around it. The constraint shifted from generation to judgment, and the operating model has to follow.</p><p>This is the lifecycle-level companion. What rebuilt looks like from inside one engineer&#8217;s loop. Three shifts I keep watching reshape the work.</p><p>CommsCrew, referenced throughout, is a personal learning lab. A multi-agent communications platform I keep building so I have real code, real mistakes, and real decisions to look at while the model and the ecosystem evolve underneath me. The practice space. The repo is real. The design docs, the dead-branch architecture, the configuration files are all still in there.</p><p>This isn&#8217;t a 10x productivity pitch. It isn&#8217;t an &#8220;AI replaces engineers&#8221; argument. It isn&#8217;t a tool catalog. It&#8217;s three places where the <em>shape</em> of the work changed. Not the speed.</p><div><hr></div><h2>Shift 1: From writing code to designing systems</h2><p>The bottleneck used to be typing. You knew what to build. The question was how fast you could write it.</p><p>Generation is free now. The new bottleneck is design judgment. Knowing what to build, in enough fidelity that an AI agent can produce a correct first pass.</p><blockquote><p>The most valuable work I do now happens in a markdown file before any code gets written.</p></blockquote><p>A concrete number. The Phase 1 activation design in CommsCrew, <code>docs/plans/2026-02-24-phase1-activation-design.md</code>, is 176 lines. It produced a 1,761-line implementation plan. That plan generated thousands of lines of shipped code, across backend endpoints, database migrations, new pages, and a notification system.</p><p>A 176-line markdown file was the lever for the whole thing. The leverage isn&#8217;t in the code. It&#8217;s in the design step.</p><p>Pre-AI, I would have written zero of that doc. I would have opened my editor, started coding, and discovered the design while writing the code. That was the right strategy when typing was the constraint.</p><p>It is the wrong strategy now. Typing isn&#8217;t the constraint. The clarity of intent I can hand to the generator is. A vague brief produces vague output. A precise brief produces shippable output.</p><p>The opening paragraph wasn&#8217;t a hypothetical. The PLAN.md at the root of the CommsCrew repo still lists all six of the original stack choices. The <code>backend/app_new/</code> directory next to it uses none of them.</p><p>Midway through I realized CrewAI was an unnecessary abstraction between me and the model. ChromaDB was overkill for the memory volume I had. Celery was adding deployment surface area for jobs SQLite could handle inline.</p><p>The legacy <code>backend/app/</code> directory is still in the repo. A museum exhibit of the version I built before realizing the stack was wrong. I could rewrite it because rewriting was no longer expensive.</p><p>The proof is one line each, in two files I kept side by side:</p><pre><code><code># backend/app/core/ai_engine/agents/base_agent.py  (legacy)
from crewai import Agent
</code></code></pre><pre><code><code># backend/app_new/crew/base_agent.py  (current)
# the model provider's SDK, called directly
import model_sdk
</code></code></pre><p>A framework dependency disappeared because changing my mind about it stopped being expensive.</p><p>Architecture lock-in used to be a feature of senior engineering. The discipline of not flip-flopping. It is now a liability. The new discipline is <em>staying steerable</em>. When the cost to change your mind drops by an order of magnitude, your decision threshold should drop with it.</p><p>The artifact your senior engineers should produce more of is design. Living design documents that get edited as the work uncovers reality. Not architecture diagrams filed once a quarter.</p><p>The failure mode is using AI to generate faster while designing worse. Teams get an early win, the first feature ships in a third of the expected time, then the second feature has compounding rework because the design didn&#8217;t catch what the first one foreclosed. AI rewards precision in the brief. If you brief vaguely, you waste cycles refactoring the output.</p><p>The work isn&#8217;t ten times faster. It&#8217;s distributed differently. Move the slow part upstream.</p><div><hr></div><h2>Shift 2: From debugging to verifying</h2><p>I used to spend a third of my engineering time tracking down bugs I had written. Typos. Off-by-ones. Missing null checks. State I forgot to thread through three functions.</p><p>Pre-AI, that was just the job. Now AI writes most of the lines, and most of those bugs don&#8217;t happen.</p><p>But a new kind of bug does. Code that <em>looks right</em> and isn&#8217;t. Code that solves a slightly different problem than the one I described. Code that calls an API that doesn&#8217;t exist. Code that compiles but isn&#8217;t actually wired up.</p><p>The job changed from finding my bugs to catching the model&#8217;s confident-but-wrong output.</p><p>This is the most common failure mode in my codebase now. The agent generates a patch that compiles. The tests pass. The bug lives somewhere the tests don&#8217;t reach. A fixture that&#8217;s a copy-paste of an older version with stale assumptions. An assertion that&#8217;s tautological. A mock that doesn&#8217;t match the real service.</p><p>The output looks like the right output. Only end-to-end behavior, or someone reading the diff with suspicion, will catch that it isn&#8217;t.</p><blockquote><p>Generation got cheap. Verification didn&#8217;t.</p></blockquote><p>In CommsCrew the agent system streams responses to the frontend via Server-Sent Events. The hardest bugs I hit weren&#8217;t in any single layer. They lived in the integration between the backend stream, the frontend&#8217;s <code>getReader()</code> loop, and the agent&#8217;s token cadence.</p><p>The unit tests passed. The stream parser passed. The agent passed. The only way to see the actual bug was to run the feature end-to-end, in a browser, while watching the network panel.</p><p>The interesting failures had become invisible to any single layer of tests.</p><p>The interesting bugs now live at boundaries. AI is very good at producing code that satisfies its own immediate context. AI is much worse at producing code that integrates correctly with surrounding code it wasn&#8217;t shown.</p><p>Page-level tests, in-isolation unit tests, and &#8220;it compiled and the linter is happy&#8221; are not sufficient evidence of correctness anymore.</p><p>The 10x engineer is no longer the one who writes the most code. It&#8217;s the one who catches what looks right but isn&#8217;t. That&#8217;s closer to an editor&#8217;s eye than to coding ability. Harder to interview for. Undersupplied in the market.</p><p>The failure mode is trust. Teams that trust the model ship faster for two weeks and break things for the next six months. The velocity gain everyone wants is real, but it materializes only when the verification surface keeps up with the generation surface.</p><div><hr></div><h2>Shift 3: From tools to environments</h2><p>The third shift is the one I think is least appreciated.</p><p>Your IDE used to be a text editor with some plugins. It is now an <em>environment</em>. An agent with persistent memory, scoped permissions, parallel working copies, and tools that reach into your browser, your Slack, your task tracker, your design files.</p><p>The unit of work isn&#8217;t &#8220;I&#8217;m editing this file.&#8221; It&#8217;s &#8220;I&#8217;m in this session with this context.&#8221;</p><p>CommsCrew lives in a worktree-driven development setup. The <code>.agent/settings.local.json</code> file at the repo root lists which tools my AI session is allowed to run unattended. It is, in effect, a CI/CD policy for the agent:</p><pre><code><code>{
  "permissions": {
    "allow": [
      "Bash(*)",
      "Write(*)",
      "Edit(*)",
      "Read(*)",
      "mcp__playwright__browser_navigate",
      "mcp__playwright__browser_take_screenshot",
      "mcp__playwright__browser_click",
      "WebSearch",
      ...
    ]
  }
}
</code></code></pre><p>Pre-AI, &#8220;what is this developer allowed to run&#8221; was a flat boolean. They have a laptop, they can run whatever they want.</p><p>Post-AI, it&#8217;s a real policy question. The agent is running things on your behalf at machine speed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pj-S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pj-S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pj-S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78587,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/199561293?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pj-S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 424w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 848w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 1272w, https://substackcdn.com/image/fetch/$s_!Pj-S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa598afea-a41e-4bf7-a34a-b938f5355f9d_1600x900.heic 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>I&#8217;m writing this blog post in <code>.agent/worktrees/tender-nash-24e072/</code>. A Git worktree that&#8217;s a complete working copy of the CommsCrew repo, isolated from my main branch. Worktrees can live anywhere on disk. I nest agent-spawned ones under <code>.agent/</code> so they&#8217;re scoped to the agent&#8217;s workspace rather than scattered alongside human branches.</p><p>Branches were sufficient for human-paced parallel work. Agents can run multiple tasks in parallel and they need their own filesystems. Shared state across parallel agents is a quiet category of bug.</p><p>The same session that writes Python and TypeScript also drives a Playwright browser to verify the UI. It generates Gamma decks. With the right MCP servers registered it reaches into your task tracker, your design files, your messaging tools. The integration boundary used to be the IDE. Past your editor there were a dozen separate tools you had to context-switch between. The Model Context Protocol collapsed that. The new boundary is the session itself.</p><p>The agent in this session has access to skills, reusable methodologies for specific tasks like brainstorming, debugging, code review, frontend design. It has access to a memory store with the project&#8217;s history, my voice preferences, anti-patterns I&#8217;ve already learned.</p><blockquote><p>Onboarding a new engineer used to be six weeks. Onboarding a new session is thirty seconds.</p></blockquote><p>That isn&#8217;t because the agent is smart. It&#8217;s because the environment carries the context that used to live in someone&#8217;s head.</p><p>The failure mode is treating the environment as a personal-productivity thing. Each engineer rolls their own setup. Nothing is shared. Nothing compounds. After a year you have ten engineers running ten different agent configurations, with ten different trust models, ten different memory stores. None of it scales to the team.</p><div><hr></div><h2>The three shifts compound</h2><p>The shifts aren&#8217;t independent.</p><p>Shift 1 needs Shift 2, because designing more sharply means catching more design-vs-implementation gaps. That catching is verification.</p><p>Shift 2 needs Shift 3, because verification requires the environment to support it. The hooks, the integration tests, the browser automation, the memory of what passed before.</p><p>Shift 3 needs Shift 1, because no environment teaches taste. Only design discipline does.</p><p>Velocity is the wrong frame. It measures the easy thing, code shipped per week, and ignores the compounding thing: judgment per decision, verification per generation, leverage per environment.</p><p>Three questions to ask your team this quarter. Are your senior engineers writing design documents that drive ten times their volume in shipped code? Are you measuring verification quality, what was actually run and observed, rather than output quantity? Is your engineering environment a deliberate choice with shared permissions, shared skills, and shared memory, or is it whatever each engineer set up alone?</p><p>If those three answers are no, you&#8217;re operating on the velocity frame. If they&#8217;re yes, you&#8217;re operating on the model frame.</p><blockquote><p>Both will ship product. Only one will compound.</p></blockquote><div><hr></div><p><em>This is a sequel to <a href="https://www.madhunagaraj.com/p/engineering-orgs-arent-adopting-ai">Engineering Orgs Aren&#8217;t Adopting AI. They&#8217;re Rebuilding Around It</a>, which made the case at the organizational level. The next, if I can find a clean way to say it, is about what hiring and team structure look like once these shifts have run for a year.</em></p>]]></content:encoded></item><item><title><![CDATA[Engineering Orgs Aren't Adopting AI. They're Rebuilding Around It.]]></title><description><![CDATA[Generation is cheap. Judgment is scarce.]]></description><link>https://www.madhunagaraj.com/p/engineering-orgs-arent-adopting-ai</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/engineering-orgs-arent-adopting-ai</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 17 May 2026 06:19:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7glX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Disclaimer: The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.<br></em><br>Most companies did not redesign engineering for AI. They added AI to the same operating model they already had.</p><p>The autocomplete got faster. The pull request summaries got cleaner. The org chart stayed the same.</p><p>That is where the value gets lost.</p><p>McKinsey&#8217;s 2025 Global AI Survey found that 88% of organizations now use AI in at least one business function, but only about a third have begun to scale it operationally. The gap between adoption and operational redesign is where the productivity gains are sitting.</p><p>A smaller group is doing something else. They rebuilt the team around the assumption that AI will write an increasingly large share of the first draft.</p><p>From the outside, the new shape looks strange. Smaller pods. Blurred roles. No multi-quarter roadmaps. Fewer meetings. A different definition of what an engineer does.</p><p>The leaders running them describe it as the future.</p><p>Here is what that org looks like, dimension by dimension.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F6ei!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F6ei!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F6ei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114711,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/198087368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F6ei!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!F6ei!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc85801c9-c19c-4619-b3cc-de0febd33a0d_1920x1080.heic 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>Shape: Flatter, smaller, closer to the code</h2><p>The 8-to-12 person team was designed for a world where humans wrote every line. That world is ending.</p><p>Developer productivity research from DX in early 2026 shows AI-assisted commits climbing as a share of new code each quarter. Public commentary from large tech CEOs echoes the same observation: projects that used to need big teams can now move with one or two engineers and a fleet of agents.</p><p>The new shape is small pods of three to five engineers. High autonomy. Roles that deliberately blur.</p><p>Product managers ship code. Engineers draft copy. Designers prototype in production frameworks. Managers stay close to the work, not floating in a meeting layer above it.</p><blockquote><p>When the cost of producing a working version drops near zero, coordination becomes the dominant tax. You reduce it by removing layers, not by adding ceremonies to manage them.</p></blockquote><h2>Hiring: The bar has moved from speed to judgment</h2><p>The bar has not lowered. It has moved.</p><p>The new bar is not how fast you produce code. It is how reliably you judge it.</p><p>Two profiles are now disproportionately valuable.</p><p>The <strong>creative builder</strong> with deep product sense. The one who can hold the whole user experience in their head and direct AI to build toward it.</p><p>The <strong>deep systems expert</strong>. The one who understands the substrate well enough to catch the subtle failure modes AI introduces.</p><p>Sonar&#8217;s 2026 State of Code Developer Survey, drawing on responses from over 1,100 developers globally, found that 96% do not fully trust the functional accuracy of AI-generated code. That distrust is now a skill, not a personality trait. It is what stops you from shipping the convincing-looking bug AI is so good at producing.</p><p>The highest-leverage growth path now runs through judgment. Engineers who lean into review, design taste, and verification compound the fastest. The career arc did not shrink. It tilted toward the work AI cannot do for you.</p><p>That work has always been the most interesting work.</p><h2>Planning: Just-in-time, not multi-quarter</h2><p>Rigid roadmaps are an artifact of slow execution.</p><p>When a six-week feature ships in days, a twelve-month plan is a guess wearing a confidence interval. Senior tech leaders say the same thing in public: the era of build-it-once-and-forget-it is over.</p><p>The teams that rebuilt plan tightly. They use the freshest information available. They revise constantly.</p><p>They do not abandon strategy. They abandon the idea that strategy must be expressed as a Gantt chart eighteen months out.</p><blockquote><p>The strategic horizon stays long. The commitment horizon shrinks.</p></blockquote><h2>Decisions: Resolved by code, not by whiteboard</h2><p>This is the change that surprises people most.</p><p>In the old model, technical debates were settled in design reviews. Engineers wrote docs. Slack threads sprawled. Opinions piled up. Weeks later, something got built.</p><p>In the redesigned model, when two senior engineers disagree, the answer is the same. Build three versions. Compare real impact. Decide.</p><p>Generate the pull requests. Measure them.</p><p>The cheapest argument is the one you stop having because the artifact is sitting in front of you.</p><p>Most design docs get replaced by prototypes. The ones that survive capture genuinely irreversible architectural decisions. Everything else moves into the build.</p><h2>Shipping: AI generates the first draft, humans own the hard parts</h2><p>AI now generates a rising share of new commits. Leading AI labs have publicly documented multi-agent architectures running in production: parallel agents read the codebase, one writes the implementation, another runs the tests, another reviews the result. All in parallel. All coordinated.</p><p><strong>The engineer&#8217;s role expanded. It did not shrink.</strong></p><p>Engineers now spend more time on the parts of the job AI is bad at. Legal and security constraints. Trust boundaries. System architecture. Product taste. The judgment calls about what should not be built at all.</p><p>The agent is the first-pass implementer. The engineer is the reviewer, the editor, the source of direction.</p><blockquote><p>You are not coding anymore. You are supervising.</p></blockquote><p>That is not a downgrade. It is a promotion most engineers have wanted for years.</p><h2>Source of truth: The code itself</h2><p>Documentation has always lagged reality. The pattern in the redesigned orgs does not patch that gap. It eliminates it.</p><p><strong>The repository is the source of truth.</strong></p><p>A feature spec becomes a checked-in markdown file. Acceptance criteria become testable constraints. Agent instructions live beside the service they govern, in files like AGENTS.md or CLAUDE.md. Schemas, conventions, and architectural guardrails all sit alongside the code they describe.</p><p>When an agent needs to know how something works, it reads the code and the spec together. So does any human.</p><p>Wiki pages that quietly went stale six months ago are not a problem to patch. They are a category to delete.</p><p>The investment shifts. From writing documentation, to structuring the codebase so AI and humans can both navigate it.</p><p>The first is busywork. The second is leverage.</p><h2>Operating principles: AI-ify everything reasonable, kill outdated rituals</h2><p><strong>The most underrated principle in the redesigned playbooks is permission to delete.</strong></p><p>Standups that no longer serve. Status meetings that exist because they have always existed. Approval chains designed for a slower delivery model. Tools that solve problems the team no longer has.</p><p>Rituals do not retire themselves. Someone has to be explicitly empowered to end them.</p><p>The redesigned orgs make that empowerment a stated value, not an act of courage.</p><p>The other half of the principle is that everyone uses the tools. Not &#8220;engineers have access to a coding assistant.&#8221; Everyone.</p><p>Product managers prompt agents to draft specs. Designers generate prototypes in code. Recruiters automate screening. Legal teams summarize contracts.</p><p>The goal is not democratized AI literacy as an HR initiative. It is a shared operating fluency that lets the whole org move at the speed the tools allow.</p><h2>Measurement: Cycle time, quality, reliability, failure rate. Not lines of code.</h2><p>Old metrics were proxies for output in a world where output was scarce. Lines of code. Commits per week. Story points.</p><p>None of these survive contact with AI-generated work.</p><p>Developer productivity research shows teams now merge far more pull requests, each far larger than before. Volume metrics are meaningless.</p><p>The teams that rebuilt measure what actually matters.</p><p>How long for a new engineer to become productive. How long from PR opened to PR merged. The change failure rate. How often a deploy causes an incident.</p><blockquote><p>The new metrics describe whether the system is healthy. The old ones described whether people were busy.</p></blockquote><p>A new category of developer tooling now tracks AI-generated code attribution, agent effectiveness scores, and where agents are struggling in the codebase. The signal moved from individual productivity to organizational readiness for agentic delivery.</p><h2>The bottleneck has shifted</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l1tr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l1tr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l1tr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/faeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83801,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/198087368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l1tr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!l1tr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaeb5edd-4652-4df3-badc-a5aaf254450e_1920x1080.heic 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>Here is the underlying insight. The one that explains everything above.</p><p>For thirty years, the constraint on shipping software was generation. We did not have enough engineers, or fast enough engineers, or organized enough engineers, to produce the volume of code the business wanted.</p><p>Most of the practices that define modern engineering organizations were optimized to relieve that constraint. Sprint planning. Code review. Hiring funnels. All of it.</p><p><strong>That constraint is gone.</strong></p><p>The new constraint is <strong>judgment</strong>. <strong>Taste</strong>. <strong>Verification</strong>.</p><p>It is the ability to look at fifty pull requests an agent generated last night and decide which three are worth merging, and why.</p><p>It is knowing what should not be built.</p><p>It is catching the subtle architectural drift AI introduces, because AI does not know what the system is supposed to feel like in five years.</p><p>Researchers have named this the engineering productivity paradox. Massive volumes of AI-generated code creating new technical debt. The work moving from creation to verification. A 2026 ICSE paper by Kohl and Carro, <em>When Code Becomes Abundant</em>, makes the same argument: the discipline must redefine itself around orchestration and verification, not production.</p><p>The Pragmatic Engineer&#8217;s 2026 AI tooling survey, with over 900 responses, found the same trust gap. A majority say AI produces code that looks correct but is unreliable. Trust dropped year over year even as adoption surged past 80%.</p><p><strong>The verification gap is real. It is widening.</strong></p><p>Organizations pulling ahead are not pushing more code through an unchanged pipeline. They are redesigning the pipeline around the new constraint.</p><p>Smaller pods. More autonomy. Less ceremony. More verification. Sharper judgment. A bet that taste, product sense, and verification skills compound over time.</p><p>McKinsey&#8217;s follow-on reporting is direct: leading AI-driven software organizations are seeing 16 to 30% faster time to market and 31 to 45% higher software quality than their peers.</p><p>Those gains come from teams that rebuilt, not teams that bolted AI on.</p><p>The transition is not a tooling rollout. It is an operating model change.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7glX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7glX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!7glX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!7glX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!7glX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7glX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109953,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/198087368?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7glX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 424w, https://substackcdn.com/image/fetch/$s_!7glX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 848w, https://substackcdn.com/image/fetch/$s_!7glX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 1272w, https://substackcdn.com/image/fetch/$s_!7glX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbccef656-b97c-48c2-9f22-0d5e384e46e5_1920x1080.heic 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><blockquote><p>Generation is cheap. Judgment is scarce. The engineering org that wins this decade is the one redesigned around that truth.</p></blockquote><div><hr></div><h2>Sources and further reading</h2><ul><li><p><strong>McKinsey, </strong><em><strong>The State of AI 2025: Agents, Innovation, and Transformation</strong></em> &#8212; AI adoption and scaling rates across 1,993 respondents in 105 countries. <a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai">mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai</a></p></li><li><p><strong>Anthropic: Running an AI-native engineering org</strong></p><div id="youtube2-igO8iyca2_g" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;igO8iyca2_g&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/igO8iyca2_g?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></li><li><p><strong>Sonar, </strong><em><strong>2026 State of Code Developer Survey</strong></em> &#8212; 1,149 developers globally; the 96% trust gap; the &#8220;vibe, then verify&#8221; pattern. <a href="https://www.sonarsource.com/the-state-of-code/developer-survey-report/">sonarsource.com/the-state-of-code/developer-survey-report</a></p></li><li><p><strong>The Pragmatic Engineer, </strong><em><strong>AI Tooling for Software Engineers in 2026</strong></em> &#8212; 906 respondents; 95% weekly AI use; Claude Code overtakes Copilot. <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026">newsletter.pragmaticengineer.com/p/ai-tooling-2026</a></p></li><li><p><strong>DX, </strong><em><strong>Developer Productivity Research (2026)</strong></em> &#8212; AI code attribution, agent experience scoring, AI-assisted commit share. <a href="https://getdx.com/">getdx.com</a></p></li><li><p><strong>Stack Overflow, </strong><em><strong>2025 Developer Survey</strong></em> &#8212; broad AI adoption, trust dynamics, daily frustrations. <a href="https://survey.stackoverflow.co/2025/">survey.stackoverflow.co/2025</a></p></li><li><p><strong>Deloitte, </strong><em><strong>Tech Trends 2026</strong></em> &#8212; shift from project to product, redesigning engineering for AI. <a href="https://www2.deloitte.com/us/en/insights/focus/tech-trends.html">deloitte.com/insights/tech-trends</a></p></li><li><p><strong>Kohl &amp; Carro, </strong><em><strong>When Code Becomes Abundant: Redefining Software Engineering Around Orchestration and Verification</strong></em><strong> (ICSE-FoSE 2026)</strong> &#8212; the academic case for the shift. <a href="https://arxiv.org/abs/2602.04830">arxiv.org/abs/2602.04830</a></p></li><li><p><strong>Adevinta Engineering, </strong><em><strong>A pragmatic evaluation of software engineering AI tooling</strong></em><strong> (March 2026)</strong> &#8212; real enterprise pilot data on Cursor, Claude Code, Copilot. <a href="https://adevinta.com/techblog/a-pragmatic-evaluation-of-software-engineering-ai-tooling/">adevinta.com/techblog</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Skills to Survive the AI Wave ]]></title><description><![CDATA[A collection of thoughts on what actually matters]]></description><link>https://www.madhunagaraj.com/p/skills-to-survive-the-ai-wave</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/skills-to-survive-the-ai-wave</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sat, 18 Apr 2026 19:23:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OlCn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What follows is a collection of thoughts. Some my own, some picked up from people I&#8217;ve learned from and internalized over time. This isn&#8217;t a framework I invented. It&#8217;s my version, shaped by doing, failing, rebuilding, and paying attention.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OlCn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OlCn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 424w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 848w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 1272w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OlCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic" width="1456" height="999" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:999,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182948,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/194632692?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OlCn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 424w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 848w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 1272w, https://substackcdn.com/image/fetch/$s_!OlCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0096e404-ca26-4b12-b3a9-153845eec1cb_2194x1506.heic 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><div><hr></div><p>Humans became humans. We gained the ability to evolve, without inventing evolution itself. We didn&#8217;t invent AI in isolation. It is, in itself, a product of our evolution.</p><p>Evolution happened to us, through us, and eventually because of us. AI is the latest chapter. It&#8217;s what happens when a species built on learning and adapting does what it&#8217;s always done: builds the next thing.</p><p>I keep coming back to a question that feels more relevant every month: what skills make us irreplaceable in a world we ourselves created?</p><h2>1. Critical Thinking</h2><p>AI can deconstruct logic better than most humans. But it cannot choose. It provides the how, but it can never provide the why.</p><p>Critical thinking in the AI age isn&#8217;t about out-calculating the model or just checking for hallucinations. It&#8217;s about knowing which problems are worth solving and being accountable for the direction you take. It&#8217;s knowing when the model is technically right but contextually wrong. It&#8217;s the willingness to look at a perfectly optimized AI output and say, &#8220;This is logical, but it&#8217;s not the direction we&#8217;re taking.&#8221;</p><p>AI sounds confident whether it&#8217;s right or wrong. It&#8217;s easy to accept an output you shouldn&#8217;t because it&#8217;s well-written and sounds authoritative. I&#8217;ve done it myself. The models will keep getting better. But the need for someone who can look at what comes back and say &#8220;this doesn&#8217;t hold up&#8221; isn&#8217;t going away.</p><blockquote><p><strong>The AI handles the processing. You handle the intent and the final decision. And before any of that, you need to learn to ask the right questions. That in itself requires critical thinking.</strong></p></blockquote><div><hr></div><h2>2. Learn to Learn Fast</h2><p>The model I was using six months ago already feels like a different era.</p><p>You can&#8217;t learn the old way anymore. You can&#8217;t take a course, spend three months going deep, and expect that knowledge to hold. By the time you&#8217;re done, the landscape has moved.</p><p>I&#8217;ve started thinking about this more like a startup. You learn just enough to act. You ship something. You get feedback. You pivot. But the reason you can move that fast is because you&#8217;ve gone deep on first principles. You don&#8217;t need to relearn how systems scale or how users think. You only need to learn how the new tool applies those fundamentals.</p><blockquote><p><strong>The people doing well right now aren&#8217;t just the most knowledgeable. They&#8217;re the fastest learners with the strongest foundations. They get their footing in days because they recognize the underlying patterns, and figure out the rest as they go.</strong></p></blockquote><div><hr></div><h2>3. Adaptability</h2><p>Models are changing fast. Capabilities are growing almost exponentially. If you&#8217;re feeling the pressure, that&#8217;s real.</p><p>But at some point it becomes normal. Every major shift in history felt exactly like this during the transition. There is always a new normal forming, and the space between the old one and the new one is chaotic and uncomfortable. That&#8217;s what a phase shift feels like from the inside.</p><p>Think about food delivery. Remember the first time you ordered on your phone? Fumbling with payment, wondering if it would even show up. It felt clunky. Unnecessary. Now you don&#8217;t think about it. It&#8217;s muscle memory.</p><blockquote><p><strong>AI is on the same trajectory, just at a much larger scale. The friction you feel today is temporary. The capability it gives you is permanent. The only thing that holds you back is choosing not to move with it.</strong></p></blockquote><div><hr></div><h2>4. Be Resourceful</h2><p>I&#8217;ve believed this long before AI. Resourcefulness beats resources.</p><blockquote><p>The best people I&#8217;ve worked with don&#8217;t wait for perfect conditions or a complete instruction manual. They look at what they have, right now, and make it work.</p></blockquote><p>AI amplifies this. You have access to capabilities that would have required entire teams five years ago. But the tool doesn&#8217;t matter without the instinct to just use it. To hack things together. To ship the imperfect version and improve it live.</p><div><hr></div><h2>5. Develop Taste</h2><p>This is something I think about a lot.</p><blockquote><p><strong>AI can produce a thousand options in minutes. It cannot tell you which one is good. It cannot feel the difference between something technically correct and something that resonates.</strong></p></blockquote><p>Taste is knowing when the output is 80% there and what the missing 20% is. You build it by looking at what AI produces, then looking at what a master in that domain produces, and studying the gap. Sometimes it&#8217;s a choice of structure. Sometimes it&#8217;s knowing what to leave out. You learn to see that gap clearly, not just in aesthetics but in logic and reasoning.</p><p>A single training run costs millions. The person who knows which experiment to run, which hypothesis is worth that investment, which architecture choice will compound and which will waste a quarter of compute, that person is the most valuable in the room. Not because they can execute. Everyone can execute. Because they know what&#8217;s worth executing.</p><blockquote><p><strong>In an agentic world, taste is also about designing the right constraints. AI can generate infinite paths. The person with taste knows which guardrails create a masterpiece and which ones create a mess.</strong></p></blockquote><div><hr></div><h2>6. Build Your Own Workflow</h2><p>Everyone has access to the same models, the same tools, the same plugins. The edge isn&#8217;t what you use. It&#8217;s how you use it.</p><p>The people getting the most out of AI right now aren&#8217;t following someone else&#8217;s playbook. They&#8217;ve built their own. Experimented, failed, iterated, and arrived at a system that fits the way they think and work.</p><blockquote><p><strong>There is no universal best workflow. Only the one you&#8217;ve built, tested, and refined through doing.</strong></p></blockquote><div><hr></div><h2>7. Don&#8217;t Just Chat. Build.</h2><p>The biggest mistake I see is treating AI like a novelty. Asking it trivia, generating images, having interesting conversations. Fine for day one. If that&#8217;s still all you&#8217;re doing on day ninety, you haven&#8217;t started.</p><div class="callout-block" data-callout="true"><p>The real shift happens when you use AI to solve actual problems. Automate something in your work. Build a workflow that saves you an hour a day. Work with an outcome in mind. Not &#8220;let me see what this says&#8221; but &#8220;I have a problem, and I&#8217;m going to use AI to solve it.&#8221;</p></div><div><hr></div><p>I&#8217;ll end with something personal.</p><p>I started my career as an engineer, then drifted into product, became a domain SME. At some point I realized I had strayed too far from tech. Things had moved on, and I had to go back and learn to be an engineer again. That restart wasn&#8217;t easy. But the path was shorter than I expected because I had the basics. Curiosity kicked back in. I rose back up to architect, then into tech leadership and tech strategy, eventually gaining broader knowledge across every corner of tech I could get into.</p><p>Then AI happened. Back to the drawing board. Back to being a builder again. Curious all over again. The initial learning was tough, same cycle as every other restart, but even shorter this time. I had to learn to incorporate AI into every workflow, first in tech, then in business and strategy, and figure out what value this could bring and how we solve real problems with this new technology.</p><p>But here&#8217;s what I&#8217;ve learned from doing this more than once: every time you restart, it gets easier. The time gets shorter. The basics you built before don&#8217;t disappear. They compound. New things click faster because you already have a foundation. That&#8217;s the compounding effect. It&#8217;s real, and it works in your favor the moment you decide to start.</p><p>I spent hours reading papers, experimenting with models, breaking things, trying to separate real from hype. And because I started early, I can now keep pace with changes that would have buried me otherwise.</p><blockquote><p>Stay open to learning. The opportunities follow. They always find the people who are ready.</p></blockquote><div><hr></div><h2><strong>We didn&#8217;t invent evolution. But we&#8217;ve never once failed to evolve.</strong></h2><div><hr></div><div class="callout-block" data-callout="true"><p><em>The age of AI doesn&#8217;t reward the person with the most answers. It rewards the one with the best taste, the highest learning velocity, and the most resilient workflow.</em></p></div><div class="pullquote"><p>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</p></div>]]></content:encoded></item><item><title><![CDATA[The Agentic Mindset]]></title><description><![CDATA[How to make yourself 10x with AI.]]></description><link>https://www.madhunagaraj.com/p/the-agentic-mindset</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/the-agentic-mindset</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sat, 11 Apr 2026 14:12:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f1270144-a20b-46a0-a16f-bb76b42f5119_2400x2302.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I missed something that mattered to someone I care about because I forgot to put it on the calendar.</p><p>It was in a text message. I was heads-down on something else. By the time I remembered, it was too late. You know the feeling. It stays with you.</p><p>I didn&#8217;t have a system. I had intentions. I had apps. I had to-do lists I reorganized every Sunday, a ritual that made me feel productive without actually making me productive.</p><p>I&#8217;ve been using AI for a long time. When agentic AI started becoming real, I started using it as a thinking partner for research, planning, working through ideas. That changed how I think. It brought clarity to how I approach problems. I&#8217;m still figuring things out, but the trajectory is clear.</p><p>Over time I layered more on. A weekend coaching ritual. A research workflow. Each started as an experiment. Each stuck because it solved something real.</p><p>Then last week I connected NanoClaw, a lightweight open-source personal AI agent, to a Google Calendar MCP server. Set it up on a Mac Mini. Named the agent Jarvis. Now my family schedules appointments by messaging WhatsApp.</p><p>I used Claude Code to set up NanoClaw. An AI agent helped me configure another AI agent. The system was proving the thesis before it was even running.</p><p>That&#8217;s when something shifted. I wasn&#8217;t reaching for AI anymore. I was surrounded by it. Calendar, briefings, research, coaching, planning, all running through interfaces I already use every day. WhatsApp for family. Slack for reading what AI prepares for me. Google Tasks for what needs to get done.</p><p>I&#8217;ve started calling it the agentic mindset. Not using AI as a tool you pick up. Living with AI as a partner that&#8217;s always running.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sf6N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sf6N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 424w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 848w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 1272w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sf6N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic" width="1456" height="1397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1397,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:148185,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/193889765?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Sf6N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 424w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 848w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 1272w, https://substackcdn.com/image/fetch/$s_!Sf6N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61659082-cc44-4284-8005-5c30e4a196a7_2400x2302.heic 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></p><div><hr></div><p>I get curious about things. How multi-agent systems actually work. Whether the premise that specialized agents outperform a single generalist holds up in practice. How orchestration patterns from a research paper translate into real code.</p><p>This used to come with a cost. Fifteen tabs open. A paper too dense to finish. Jargon that loses me by page three. I have a bookmarks folder called &#8220;Read Later&#8221; with over 200 links in it. I&#8217;ve read maybe twelve.</p><p>The cost of exploring was high enough that I mostly didn&#8217;t. Which means I was operating on what I already knew, not what I could know.</p><p>Here&#8217;s a specific example. I found a paper on arXiv called &#8220;The Orchestration of Multi-Agent Systems.&#8221; Dense, academic, full of formal notation. Old me would have bookmarked it and moved on. Instead, I dropped it into an AI conversation and asked for a structured breakdown: what&#8217;s the core framework, what are the seven orchestration responsibilities, and what would it take to build this.</p><p>AI broke it down in minutes. I understood the architecture. Then I built it. Three agents, a deterministic orchestrator, real flight data. 1,500 lines of Python. I raced the multi-agent system against a single agent across three cities and found that multi-agent only wins when the search space is large enough that focused attention finds what divided attention misses. I published the whole thing on my Substack.</p><p>The arc from &#8220;interesting paper&#8221; to &#8220;working code&#8221; to &#8220;published essay&#8221; happened in a fraction of the time it would have taken before. That&#8217;s the shift. <strong>AI didn&#8217;t do the thinking for me. It removed the friction that used to stop me from thinking at all.</strong></p><div><hr></div><p>I have tried every productivity system. GTD. The 3-2-1 method. Time blocking. Pomodoro. Bullet journals. Each one works for a week, maybe two, then falls off. Not because the method is bad. Because there&#8217;s no one on the other side keeping me honest.</p><p>So I built an AI coach. I gave it my weekends.</p><p>Every weekend, twenty minutes. What got done around the house, what I promised my family, what I kept putting off for myself. The side project I said I&#8217;d start. The reading I never got to. The errand that&#8217;s been on the list for three weeks. Then we plan the next week around what actually matters to the people in my life, including me. It doesn&#8217;t list my tasks. It challenges me.</p><p>&#8220;You said you&#8217;d start that project three weekends ago. What&#8217;s actually stopping you?&#8221;</p><p>&#8220;You have a free Saturday morning. Are you protecting it or letting it fill up?&#8221;</p><p>&#8220;Is this actually important to you or are you avoiding the harder thing?&#8221;</p><p>By Sunday evening I&#8217;ve already thought about the week. I know what matters. I start Monday in motion, not scrambling.</p><div><hr></div><p>I used to miss appointments because every one required a context switch. Leave WhatsApp, open the calendar app, type the details, go back. The real cost was never the thirty seconds. It was that my brain left whatever I was doing. Every time I thought &#8220;I&#8217;ll add that later,&#8221; it became one more thing occupying mental RAM.</p><p>Now I message Jarvis on WhatsApp. &#8220;There&#8217;s an appointment on April 14 at Chandler. Add that to the family calendar.&#8221; Jarvis confirms, adds it, asks if I know the time. Done. My brain never leaves the conversation.</p><p>My whole family uses the same system. Anyone can message Jarvis, ask what&#8217;s happening this weekend, add something. One shared calendar. No bottleneck.</p><p>Jarvis also nudges. Tax filing deadline coming up? &#8220;April 15 is 13 days away, have you carved out time to file yet?&#8221; I didn&#8217;t ask for that. Jarvis knew it mattered.</p><p>Every morning, Jarvis drops a news summary into WhatsApp. Three to five items. This morning: a cybersecurity model finding thousands of zero-day vulnerabilities, a major revenue milestone at Anthropic, Google releasing a new open-source model. Two minutes to read. Caught up before my coffee was done.</p><div><hr></div><p>These pieces feed each other. That&#8217;s the part I didn&#8217;t expect.</p><p>The weekend coaching review looks at my Google Tasks and calendar, finds the open gaps where real thinking can happen, and helps me protect them before the week fills up. The briefings keep me informed without consuming my morning. The research partner accelerates my learning without the tab-explosion. The calendar handles the logistics without the context switching.</p><p>None of this is about getting more done. It&#8217;s about creating space to think.</p><p>During a recent weekend review, my AI coach pointed out that I&#8217;d committed to writing three times in the past month but only followed through once. I hadn&#8217;t noticed the pattern. I thought I was busy each time. But seeing it laid out, three commitments, one delivery, I realized I wasn&#8217;t protecting time for writing. I was hoping time would appear. The next week I blocked two hours on Sunday morning before anything else. That&#8217;s where this essay came from.</p><p>Before all of this, I spent roughly an hour a day on operational overhead: scrolling for news, managing calendars, reorganizing task lists, trying to remember what I was supposed to focus on. Now that&#8217;s down to minutes. The hour didn&#8217;t disappear. It turned into thinking time. Over a month, that&#8217;s thirty hours back. Not for more tasks. For clarity.</p><div><hr></div><p>Since I started, Jarvis has quietly grown. (The name is a clich&#233;, I know. But when your family already calls it Jarvis, you stop fighting it.) It reads photos now, so my family can send receipts and they land in Notion automatically. It transcribes voice notes locally, so the kids can talk to it without typing. It runs a small local model alongside Claude for the cheap tasks, which cut my costs without cutting quality. And last week I added something that still surprises me: a meta-tool that lets Jarvis build its own tools on the fly. When someone asks for something it can&#8217;t do yet, a weather lookup, a currency conversion, it finds an API, writes itself a tool, tests it, and uses it. Next time anyone asks, the tool is already there. I didn&#8217;t build any of those capabilities. Jarvis did.</p><p>It also breaks. The meta-tool once hallucinated an API endpoint that didn&#8217;t exist, built a tool around it, and confidently returned wrong weather data for a week before anyone noticed. A container crashed mid-calendar sync and duplicated every event for a Tuesday. The plumbing I described earlier isn&#8217;t a one-time cost. It&#8217;s ongoing. Things fail, and when they fail quietly, you don&#8217;t find out until someone shows up to the wrong appointment.</p><p>That&#8217;s the honest version of &#8220;it keeps building itself.&#8221; It keeps building itself, and sometimes it builds the wrong thing. The system is not finished. I&#8217;m not sure it ever will be. That might be the point.</p><div><hr></div><p>A few things I want to be honest about.</p><p>The plumbing took grit. WhatsApp API configuration, MCP server setup, container permissions. If you&#8217;re comfortable in a terminal, the barrier is surprisingly low for what you get back. If you&#8217;re not, this is a weekend project with some frustration built in.</p><p>NanoClaw runs on the Claude Agent SDK, so there&#8217;s a dependency on Anthropic. The codebase is small enough to adapt, and people have swapped in other models, but I want to be straightforward about that.</p><p>It&#8217;s not free. API calls cost money. But there&#8217;s no monthly subscription to a platform that owns your workflows. The cost scales with usage, and the system is yours to modify.</p><p>The agent logic runs on my home hardware. My Mac Mini, my house. It connects to services I already use and trust: Google Calendar, WhatsApp, Claude&#8217;s API. There&#8217;s no additional third-party collecting my family&#8217;s data in between. I chose the services. I control the wiring. In 2026, there&#8217;s a particular peace of mind in knowing your family&#8217;s WhatsApp messages aren&#8217;t sitting in some startup&#8217;s database, training the next model.</p><div><hr></div><p>Everything I&#8217;ve described here, I figured out for myself. One person. My own friction points.</p><p>What I keep thinking about is what happens when more people operate this way. The same patterns, briefings, coaching, removing friction, applied beyond one person. The implications are massive. I&#8217;ll write more about that.</p><p>If you want to start without building anything: every Saturday or Sunday, spend twenty minutes with any AI reviewing your week. What you planned, what actually happened, what you&#8217;re carrying forward. Do this for four weekends. The pattern recognition alone will change how you operate.</p><div><hr></div><p>I started by missing something that mattered. I ended up rethinking how I learn, how I stay focused, and how I spend my days.</p><p>The question isn&#8217;t whether AI can do this. It can. Today.</p><p><strong>The question is who you become when you stop managing your life and start designing it.</strong></p><div><hr></div><p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p>]]></content:encoded></item><item><title><![CDATA[The Agent Cost Stack]]></title><description><![CDATA[What it actually costs to run an AI agent in production.]]></description><link>https://www.madhunagaraj.com/p/the-agent-cost-stack</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/the-agent-cost-stack</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 05 Apr 2026 08:30:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!H0Ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>2026 is the year AI agents have to prove ROI. The prototypes shipped. Now the question is whether these things actually pay for themselves at scale.</p><p>I did a deep research dive into the economics. I expected the story to be about expensive tokens and infrastructure bills. It is not. The story is about a trap.</p><p>Everything that makes agents cheaper to build is making them more expensive to run.</p><p>I am calling it the Deflation Trap. It runs through every layer of what I have been mapping as the Agent Cost Stack.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H0Ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H0Ne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 424w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 848w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 1272w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H0Ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic" width="1422" height="1388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1388,&quot;width&quot;:1422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75145,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.madhunagaraj.com/i/193236912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H0Ne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 424w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 848w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 1272w, https://substackcdn.com/image/fetch/$s_!H0Ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9b61bf-29ee-4a71-8f5d-8ca1d908fe4a_1422x1388.heic 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><div><hr></div><h2>The Jevons Layer</h2><p>Per-token costs have dropped roughly 1,000&#215; in three years. GPT-3-equivalent inference fell from $60 to $0.06 per million tokens. The decline runs at roughly 10&#215; per year, faster than Moore&#8217;s Law.</p><p>And yet total AI spending surged 320% in 2025. Average enterprise LLM spending nearly tripled from $2.5 million to $7 million per company.</p><p>This is Jevons paradox applied to intelligence. When inference gets cheaper, usage does not stay flat &#8212; it explodes. Agentic workflows with dozens of reasoning steps per task. AI on every customer interaction. Use cases that were uneconomical last quarter become default this quarter. Demand is super-elastic.</p><p>The math of agentic loops makes it concrete. Agents operate in multi-turn reasoning where every turn reprocesses the entire conversation history. Turn 10 costs 10&#215; what a single generation does. Cumulative spend across 10 turns is 55&#215;. Reasoning models generating thousands of internal thinking tokens can require up to 100&#215; more compute than a single pass. One complex agentic task can burn $5&#8211;$8 in inference alone.</p><p>Mitigations exist. Context caching from major providers cuts input costs 75&#8211;90%. Model routing &#8212; sending most queries to cheap models and only complex ones to frontier &#8212; cuts costs 35&#8211;85%. Semantic caching reduces redundant calls 20&#8211;73%. These make the growth curve manageable. They do not flatten it.</p><p>The cheaper the tokens get, the more tokens get used.</p><div><hr></div><h2>The Infrastructure Layer</h2><p>The floor has collapsed. Serverless vector databases start under $25 a month. Object-storage-first options run at $70 per terabyte versus $1,600&#8211;$3,600 for RAM-based incumbents. Production RAG systems have been documented running for under $10 a month.</p><p>The $7,000&#8211;$21,000 monthly figure in enterprise analyses reflects enterprise procurement, not technical necessity. The actual range by agent complexity:</p><ul><li><p><strong>Simple FAQ or support bot:</strong> $50&#8211;$500/mo</p></li><li><p><strong>RAG-based knowledge agent:</strong> $200&#8211;$2,000/mo</p></li><li><p><strong>Multi-step agent with tool calling:</strong> $500&#8211;$5,000/mo</p></li><li><p><strong>Enterprise multi-agent system with compliance:</strong> $5,000&#8211;$30,000/mo</p></li></ul><p>A collapsed floor means more projects get greenlit. More projects get greenlit means more production systems to maintain. The infrastructure cost per agent went down. The total infrastructure bill went up.</p><p>The trap here is premature optimization &#8212; architecting for scale that does not exist yet. Know the actual volume before committing to architecture.</p><div><hr></div><h2>The Drift Layer</h2><p>This is the layer most teams underestimate because it does not show up in a pricing calculator.</p><p>Agents are nondeterministic. A demo that works 80% of the time is impressive. A production system that fails 20% of the time is a liability. And agents drift. Prompt behavior decays. Model providers ship silent updates that change output quality. In long-lived sessions, system prompts receive roughly 1% of attention weight in large context windows, causing agents to gradually ignore their own instructions. Retrieval accuracy drops 15&#8211;30% as context stretches.</p><p>Budget 10&#8211;20 hours of engineering time per month on prompt tuning and behavior testing. That is $1,000&#8211;$2,500 a month per agent. This cost holds regardless of how cheap the tokens get. Automated evaluation frameworks agree with human judgment at only fair-to-moderate levels &#8212; they are force multipliers for human review, not replacements.</p><p>The cost here is not compute. It is attention. Human attention to a system that will not stay where you put it.</p><div><hr></div><h2>The Migration Layer</h2><p>Between early 2025 and early 2026, major providers executed 15+ distinct model deprecation events. Major agent frameworks shipped multiple architecturally breaking versions. A survey of 1,837 engineering leaders found that 70% of regulated enterprises rebuild their agent stack every three months or faster.</p><p>AI coding tools make individual migrations 10&#8211;20&#215; faster. But migrations now happen quarterly instead of annually. Total maintenance spend stays stubbornly similar. The composition shifts from manual labor to AI tooling costs plus expanded review cycles. And the productivity gains themselves may be illusory: METR&#8217;s randomized controlled trial found that experienced developers using AI coding tools perceived themselves as 20% faster but were actually 19% slower on real-world tasks &#8212; a 39-point perception gap. If the tool that is supposed to make migrations cheap is not actually making them faster, the math gets worse.</p><p>This is where the trap is most visible. More gets built on shifting ground because teams believe AI tools make it cheap to migrate. The per-migration cost feels lower. The number of migrations rises. Net cost: flat at best. Net complexity: up.</p><p>The defense: architect for replaceability from day one. Abstract the model layer. Budget 1&#8211;2 model migrations per year, each consuming 1&#8211;2 engineering weeks.</p><div><hr></div><h2>The Governance Layer</h2><p>The EU AI Act is enforced starting August 2, 2026. It is real. But the cost most teams should worry about is not compliance &#8212; it is paralysis.</p><p>The Act uses a risk-tiered structure. The heavy burden risk management systems, conformity assessments, documentation maintained for ten years applies exclusively to high-risk systems under Annex III: HR screening, credit scoring, healthcare decision support, law enforcement. Only 5&#8211;15% of AI systems qualify. Annual compliance costs for those: roughly &#8364;29,000 per system. A Jira summarizer, a customer support bot, an internal knowledge agent none of these are high-risk.</p><p>Minimal-risk systems face no specific obligations beyond AI literacy. Limited-risk systems, including chatbots and virtual assistants, face only transparency requirements. One requirement is non-negotiable across all tiers: Article 50 requires that any system interacting with people discloses it is AI. A disclosure banner. A first-message label. Low-cost design change, easy fine if you miss it. Bake it in from day one.</p><p>The real governance cost for most teams is not the regulation &#8212; it is the months of delayed launches while legal reviews whether a low-risk agent needs high-risk treatment. If you are building in Annex III domains, budget for governance. If you are not, do not let regulatory anxiety kill a high-ROI project.</p><p>On the US side, govern agents with the same access controls you apply to employees. That principle holds regardless of jurisdiction.</p><div><hr></div><h2>The Pattern</h2><p>The cost stack varies by an order of magnitude depending on agent complexity. A support bot on serverless can run for a few hundred dollars a month. An enterprise multi-agent system with compliance can run $20,000+. But the 65&#8211;75% operational share holds across both. The absolute numbers change. The ratio does not.</p><p>Every reduction in the cost of building creates more systems that need the expensive work of running. Tokens get cheaper, so architectures consume more. Infrastructure gets cheaper, so more projects ship. Migrations get cheaper per instance, so they happen more often.</p><p>Klarna learned this the hard way. The build was a success story. The run was an overcorrection that required hiring humans back. The long tail of nuanced, high-empathy interactions, refund disputes, billing confusion, frustrated customers who needed to feel heard, could not be cost-optimized away. The agent was not the problem. The budget that ignored the run was.</p><div><hr></div><h2>What to Do Before You Build</h2><p>Five things to budget for before writing the first prompt:</p><ol><li><p><strong>Model the run cost, not the build cost.</strong> If 65&#8211;75% of your total spend will be operational, your business case should be mostly about ops &#8212; not the sprint to ship.</p></li><li><p><strong>Measure your actual token volume before optimizing.</strong> Context caching and model routing are powerful, but premature optimization is its own cost. Know the volume first.</p></li><li><p><strong>Budget human hours for drift.</strong> 10&#8211;20 hours per agent per month. Automated evals help. They do not replace the human in the loop.</p></li><li><p><strong>Abstract the model layer on day one.</strong> You will migrate at least twice a year. Make it a configuration change, not a rewrite.</p></li><li><p><strong>Classify your risk tier early.</strong> Five minutes with the Annex III list can save months of legal review. If you are not high-risk, move.</p></li></ol><p>Every efficiency in building is a tax on running. The only way through the Deflation Trap is to budget for the run before you start the build.</p><div><hr></div><p><em>The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.madhunagaraj.com/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! 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[Multi-Agent AI Is Slower, Costlier, and Sometimes Finds Better Answers]]></title><description><![CDATA[I built three AI agents to plan a trip and raced them against one.]]></description><link>https://www.madhunagaraj.com/p/multi-agent-ai-is-slower-costlier</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/multi-agent-ai-is-slower-costlier</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 29 Mar 2026 07:07:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8Et7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Disclaimer: The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><p>The premise came from a research paper. &#8220;The Orchestration of Multi-Agent Systems&#8221; provides a framework for building coordinated AI systems, and it cites a motivating claim: distributed collectives of smaller, specialized agents often outperform a single all-purpose deployment. Instead of one AI doing everything, you break the problem into parts, give each part to a specialist, and coordinate them through an orchestrator.</p><p>It sounds right. The way a hospital works. The way an engineering team works. Specialization plus coordination equals better outcomes.</p><p>But sounding right is not the same as being right.<br><br>So I tested it.</p><p>Three agents. One finds flights and hotels. One builds the itinerary. One tracks the budget. A deterministic Python orchestrator coordinates them, enforces budget gates, and controls what each agent can see. Real flight prices from web search, not training data. About 1,500 lines of Python, no frameworks, every design decision visible. The point was to understand orchestration by building it.</p><p>The paper formalizes orchestration as seven responsibilities planning, policy, execution, control, state, knowledge, and quality, each mapping to a method or component in the code. The five most important:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;8fe52f92-feb7-437c-87a6-71bb5c19a45d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">class Orchestrator:
    def plan(self, goal) -&gt; list[Task]:       # Pi: decompose the goal
    def check_policy(self, category, price):   # Phi: enforce constraints
    def _execute_task(self, task, agents):      # E: dispatch to agents
    def _prefetch_search_data(self):           # K: fetch real prices
    def _assemble_plan(self) -&gt; TripPlan:      # Q: validate and assemble</code></pre></div><p>The most important design decision is what each agent can see. One shared notebook, three different windows into it. The notebook is a Pydantic model with a <em>get_view</em> method the paper&#8217;s observation function that returns a typed dataclass per agent.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;2e0524fb-1296-4f55-ba26-8954b8839610&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">class SharedNotebook:
    def get_view(self, agent_name) -&gt; ScoutView | PlannerView | BudgetView:
        if agent_name == "scout":
            return ScoutView(
                budget_limits=...,          # flight/hotel/activity ceilings
                flight_search_results=...,  # raw search data
                hotel_search_results=...,
            )   # does NOT include: itinerary, decisions, other agents' outputs

        elif agent_name == "planner":
            return PlannerView(
                confirmed_bookings=...,     # only APPROVED decisions
                per_day_budget=...,         # remaining &#247; days
                attraction_search_results=...,
            )   # does NOT include: rejected options, raw prices

        elif agent_name == "budget":
            return BudgetView(
                all_prices=...,             # every price from every source
                running_total=...,
                budget_ceiling=...,
            )   # does NOT include: activity names, preferences

        else:
            raise ValueError(f"Unknown agent: {agent_name}")</code></pre></div><p>Scout never sees what the Planner decided. Budget never sees which temples were chosen. Each agent gets only what it needs to do its job.</p><p>Then I built a single-agent version. Same model, same search data, same instructions. One prompt that does everything at once. I ran both systems across three cities (Tokyo, Paris, Bangkok), two runs each, and compared what they found.</p><p>The sample size is small. Two runs per city gives you direction, not proof. But the patterns were consistent enough to be worth sharing.</p><div><hr></div><p>The single agent was faster every time. About 100 seconds versus 130. It used fewer tokens. About 10,000 versus 14,500. On pure efficiency, the generalist wins.</p><p>But then I looked at the flight prices.</p><p>For Paris, both systems found the same $1,199 flight. Dead tie, both runs. The SFO to Paris route has limited options. When the answer is obvious, specialization adds nothing.</p><p>For Tokyo, the single agent found cheaper flights. $946 average versus $1,144. Multi-agent is not always better. My read on why: Tokyo is a well-known route with a moderate number of carriers. The search results contained enough information for a generalist to find the best option without deep analysis. But the multi-agent system&#8217;s rigid pipeline introduced information loss at each handoff. Specifically, a method called <code>_approve_best_options</code> picks <code>flights[0]</code> from Scout&#8217;s sorted list and marks everything else as rejected before Budget ever sees the alternatives. The orchestrator pre-decides the winner. Call it the Lossy Handover problem: if your orchestrator is too rigid, it dumbs down the specialists. The single agent saw everything at once and acted as its own soft orchestrator, weighing all options simultaneously. Structure helped in Bangkok. In Tokyo, it got in the way.</p><p>For Bangkok, the multi-agent system found flights at $293. The single agent picked $885. Consistent across both runs. A $592 difference on a $1,500 budget trip. (All prices are search-reported via Tavily, not verified bookings. The exact numbers will differ if you run this tomorrow. What matters is the gap and what caused it.)</p><p>Bangkok has dozens of carriers, multiple layover options through Asian hubs, and a wide spread of price points. When Scout&#8217;s only job is analyzing flight options, it digs deeper. It found a route the single agent missed entirely. The single agent was juggling flights, hotels, itinerary, and budget at the same time. It picked a reasonable option and moved on.</p><p>That is the pattern.</p><p>Here is the data across all six runs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PdUK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PdUK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 424w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 848w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 1272w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PdUK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png" width="1182" height="733" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!PdUK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:733,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70794,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.madhunagaraj.com/i/192482088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!PdUK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 424w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 848w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.png 1272w, https://substackcdn.com/image/fetch/$s_!PdUK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23e2b830-96c7-4b34-b960-05f72aa8c72a_1182x733.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>Averages across two runs per city. All prices from Tavily web search, not verified bookings.</em></p><p>The multi-agent system used 40-50% more tokens every time. It was slower every time. But for Bangkok it saved $592 on a $1,500 trip. The token overhead cost maybe fifty cents.</p><p>It is not about task complexity in the abstract. It is about search space. When there are many valid options spread across a large space, a specialist who does nothing but search will find things a generalist misses. When the answer is obvious or the space is small, the overhead is not worth it.</p><div><hr></div><p>There were other findings worth noting.</p><p>Restricting what each agent can see (what multi-agent theory calls the observation function) reduces context size substantially. Budget does not need to process itinerary descriptions. Scout does not need to see rejected options. Less context, smaller prompts, lower cost. I did not run a controlled experiment isolating this variable, but the multi-agent token counts (averaging around 14,500 across all runs) are spread across four sequential calls, each with a focused prompt. A single prompt carrying all the context for all three roles would be larger than any one of them.</p><p>But the cost savings is not the most interesting part. The observation function is also a least-privilege boundary. Budget cannot see which temples were chosen or what the traveler&#8217;s personal interests are. It sees prices. That is all it needs and all it should have. In a system where agents might be backed by different models, different providers, or different trust levels, controlling what each agent can see is not just an optimization. It is a security and privacy decision. The same pattern that reduces token cost also enforces data isolation.</p><p>Here is how state flows through the system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Et7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Et7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 424w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 848w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 1272w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Et7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png" width="1226" height="1270" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!8Et7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1270,&quot;width&quot;:1226,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:313718,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.madhunagaraj.com/i/192482088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8Et7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 424w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 848w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.png 1272w, https://substackcdn.com/image/fetch/$s_!8Et7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbba8354e-3e3c-4cbb-8db4-b85ac852d3e6_1226x1270.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><blockquote><p>A note on the plumbing. The paper specifies two protocols underneath the diagram above. MCP (Model Context Protocol) controls tool access: only the orchestrator calls MCP servers, and agents only analyze data that was pre-fetched for them. A2A (Agent-to-Agent) is the message schema. Every inter-agent communication is a typed Pydantic model with a <code>message_type</code> (TASK_ASSIGN, APPROVE, REJECT), a confidence score, and a provenance chain. When Budget flags a flight, it returns a structured REJECT with confidence 0.95 and a list of reasons, not free text. That structure is what lets the orchestrator make deterministic decisions instead of parsing natural language.</p></blockquote><p>I tested this directly. I injected a fake &#8220;$200 SCAM Air 999&#8221; flight into the search results for a Tokyo trip where real flights cost $800-1,200. The Budget agent flagged it with three warnings: the price was unrealistic for the route, the spending was near category limits, and the carrier name was suspicious. A specialist whose only job is checking numbers catches things a generalist might miss while multitasking. Interestingly, even the single agent did not use the scam price; the LLM had its own sense of realistic pricing. But the multi-agent system caught it earlier, at the budget gate, before it could reach the Planner at all. Defense in depth.</p><p>The paper warns about coordination overhead. I measured it directly in a head-to-head run on the same Tokyo trip:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!clKx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!clKx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 424w, https://substackcdn.com/image/fetch/$s_!clKx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 848w, https://substackcdn.com/image/fetch/$s_!clKx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 1272w, https://substackcdn.com/image/fetch/$s_!clKx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!clKx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png" width="885" height="403" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/$s_!clKx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:403,&quot;width&quot;:885,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34165,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.madhunagaraj.com/i/192482088?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!clKx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 424w, https://substackcdn.com/image/fetch/$s_!clKx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 848w, https://substackcdn.com/image/fetch/$s_!clKx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.png 1272w, https://substackcdn.com/image/fetch/$s_!clKx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51767916-6632-40b5-9176-168e800607bc_885x403.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>The real cost is not in the messages between agents. It is in the latency of four sequential API calls and the context window space used to give each agent its filtered view of the world. The 130% token overhead is the coordination tax. Whether that tax is worth paying depends entirely on what the specialist finds.</p><div><hr></div><p>I expected the premise to be right in a straightforward way. Multi-agent should beat single-agent.</p><p>It does. But only sometimes.</p><p>For Bangkok, the coordination tax was maybe fifty cents in extra tokens. The flight savings was nearly six hundred dollars. For Paris, the multi-agent system added cost and time for zero benefit. For Tokyo, the single agent did better.</p><p>The paper itself is a framework paper, not a benchmark paper. It gives you a vocabulary for decomposing orchestration into planning, policy, execution, control, state, knowledge, and quality. That decomposition is worth learning regardless of whether you end up building multi-agent or not.</p><p>I am not the only one finding this. A Towards Data Science <a href="https://towardsdatascience.com/the-multi-agent-trap/">analysis</a> called it &#8220;The Multi-Agent Trap&#8221;, the tendency to treat every problem as a multi-agent problem when a well-prompted single agent would suffice. GitHub&#8217;s engineering <a href="https://github.blog/ai-and-ml/generative-ai/multi-agent-workflows-often-fail-heres-how-to-engineer-ones-that-dont/">blog</a> put it bluntly: most multi-agent workflow failures come down to missing structure. The pattern I saw in my trip planner, structure helps when the search space is large, hurts when it is not appears to be general.</p><p>But the performance premise that motivates the framework needs a qualifier. Build multi-agent when the search space is large enough that focused attention finds what divided attention misses. When the cost of overlooking the best option exceeds the cost of looking twice.</p><p>For everything else, one agent is enough.</p><div><hr></div><p><em>Paper:  &#8220;<a href="https://arxiv.org/abs/2601.13671">The Orchestration of Multi-Agent Systems</a>.&#8221; arXiv:2601.13671, January 2026.</em></p>]]></content:encoded></item><item><title><![CDATA[What Developers Get Wrong About Building with AI]]></title><description><![CDATA[For the developer who wants to become a founder.]]></description><link>https://www.madhunagaraj.com/p/what-developers-get-wrong-about-building</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/what-developers-get-wrong-about-building</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 08 Mar 2026 01:23:09 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Disclaimer: The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="3882" height="2584" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2584,&quot;width&quot;:3882,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A MacBook with lines of code on its screen on a busy desk&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A MacBook with lines of code on its screen on a busy desk" title="A MacBook with lines of code on its screen on a busy desk" srcset="https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1498050108023-c5249f4df085?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxjb2Rpbmd8ZW58MHx8fHwxNzcyODU3OTkzfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@cgower">Christopher Gower</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>I&#8217;ve been thinking about what it means to build software right now.</p><p>Not the mechanics of it. The models are capable. The tools are there. The barrier to shipping something has never been lower.</p><p>I mean the thinking behind it.</p><p>Because here&#8217;s what I keep coming back to. A generation of talented developers is about to build products shaped entirely by what AI can do today. They will look at the current state of the models, the current interfaces, the current capabilities and build for that. Ship fast, get users, feel the momentum.</p><p>And then the models will evolve. Faster than the roadmap expected. And the product built for today becomes the wrong answer for tomorrow.</p><p>That&#8217;s the trap the moment sets.</p><p><strong>The mistake is building for the model, not the problem</strong></p><p>When you pick up a powerful new tool, the temptation is to build something that shows off what it can do. This isn&#8217;t new. Early mobile apps were just desktop websites made smaller. Early cloud software was just on-premise software moved online.</p><p>The same thing is happening now. Products that are, at their core, a UI around a prompt. Clean. Functional. Sometimes impressive. But the value lives entirely in the model underneath and that model is not yours.</p><p>When the next model ships, and it will ship sooner than you think, what you built becomes a feature someone else offers for free.</p><p>If the model getting stronger makes your product weaker, you were never building a product. You were building a demo.</p><p><strong>Ask a different question before you start</strong></p><p>Most founders start with: what can I build with AI?</p><p>The better question is: what problem gets harder to solve as the world gets more complex and how do I sit in the middle of that in a way that compounds over time?</p><p>That question changes everything.</p><p>It moves you away from the interface and toward the workflow. Away from the feature and toward the process. Toward what the model cannot do alone, which is understand the specific, messy, human context of a particular industry.</p><p>The model knows everything about the average. It knows almost nothing about your specific customer&#8217;s specific situation. That gap is where you build.</p><p><strong>What loses value. What doesn&#8217;t.</strong></p><p>Software that manages lightweight engagement, scheduling, email workflows, basic coordination, is easy to migrate and easy to replace. An AI-native competitor can move that data in days and offer something better on top of it.</p><p>What keeps its value is software sitting inside complex workflows where the data is hard to replicate and built up over years of real operational use. Construction scheduling. Manufacturing supply chains. Property maintenance logs. The kind of data that doesn&#8217;t exist anywhere else because it was never meant to be shared. Because it lived in a process, not a database.</p><p>That&#8217;s the line.</p><p><strong>You already have the advantage</strong></p><p>Here&#8217;s what I think developers underestimate about this moment.</p><p>You already think in systems. You understand how things connect, where things break, what happens at scale. That instinct, applied not just to code but to how an industry actually operates, is exactly what this era needs.</p><p>The most defensible products being built right now are not the most technically impressive. They are the ones where someone understood a domain deeply enough to encode how it actually works. The exceptions. The edge cases. The judgment calls that happen between the steps. Into a system that gets smarter every time someone uses it.</p><p>That is builder&#8217;s work. Not just engineering. Thinking.</p><p><strong>Build something that learns</strong></p><p>Your product is not the features. It is what the system learns as people use it.</p><p>When a user corrects the output, that&#8217;s signal. When the system handles an edge case it hasn&#8217;t seen before, that&#8217;s signal. When a decision gets made inside the platform, that&#8217;s signal. That accumulated understanding of how a specific domain operates, that is the asset. Not the code.</p><p>No foundation model trained on the average of the internet will ever have it.</p><p>Own the workflow where the real work happens. Make your system the place where the truth of the business lives. And then let it learn.</p><p>What you build on day one matters less than what your system knows on day one thousand.</p><p>A generic agent can book the plumber. Only your system knows which plumber showed up last time, what it cost, and whether the problem came back. That memory is the moat. Not the capability.</p><p><strong>The models will get stronger. Build for that.</strong></p><p>A stronger model should make your product more powerful, not obsolete.</p><p>If the AI is the product, if the value is the generation, the summarization, the interface, a stronger model replaces you. That is a fragile position to be in.</p><p>But if the AI is the engine, if the value is the proprietary context, the workflow, the domain knowledge you have built up, a stronger model makes your engine more powerful. You get better without doing anything.</p><p>Build with the model. Not on it.</p><p><strong>Don&#8217;t marry the engine either</strong></p><p>One more thing, because this is where even careful builders get it wrong.</p><p>Treating AI as the engine is right. But don&#8217;t bolt yourself to a single engine.</p><p>The gap between the leading models has narrowed faster than most people expected. OpenAI, Anthropic, Google, they are closer to each other than they have ever been. And open-source models have caught up in ways that also give you something proprietary models don&#8217;t: full control of your data, no dependency on someone else&#8217;s pricing or terms.</p><p>Build a layer between your product logic and the model. Route the right tasks to the right model. Swap them out as the landscape shifts. The ability to always use the best tool at the right cost, without being locked in, is itself a competitive advantage.</p><p>Build the engine room, not the engine.</p><p>And if the inference cost is slowing you down right now, don&#8217;t let it stop you. There is no world where token costs stay this high. Every wave of compute has gotten cheaper faster than anyone expected. Build the right system. The economics will catch up.</p><p><strong>Go where the model was never taught</strong></p><p>The sharper version of &#8220;go where AI adoption is slow&#8221; is this: go where the training data never existed.</p><p>The plant manager who knows which supplier runs late in Q4. The process refined over twenty years on a specific floor. The supply chain nuance that lives in phone calls and institutional memory. That knowledge was never written down, never online, never in any training set.</p><p>The SMB running three shifts has heard of ChatGPT. They just don&#8217;t know how to make it work for their operation. Nobody has built for them. The big platforms are chasing enterprise. The funded startups are chasing legal and healthcare. The manufacturing floor is not in any of those conversations.</p><p>That is the opening. Go there first.</p><p><strong>At the end of it</strong></p><p>You are building something that helps a person simplify a hard process and you are using the most powerful tool in the history of software to do it.</p><p>Keep it that simple in your head.</p><p>Not &#8220;I am building an AI product.&#8221; Not &#8220;I am disrupting a vertical.&#8221; You are making something hard, easier. For a real person. In a specific situation. That the model alone cannot solve.</p><p>And when the AI gets it wrong and it will, your product needs to be the system that&#8217;s accountable. In manufacturing, in property management, in any operation where mistakes have real consequences, the winner isn&#8217;t the smartest model. It&#8217;s the one the customer trusts to own the outcome.</p><p>The developer who stays anchored to that, who doesn&#8217;t get seduced by what the model can do and loses sight of the actual human on the other side, is who builds something that lasts.</p><p>Go build. But build for the person, not the prompt.</p>]]></content:encoded></item><item><title><![CDATA[Words for the Long Road]]></title><description><![CDATA[For when I'm not there to say it]]></description><link>https://www.madhunagaraj.com/p/words-for-the-long-road</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/words-for-the-long-road</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 01 Mar 2026 15:24:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tHgM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.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_!tHgM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tHgM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tHgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97dde172-b56b-4762-980c-794cadd815f3_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tHgM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!tHgM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97dde172-b56b-4762-980c-794cadd815f3_1024x608.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><figcaption class="image-caption">Words for the long road</figcaption></figure></div><p></p><p>I&#8217;ve been carrying these words for a while now. Things I&#8217;ve learned, things I wish someone had told me, things I don&#8217;t want lost if I&#8217;m not around to say them. So I&#8217;m writing them down. Not because I have it all figured out. But because what I do know is worth passing along.</p><p>If I could give you one thing to carry from the start, it would be this: become someone you can respect.</p><p>You&#8217;re going to feel everything. Anger, jealousy, the urge to win, the need to be right. We all do. Those instincts have been with us long before we built values and intellect around them. The instincts don&#8217;t make you weak. Everyone feels them. What defines your character is the moment you recognize them and choose how to act. That choice is yours alone. It&#8217;s what makes you, you.</p><p>The world you&#8217;re growing up in is loud. It will constantly show you what success is supposed to look like. Not everything that shines is valuable. Companies spend billions making you feel like you need what they&#8217;re selling. Learn the difference between what you actually need and what someone is working hard to make you want.</p><p>You&#8217;ll meet people from different cultures, different upbringings, different ways of seeing the world. That&#8217;s a good thing. How someone was raised shapes how they think, what they value, how they show up. Not everyone will see life the way you do, and that doesn&#8217;t make them wrong. Try to see things from where they stand. That&#8217;s where the real learning happens.</p><p>Our family won&#8217;t always be perfect. We&#8217;ll disagree. There will be days you think we don&#8217;t understand you, and days we&#8217;ll feel the same about you. But we will always be there. No matter what. That&#8217;s not something you earn. It&#8217;s something you were born into. We will love you unconditionally, and sometimes that love will sound like things you don&#8217;t want to hear. Trust it anyway.</p><p>If you make a mistake, own it. If you hurt someone, say so. Not because the world demands it, but because you should demand it of yourself. The people worth keeping in your life will respect you more for your honesty than your perfection.</p><p>Not every friend will be the same kind of friend. Some will stay with you regardless of what you can offer them. Those are the real ones. Others will be around when it&#8217;s convenient. You&#8217;ll learn to tell the difference. And some friends are tied to a time and place. That doesn&#8217;t make them less real, just different. People grow, people change, and sometimes that means growing apart. Don&#8217;t hold it against them. But be careful who you keep closest. You become the best or worst version of yourself based on the people you surround yourself with. And whoever is in your life, be someone worth keeping around.</p><p>Your body is the only asset you can never replace. I wish I had understood this earlier. Your body runs on a rhythm. When you sleep, when you eat, how you move, it all connects. Sleep controls your weight, your mood, how clearly you think. Exercise isn&#8217;t about looking good. It&#8217;s how your body was built to function. Learn what a balanced meal actually looks like, not from ads or trends, but from understanding what your body needs. When you&#8217;re young none of this feels urgent. By the time it does, you&#8217;re already paying for the years you didn&#8217;t.</p><p>Learn how money works before you need to. I learned this the hard way. Wealth isn&#8217;t what you spend. It&#8217;s what you don&#8217;t. The car you didn&#8217;t buy, the upgrade you skipped, the money you kept instead of showing it off. That restraint is what builds freedom. The kind that lets you walk away from what&#8217;s wrong and wait for what&#8217;s right, without panic deciding for you.</p><p>Work hard. There is no substitute for it. Nothing meaningful was ever built without effort, and most of what you want in life will cost more of it than you expect. But work on what matters. There&#8217;s a difference between being busy and being productive. One fills your day, the other builds your life. And you will fail. I can promise you that. It won&#8217;t mean you&#8217;re not good enough. It will mean you tried. The only real mistake is failing and learning nothing from it. And know this: luck plays a part. It always does. But the harder you work and the more prepared you are, the bigger your surface for luck to land on.</p><p>Be resourceful. Don&#8217;t wait for perfect conditions or someone to hand you the answer. The people who build something real aren&#8217;t always the most talented. They&#8217;re the ones who refused to stay stuck.</p><p>Stay curious. Ask questions even when you think you should already know the answer. Read, watch, listen, not just to confirm what you believe, but to challenge it. Go deep. The world respects people who truly understand what they&#8217;re talking about, not those who pretend to. Surface knowledge fools no one worth impressing. The people who keep growing are the ones who never stop learning. Knowledge doesn&#8217;t come to you. You have to go after it.</p><p>When you were young, there was something that pulled your attention without anyone telling it to. A subject, a craft, a question you couldn&#8217;t let go of. As you got older, the noise got louder and that voice got harder to hear. Try to find it again. That&#8217;s your purpose. It doesn&#8217;t have to be grand. It just has to be yours. Life gets better once you find it. Not easier, but clearer. The noise quiets down. Decisions get simpler. You stop drifting and start building.</p><p>See the world. Not just for the photos, but because nothing rearranges the way you think faster than being somewhere unfamiliar. Talk to strangers. Sit with people who grew up nothing like you. Books will teach you what&#8217;s possible. Experience will teach you what&#8217;s true.</p><p>And spend time in nature. Not because someone told you it&#8217;s good for you, but because it&#8217;s the one place that doesn&#8217;t ask you to perform. No notifications, no expectations, no one measuring you. Just quiet. There&#8217;s something out there that resets you in a way the city and the screen never will. Go often. Stay long enough to hear yourself think.</p><p>And rest when you need to. I mean it. Your mind and body need recovery the way soil needs seasons.</p><p>There&#8217;s real power in doing good without expecting anything back. Choosing honesty when it would be easier not to. That&#8217;s where self-respect is forged. Not in what you achieve, but in how you carry yourself when no one is watching.</p><p>I don&#8217;t expect you to be perfect. I only hope that as you grow, you choose to live in a way that matches your values. Even when it&#8217;s hard. Even when no one&#8217;s looking. This is what I know so far. I&#8217;m still learning too. And when I learn more, I&#8217;ll pass that along as well.</p><p>Because the road is long. And along the way, everything will change. Your circumstances, your status, the people around you. But one thing stays with you the entire way. The person you see in the mirror. Make sure that&#8217;s someone you respect.</p>]]></content:encoded></item><item><title><![CDATA[The Evolving Developer]]></title><description><![CDATA[From Code Producer to Decision-Maker in the Age of AI]]></description><link>https://www.madhunagaraj.com/p/the-evolving-developer</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/the-evolving-developer</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Mon, 23 Feb 2026 05:01:23 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><p><em>Disclaimer: The views expressed here are my own and are not related to or reflective of my work or any organization I am affiliated with.<br></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="2448" height="2448" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2448,&quot;width&quot;:2448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;black and white ceramic mug on black table&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="black and white ceramic mug on black table" title="black and white ceramic mug on black table" srcset="https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1604964432806-254d07c11f32?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzczMDM1MzY1fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 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><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@nublson">Nubelson Fernandes</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p><br>AI hasn&#8217;t eliminated the role of the developer.</p><p>It has clarified it.</p><p>For a long time, software development was closely tied to writing code. Progress was measured in features shipped or lines written. AI changes that dynamic. When code can be generated quickly and at scale, the value of the developer shifts upstream, toward thinking, deciding, and guiding.<br><br><strong>Clarity Is Built, Not Found</strong></p><p>When I began working with AI coding agents, I expected speed to be the primary benefit. What stood out instead was how much it forced clarity. Early ideas weren&#8217;t incorrect, but they were often imprecise. When vague intent was passed to an agent, the output reflected that ambiguity immediately.</p><p>Iteration stopped being just a development loop and became a way to refine intent. Each prompt required answering basic questions: what problem is being solved, who it is for, and what &#8220;done&#8221; actually means.</p><p>Clarity wasn&#8217;t a prerequisite to building, it emerged through the process.</p><p>AI doesn&#8217;t replace thinking; it accelerates feedback on unclear thinking.<br><br><strong>Architecture Still Matters (Even More Now)</strong></p><p>As clarity formed, the instinct was to move faster. AI makes experimentation inexpensive. Different stacks and architectures can be explored quickly. But speed does not remove responsibility.</p><p>Decisions still carry tradeoffs across scalability, reliability, maintainability, cost and security. Security, in particular, is a day-zero concern.</p><p>Coding agents made it easier to pressure-test assumptions early: how systems behave at scale, where trust boundaries exist, what fails silently, and what becomes costly over time. Agents can surface options, but judgment remains human.</p><p>Architecture still matters perhaps more now than before because mistakes compound faster.<br><br><strong>Quality Ownership Scales With Output</strong></p><p>Another shift was the increased emphasis on quality. When an agent can generate large volumes of code quickly, blind trust becomes risky. Code review and testing moved from periodic activities to continuous ones.</p><p>Testing stopped feeling like overhead and became a guardrail.</p><p>I&#8217;ve caught more subtle bugs and security issues earlier in the process than I ever did before not because the agent is smarter, but because it forces me to review, question, and validate every assumption.</p><p>Increased output required increased ownership of quality.<br><br><strong>Humans Are Still the Bottleneck</strong></p><p>There is a human constraint that AI does not remove: fatigue.</p><p>AI compresses effort significantly, enabling large amounts of work in a single session. Momentum can be productive, but unmanaged momentum degrades judgment. Agents do not get tired; humans do.</p><p>Knowing when to pause and return with fresh context remains essential. Sustainable velocity matters more than heroic bursts of output.<br><br><strong>Refactoring Without Fear</strong></p><p>At the same time, refactoring became less intimidating.</p><p>When intent is clear, behavior is understood, and tests exist, rewriting becomes transformation rather than reinvention. Switching stacks becomes another iteration rather than a risk.</p><p>Confidence comes from reversible decisions.<br><br><strong>From Code Producer to Decision-Maker</strong></p><p>A conversation with a doctor reinforced this perspective. While AI can suggest multiple treatment options, choosing the appropriate one is where experience matters.</p><p>That distinction mirrors the evolving role of the developer.</p><p>AI can propose architectures and implementations. Determining which option fits the problem, the system, and the users and owning the outcome remains a human responsibility.</p><p>In the age of AI, developers shift from being primarily code producers to decision-makers. AI generates possibilities; it does not choose purpose.<br><br><strong>Critical Thinking Is the Real Skill</strong></p><p>If there is one thing AI can begin to replace, it is unexamined thinking not intelligence, but complacency masquerading as confidence.</p><p>AI executes exactly what is asked. The quality of the outcome is bounded by the quality of the reasoning behind the request.</p><p>This elevates the importance of critical thinking, security awareness, and system-level understanding. Developers become guides and guardians, shaping how systems should be built, not just what gets built. QA and UAT are no longer isolated phases but continuous responsibilities.</p><p>What you ask is what will be built.</p><p>What you clarify is what will be delivered.<br><br><strong>Looking Ahead</strong></p><p>This is still an early stage. What we see today is the current state. The future will evolve further, and some responsibilities may shift again.</p><p>What will not disappear is the need for judgment, context, and critical thinking.</p><p>AI does not replace developers.</p><p>It raises the bar.</p><p>And the developers who adapt, who think clearly, decide deliberately, and guide systems responsibly, will shape what comes next.</p><p><strong>Learn to Learn Fast</strong></p>]]></content:encoded></item><item><title><![CDATA[Becoming Someone You Don’t Lose]]></title><description><![CDATA[A reflection on finding yourself, protecting your peace, and honoring real connection]]></description><link>https://www.madhunagaraj.com/p/the-last-step-of-becoming-an-adult</link><guid isPermaLink="false">https://www.madhunagaraj.com/p/the-last-step-of-becoming-an-adult</guid><dc:creator><![CDATA[Thinking Through AI]]></dc:creator><pubDate>Sun, 22 Feb 2026 22:50:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aZKg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.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_!aZKg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aZKg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aZKg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aZKg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!aZKg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997bde25-a978-478a-8f9f-d5d59dbb093c_1024x608.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><figcaption class="image-caption">Becoming Someone You Don&#8217;t Lose</figcaption></figure></div><p>I&#8217;m writing this because some truths don&#8217;t leave you alone until you say them&#8212;and because no one really teaches you how easy it is to lose yourself while trying to belong. For a long time, I&#8217;ve wanted to put this into words. If you allow people to define who you are, you slowly lose yourself along the way. Authenticity isn&#8217;t optional&#8212;it&#8217;s survival.</p><p>There will always be people who accept you exactly as you are, and those relationships last because they are built on truth. Then there are others who need to feel superior. They undermine, diminish, and refuse to acknowledge you&#8212;not because of who you are, but because acknowledging you would threaten how they feel about themselves. Those relationships don&#8217;t last.</p><p>This isn&#8217;t about big or small, strong or weak. It&#8217;s about pride. Some people feed theirs by bending others, and that only works if you allow it. The same truth applies inward: if you expect someone to be a certain way instead of accepting who they are, you&#8217;re doing the same thing. Everyone is unique. No one exists to fit your expectations.</p><p>Don&#8217;t beat yourself up trying to be perfect when you&#8217;re young. These experiences will happen&#8212;and they&#8217;re supposed to. Becoming an adult takes time, and understanding who you are takes even longer. The confusion, the mistakes, the disappointments, the wrong people&#8212;those aren&#8217;t failures. They&#8217;re necessary. Without them, you don&#8217;t discover yourself.</p><p>At some point, you stop trying to win people over. You stop explaining yourself. You stop rehearsing conversations in your head. Not because you don&#8217;t care, but because you finally understand what costs too much. Peace becomes more important than being right. Clarity matters more than approval.</p><p>That&#8217;s when you keep your eyes on what truly matters. You move past the noise and find your purpose. You ask yourself what excites you and what you want to keep doing for the rest of your life. You surround yourself with people who cheer for your success, and you become someone who genuinely celebrates the growth of others. You show up for your friends selflessly, without keeping score or expecting anything in return.</p><p>As you grow older, everything changes&#8212;your finances, your status, your circumstances. What doesn&#8217;t change are authentic relationships. The people who are real will see you in both growth and fall, and they will stay. No matter how high you rise or how hard you fall, those people remain.</p><p>I&#8217;m deeply grateful for the people who have been part of my life through both my lowest moments and my growth. I know they will be there for the rest of my life. There are also friends you lose&#8212;not because of conflict, but because life creates distance and time slips away. Yet if those relationships were built on truth, they don&#8217;t disappear. They exist exactly as they are, regardless of how long it&#8217;s been since you last saw each other.</p><p>Sometimes, all it takes is one bad intention to disturb you deeply. When that happens, let it go. Ground yourself in what actually matters&#8212;your family, your health, and your mental peace.</p><p>But part of protecting that peace is recognizing what threatens it.</p><p>There are people who manipulate to escape the truth, who twist stories to hide what they&#8217;ve done. There are also people who support that manipulation because it makes them feel bigger, protects their pride, and serves their own interests&#8212;they hide behind a version of reality and use it when it&#8217;s convenient to fulfill their agenda. Whether they are right or wrong matters less than this: they must believe they are justified. That makes them dangerous to be around. They think they&#8217;re smart enough to get away with it&#8212;but the other side sees everything. They choose not to react. Not because they&#8217;re fooled, but because they refuse to lower themselves to play that game. It&#8217;s choosing dignity over drama. Recognizing this is part of protecting yourself.</p><p>And then there are people who genuinely care. They cheer for you. They show up without questioning your worth. But once trust is given, it shouldn&#8217;t be endlessly tested. Trust, once damaged, changes everything.</p><p>If you&#8217;re around people where you have to keep your guard up, limit what you share, or shrink yourself to feel safe, you&#8217;re with the wrong people. If someone takes advantage of you to fulfill their own agenda&#8212;even knowing it will harm you&#8212;that&#8217;s toxic. Walking away isn&#8217;t selfish. It&#8217;s self-respect. You don&#8217;t owe access to anyone who costs you your peace.</p><p>Misunderstandings happen. People miss each other. That&#8217;s human. But in any real relationship, there has to be conversation. If honesty isn&#8217;t possible, the relationship no longer exists in a meaningful way.</p><p>Be humble. Be helpful. Care deeply. But if your kindness is being given to the wrong people&#8212;walk away.</p><p>This is what becoming an adult ultimately means: choosing purpose over noise, peace over pride, and people who let you be yourself.</p>]]></content:encoded></item></channel></rss>