<?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[Elevate]]></title><description><![CDATA[Addy Osmani's newsletter on elevating your effectiveness. Join his community of 600,000 readers across social media.]]></description><link>https://addyo.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!8WxC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3704470-b6d5-48a9-a9d1-564bd833fc5c_1280x1280.png</url><title>Elevate</title><link>https://addyo.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 15 Aug 2026 03:02:02 GMT</lastBuildDate><atom:link href="https://addyo.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Addy Osmani]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[addyo@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[addyo@substack.com]]></itunes:email><itunes:name><![CDATA[Addy Osmani]]></itunes:name></itunes:owner><itunes:author><![CDATA[Addy Osmani]]></itunes:author><googleplay:owner><![CDATA[addyo@substack.com]]></googleplay:owner><googleplay:email><![CDATA[addyo@substack.com]]></googleplay:email><googleplay:author><![CDATA[Addy Osmani]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Practical Loop Engineering]]></title><description><![CDATA[Goals, loops, and the discipline of not delegating your judgment]]></description><link>https://addyo.substack.com/p/practical-loop-engineering</link><guid isPermaLink="false">https://addyo.substack.com/p/practical-loop-engineering</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Fri, 14 Aug 2026 14:30:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hKG8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The way that I typically work is I have anywhere between five and ten agents working at the same time in parallel. There are going to be some tasks that I&#8217;m very happy to delegate fully to agents, as long as I have a very clear idea of the stopping conditions and the constraints around them. And then there are going to be some tasks where I am going to want to keep a closer eye and code-review what the agent is doing.</p><p>Now within that, you&#8217;ve probably heard about <strong>loop engineering</strong>. I talked about it a couple of months ago when I wrote a big blog post about it. </p><blockquote><p>A loop is an autonomous, self-correcting feedback cycle where an AI agent repeatedly acts, tests its results and adjusts its approach until a specific goal is met</p></blockquote><p><em>A quick message from our sponsor:</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_!pXSW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pXSW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pXSW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg" width="1270" height="760" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92436,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/211112800?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pXSW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pXSW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760f67b2-a638-4d9a-972a-d8364be73651_1270x760.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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"><strong><span>Make AI agents survive contact with production using </span><a href="https://fandf.co/4pVPWbQ"><span>Trigger.dev</span></a><span>. </span></strong><span>A demo chatbot is a few lines. The same agent in production has to survive users refreshing, you redeploying mid-conversation, servers crashing - and it can&#8217;t take irreversible actions without a human in the loop. This issue&#8217;s sponsor, </span><a href="https://fandf.co/4pVPWbQ"><span>Trigger.dev</span></a><span>, just shipped their chat agent to close exactly that gap. It runs a whole multi-turn conversation as one durable task - so a chat that&#8217;s mid-stream survives refreshes, redeploys, idle gaps, even crashes and picks up right where it left off.</span></figcaption></figure></div><p>There are now basically two core primitives you can think about. In Claude Code you have a <strong><a href="https://code.claude.com/docs/en/goal">goal</a> primitive</strong>, which can drive a single bounded task forward until you&#8217;ve got a particular goal, like a measurable finish line that&#8217;s been met. And then <strong><a href="https://code.claude.com/docs/en/scheduled-tasks">loop</a></strong> reruns on a timer or a fixed interval, so you can use it to kind of schedule changes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!00w3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!00w3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 424w, https://substackcdn.com/image/fetch/$s_!00w3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 848w, https://substackcdn.com/image/fetch/$s_!00w3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 1272w, https://substackcdn.com/image/fetch/$s_!00w3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!00w3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp" width="1456" height="855" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84591717-7aa7-4119-817a-54065151635d_1456x855.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:39198,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp&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_!00w3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 424w, https://substackcdn.com/image/fetch/$s_!00w3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 848w, https://substackcdn.com/image/fetch/$s_!00w3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 1272w, https://substackcdn.com/image/fetch/$s_!00w3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84591717-7aa7-4119-817a-54065151635d_1456x855.webp 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Before the primitives were primitives</strong></h2><p>I remember back before we had primitives baked into Claude Code and Codex, loop engineering was heavily about setting up your own bash loop, a hand-rolled thing. That&#8217;s how I approached it. And you might remember earlier in the year, a number of us were playing around with the <a href="https://ghuntley.com/loop/">Ralph loop</a> by Geoff Huntley. We were experimenting, we were sharing our workflows, we were sharing what worked and what didn&#8217;t, but it was largely on some of our personal projects where, if we ran into a wall, it didn&#8217;t really have a big cost to us because it was on personal projects. </p><p>And as we&#8217;ve tried to see what patterns, what aspects of loop engineering are now a little bit more baked, I think we have a clearer idea of how you babysit it. I can now largely rely on the output of the primitives in Claude Code and Codex. We&#8217;ve come a little way. But at the same time, you need to be very diligent, because loop engineering where you kind of leave it sitting alone, and you haven&#8217;t really thought about whether the end goal or the constraints have been well defined, can leave you in a problematic state. This is why there&#8217;s nuance when deciding to use it for an evergreen codebase without users or as much historical complexity vs. say a brownfield bank codebase.</p><h2><strong>How the Claude Code team frames loops</strong></h2><p>The Claude Code team published their take on four kinds of loops and it lines up with how I use the primitives (<a href="https://x.com/ClaudeDevs/article/2074208949205881033">their write-up</a>). Before we get to it, here&#8217;s my quick summary:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N8MN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N8MN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 424w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 848w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N8MN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:626412,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/211112800?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.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_!N8MN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 424w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 848w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!N8MN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5545307-6cad-40cc-b08f-52a093cf50c8_3200x1996.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><em>On the Claude Code team, we define loops as agents repeating cycles of work until a stop condition is met. We categorize a few different types of loops based on: how they are triggered, how they are stopped, what Claude Code primitive is used, what type of task is most appropriate for each. Not all tasks require complex loops; start with the simplest solution and use these patterns selectively.</em></p><p><em>Every prompt you send starts a manual loop with you directing each turn. Claude gathers context, takes action, checks its work, repeats if needed, and responds. We call this the agentic loop. For example, ask Claude to create a like button. It reads your code, makes the edit, runs the tests, and hands back something it believes works. You then manually check the work, and write the next prompt.</em></p></blockquote><p>Their write-up walks each rung. </p><p><strong>On goal-based loops:</strong></p><blockquote><p><em>Sometimes, a single turn is not enough, especially for more complex tasks. Agents do better when they can iterate. You can extend how long Claude keeps iterating by defining what done looks like with /goal. When you define the success criteria, Claude doesn&#8217;t have to make a determination on what is &#8220;good enough&#8221; and end the loop early. Each time Claude tries to stop, an evaluator model checks your condition and sends it back to work until the goal is met or a number of turns you define is reached. This is why deterministic criteria, such as number of tests passed or clearing a certain score threshold, are so effective. For example: /goal get the homepage Lighthouse score to 90 or above, stop after 5 tries.</em></p></blockquote><p><strong>On time-based loops:</strong></p><blockquote><p><em>Some agentic work is recurring: the task stays the same and only the inputs change. For example, summarizing Slack messages every morning. Other work depends on external systems, and a simple way to interface with one is to check it on an interval and react to what changed. For example, a PR which may receive code reviews or fail CI. For these, you can trigger when Claude runs with /loop, which re-runs a prompt on an interval. For example: /loop 5m check my PR, address review comments, and fix failing CI. /loop runs on your computer, so if you turn it off, it stops. You can move the loop to the cloud by creating a routine with <a href="https://code.claude.com/docs/en/routines">/schedule</a>.</em></p></blockquote><p><strong>And on proactive loops, the top rung:</strong></p><blockquote><p><em>Triggered by: an event or schedule, with no human in real time. Stop criteria: each task exits when its goal is met. The routine itself runs until you turn it off. Best used for: recurring streams of well-defined work: bug reports, issue triage, migrations, dependency upgrades. Managed usage by: routing routines to smaller, faster models and using the most capable model for judgment calls.</em></p></blockquote><p>Their verification advice is worth lifting whole, because it moves the manual checking into something Claude applies itself:</p><pre><code><code>---
name: verify-frontend-change
description: Verify any UI change end-to-end before declaring it done.
---
# Verifying frontend changes
Never report a UI change as complete based on a successful edit alone.
Verify it the way a human reviewer would:
1. Start the dev server and open the edited page in the browser.
2. Interact with the change directly. For a new control (button, input,
   toggle): click it, confirm the expected state change, and screenshot
   before/after.
3. Check the browser console: zero new errors or warnings.
4. Use the Chrome Devtools MCP, run a performance trace and audit
   Core Web Vitals.
If any step fails, fix the issue and rerun from step 1 - do not hand
back partially verified work.
</code></code></pre><h2><strong>Goal</strong></h2><p>The way that I use goal is I use it for building any specific piece of work until it&#8217;s provably done. Like for example, you can use a goal to say: make sure that this experience loads in five seconds, keep going until it&#8217;s done. And it will continue to use an independent evaluation check to keep checking if the completion criteria has been met. What&#8217;s better is to be even more specific about what tooling is being used.</p><p>As for real goals that I&#8217;ve run to a number, there&#8217;s a few things that I&#8217;ve done. I&#8217;ve used goals for running through GitHub issues: review and close the last 10 issues, or review and move the last 10 issues forward, something like that. And that&#8217;s semi-open-ended, right? Or: let&#8217;s make this page load 50% faster. Sometimes that works well, sometimes it doesn&#8217;t, but it&#8217;s really about the experimentation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r_sL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r_sL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r_sL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png" width="1456" height="855" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:406540,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.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_!r_sL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!r_sL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85bdc2cf-ca2a-4bd8-bc48-f283b3d0a6c5_3200x1880.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Loop</strong></h2><p>Loop is a little bit more of a scheduler, so it keeps an eye on something or repeatedly executes a pattern on some cadence. So think of it a little bit like a cron. It&#8217;s best for doing things like polling logs or monitoring external states. You could use it for potentially checking in. If there are repetitive tasks you find yourself doing on some cadence, loop is pretty good for that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v9CV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v9CV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 424w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 848w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 1272w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v9CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png" width="1456" height="869" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:869,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:384466,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.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_!v9CV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 424w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 848w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.png 1272w, https://substackcdn.com/image/fetch/$s_!v9CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e56709-7f67-4f14-84a4-5d34561e68f2_3200x1910.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>What I delegate, and what I watch</strong></h2><p>For me, I use probably between five and ten agents every day. Very typically I&#8217;ll max out at about five concurrently. And some of those tasks might be ones that are a little bit safer. So maybe it&#8217;s, hey, I implemented this feature, go write the documentation for it. Or go double check that we have sufficient test coverage. Or something in that vein. If I&#8217;m working on a more complex problem, or something where I know that even if I&#8217;ve given it a good spec, or what I think was a good spec, and I&#8217;ve tried to give it some stopping conditions, there is still a reasonable chance it may not get everything right, I would try to watch it more closely. If the task involves anything just a little bit sensitive, whether it is I&#8217;ve given this access to a system, or whether the feature happens to touch authentication, or something related to security or finance, I&#8217;ll definitely be watching that closely.</p><p>Generally speaking, I do think we&#8217;re going to get to a place where folks are increasingly comfortable with delegation, as long as they&#8217;re able to have these clear ways of verifying that their goal or their stopping condition has been met. But you do still need to take a look at the code, at the thing that&#8217;s being generated, to make sure that it&#8217;s meeting your mark.</p><p>The other habit that matters here is not letting the agent that did the work decide the work is good. One sub-agent drafts the change. A separate one verifies it.</p><p>Sometimes an agent can be confident about something, and a verifying agent can catch things that they weren&#8217;t necessarily expecting. Like if it thinks that the baseline performance of an experience it&#8217;s generated is actually fine, and it&#8217;s only evaluating performance based on desktop, but you&#8217;re actually caring about the experience on mobile. That might mean the agent is being very confident about one dimension of the problem, but not the other.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fHg7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fHg7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 424w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 848w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 1272w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fHg7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp" width="1456" height="851" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:851,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49088,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp&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_!fHg7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 424w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 848w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 1272w, https://substackcdn.com/image/fetch/$s_!fHg7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a538d8b-09db-4ee0-a5db-2c3100f15eb6_1456x851.webp 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And I learned this one the hard way. I was curious to figure out: is there something that we&#8217;re missing that we haven&#8217;t gotten direct feedback on from our users, either in an issue tracker or in a comment somewhere? And so I asked it to go and take a look at some of our competitors, and put together a list, and some PRs, not pushed, but some PRs locally, of what solving some of those gaps might look like. And I almost pushed some of those changes. But I didn&#8217;t actually look at them closely enough. I read through its research, but I didn&#8217;t look at the implementations closely enough. So I delegated the task, but I was close to delegating the judgment as well. Now, when I actually looked through the changes, what I realized is that it would introduce a lot of additional complexity for our users, for, I think personally, not all that much gain. And so I feel like you need to sometimes check yourself, that you are not delegating the taste and the judgment to your agent. You&#8217;re delegating the task, and then you are actually checking back that it&#8217;s meeting your bar.</p><p>The evaluator sitting behind goal is not that checker, by the way. It doesn&#8217;t look at the content to see if it&#8217;s good or bad in any way, shape, or form. All it does is examine the conversation transcript to see if the hard rules you specified have been met.</p><pre><code><code>/goal Refactor the data-fetching layer in Dashboard.tsx until Lighthouse performance score is &gt;= 92 and LCP is under 1.8s as shown by the Lighthouse CLI output. Do not change the public API of any hooks. Each turn must improve at least one reported metric; abort if two consecutive turns show no improvement. Stop after 10 turns.
</code></code></pre><h2><strong>The workflow I run every day</strong></h2><p>One of the workflows that I do every day: I have a popular open source repository called <a href="https://github.com/addyosmani/agent-skills">Agent Skills</a>. We&#8217;ve got over 80,000 stars, and up until recently we were getting anywhere up to like 80 or 90 pull requests that we had to review a day. And so every day I would go and I would spend some time checking on this. Now with loop, what you can do is say: well, every 24 hours or every 12 hours, check the GitHub repository for any new open issues and provide a summary of their urgency, or provide a first pass review, or anything like that.</p><pre><code><code>/loop every 1h "Check the GitHub repository for any new open issues. Provide a bulleted summary of their urgency."</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IsI7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IsI7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 424w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 848w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IsI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png" width="1456" height="801" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:801,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:394631,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.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_!IsI7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 424w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 848w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.png 1272w, https://substackcdn.com/image/fetch/$s_!IsI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feda9894c-b06f-4cf5-94cf-609391812e6a_3200x1760.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Combining loops and goals</strong></h2><p>Now you can also sort of combine loops and goals. So you use loop to schedule a check, and then goal to solve the problem. So you can say something like: loop for every 24 hours, check GitHub for issues labeled bug. If one exists, use goal to implement a fix until all local tests pass and push the branch.</p><pre><code><code>/loop every 24h "Check GitHub for issues labeled 'bug'. If one exists, use /goal to implement a fix until all local tests pass and push the branch."</code></code></pre><p>But also keep in mind that goal has got some limitations around just how much you can sort of cram in there.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qcHc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qcHc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qcHc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png" width="1456" height="855" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:432054,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.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_!qcHc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!qcHc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4597394f-0385-47ac-b4c4-84ce52c7a030_3200x1880.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Their write-up also has a composed example that shows where this is all heading:</p><blockquote><p><em>The primitives above, along with other Claude Code features like <a href="https://code.claude.com/docs/en/auto-mode-config">auto mode</a> and dynamic workflows (research preview) can be composed into a loop for long-running work. For example, to handle incoming feedback, you can use: /schedule (research preview) to run a routine that checks for new reports, /goal to define what done looks like, and skills to document how to verify it. <a href="https://code.claude.com/docs/en/workflows">Dynamic workflows</a> to orchestrate agents that triage each report, fix it, and review the fix. Auto mode so the routine runs without stopping to ask for permission. Putting it together, a prompt could look like this: /schedule every hour: check the project-feedback channel for bug reports. /goal: don&#8217;t stop until every report found this run is triaged, actioned, and responded to. When fixing a bug, use a workflow to explore three solutions in parallel worktrees and have a judge adversarially review them.</em></p></blockquote><h2><strong>What the triage system actually does</strong></h2><p>Inside the PR triage, when I have loops and goals working together for me, what I end up having is a system that allows me to really continue accepting PRs and issues, being able to stay on top of what is coming on my plate every day, and especially being able to cross-reference. That&#8217;s been a really big deal for me. If I want to work on a particular goal of, hey, we&#8217;re going to be redoing this part of the system, and I need to make sure that any issues that happen to touch it are closed as a result of this rework, or we&#8217;re not stepping on anyone else&#8217;s toes, I can make sure that that&#8217;s well defined.</p><p>Scheduled tasks are really useful for regularly just reviewing new PRs and closing things that clearly don&#8217;t fit. One good stopping condition, for example: we have a set of contribution guidelines, and our contribution guidelines include things like, hey, we currently don&#8217;t accept translations. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C9yr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C9yr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 424w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 848w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 1272w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C9yr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp" width="1456" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60110,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp&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_!C9yr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 424w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 848w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 1272w, https://substackcdn.com/image/fetch/$s_!C9yr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0133fdd6-a421-4c8d-a608-f38cb22a6542_1456x846.webp 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And it&#8217;s not that we don&#8217;t care, it&#8217;s that they&#8217;re difficult for us to maintain, because we don&#8217;t speak all the languages often coming in. And so if we tell it, close any issues or close any PRs which happen to touch that aspect of our contribution guidelines, that&#8217;s something that can do really well when it&#8217;s on that schedule. And so it reduces the overall batch of things that we need to review.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6B9N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6B9N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6B9N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png" width="1456" height="855" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:435507,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.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_!6B9N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 424w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 848w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.png 1272w, https://substackcdn.com/image/fetch/$s_!6B9N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dd891d6-13ec-4818-8d23-208a74915c2c_3200x1880.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>What loops don&#8217;t buy you</strong></h2><p>I&#8217;m often asked what loop engineering is not a great fit for. Generally speaking if you don&#8217;t have a clear idea of what the end-state/done/good means for your completion, it may not be the right pattern for your work. For example, a vague goal would be &#8220;keep going until this UI design is good&#8221;. What does that mean? Good to who? How is it being evaluated? Tasks that require human taste, subjective design, or open-ended creative exploration aren&#8217;t a good fit. When you have a pretty clear idea of the goal, I think loops are a good option to consider. </p><p><em>A final message from our sponsor:</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_!jDpE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jDpE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jDpE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg" width="1270" height="760" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/211112800?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jDpE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jDpE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba6f2b6-b8d1-4662-b4ca-83e841310bfb_1270x760.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">Still hand-rolling durable agents? <a href="https://fandf.co/4pVPWbQ">Trigger.dev</a>&#8217;s new chat agent (above) makes a multi-turn AI conversation a single durable task - survives redeploys and crashes, pauses for human approval, resumes exactly where it left off. Open source, TypeScript, drops into the Vercel AI SDK. <a href="https://fandf.co/4pVPWbQ">Check them out</a>. </figcaption></figure></div><h2><strong>The fine print</strong></h2><p>One classic sign that you&#8217;ve got a loop spinning in place is the same command being tried over and over without any change in the result. Give the same command a third time with no change from the second and it&#8217;s probably time to stop.</p><p>One bit of fine print worth knowing. Recurring loops expire seven days after creation. I&#8217;d been telling people this was three days. It&#8217;s seven. And loops are session-scoped, so they stop when you start a new conversation - though resuming that session with --resume or --continue brings back any recurring task still inside its seven-day window. If you need something that outlives your session, /schedule runs it in the cloud.</p><p>If there&#8217;s a check you already run every morning by hand, that&#8217;s your first loop. Mine was the pull request pile.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3QLR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3QLR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 424w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 848w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 1272w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3QLR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:446017,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.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_!3QLR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 424w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 848w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.png 1272w, https://substackcdn.com/image/fetch/$s_!3QLR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91307c12-4fc6-48ed-99ef-2672210998d2_3200x1940.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hKG8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hKG8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hKG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a351633-8c64-479d-b066-811f8d0ec3fb_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;:538053,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/210699556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.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_!hKG8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!hKG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a351633-8c64-479d-b066-811f8d0ec3fb_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Agentic Code Quality]]></title><description><![CDATA[Quality now depends on the constraints you set around your agents.]]></description><link>https://addyo.substack.com/p/agentic-code-quality</link><guid isPermaLink="false">https://addyo.substack.com/p/agentic-code-quality</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Sat, 08 Aug 2026 14:31:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_7mu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>For much of human history, we&#8217;ve evaluated code quality via code review: someone reads what you wrote and makes sure it&#8217;s clean, thoughtful, fast, understandable, and tests well. For agents, that approach doesn&#8217;t scale well; there&#8217;s just too much code for anyone to read. As a result, more and more of our quality checks have to happen in the harness, environment, and operating system around the agent. I still read and review code, but am very intentional about where I am comfortable with constraints as the check.</span></p><p><strong><span>Software quality now depends on the constraints you set around your agents.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yDtq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yDtq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yDtq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png&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;:259005,&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://addyo.substack.com/i/210128469?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.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_!yDtq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!yDtq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d02ba83-d99f-4b3a-be6d-16aa97cdacb3_1920x1080.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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"><strong><span>Speaking of quality, agents are writing your code. </span><a href="https://fandf.co/4fTA599"><span>Sonar</span></a><span> gives you the quality gates to make it shippable.</span></strong><span> I had a coding agent build a slick app, then asked an agent to review it - twice. The reviews disagreed, and a re-run gave a third answer. You can&#8217;t gate a merge on a coin flip. Sonar runs the same complete check on every commit: deep cross-file analysis, a map of where the risk lives, and a quality gate that holds every human and agent to one bar.</span><a href="https://fandf.co/4fTA599"><span> </span></a><strong><a href="https://fandf.co/4fTA599"><span>Try Sonar.</span></a><span> </span></strong><em><span>Sponsored by Sonar.</span></em></figcaption></figure></div><p><span>Constraints define what the system is allowed to do by throwing tests and deterministic constraints at an agent&#8217;s proposals. It&#8217;s by setting and maintaining these constraints that we build loops that reliably deliver high-quality production software, even when agents are creating hundreds of thousands or millions of changes every single day.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LIYS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LIYS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LIYS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png&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;:352841,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/209070908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.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_!LIYS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!LIYS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b1fb5a-7fb9-4dc8-ab2d-6dfa55535801_3840x2160.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><span>We call these constraints quality gates, and they take many forms. They include conventional unit tests, property tests, and acceptance tests. They include mutation testing, where we generate variations of code, run it against the same tests, and make sure that people aren&#8217;t sneaking bugs in that we&#8217;re missing. They&#8217;re metrics around code quality, such as cyclomatic complexity and line length, that help keep things readable. Constraints also play an important role in what proposals the system will accept and apply as code changes. By the time a change proposal moves from the interpreter running the agent to the agent controller and out to production, we&#8217;ve done enough checks on it to be confident that it&#8217;s safe to ship and the impact of its change is well within the scope of the agent.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o1Gn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o1Gn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 424w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 848w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 1272w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o1Gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png" width="468" height="370.2089552238806" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1072,&quot;resizeWidth&quot;:468,&quot;bytes&quot;:172590,&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;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/210128469?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.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_!o1Gn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 424w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 848w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 1272w, https://substackcdn.com/image/fetch/$s_!o1Gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73022fbb-2a6f-417c-b890-ffaab1e0d0d7_1072x848.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">Guillermo's list is a good test for whether you can afford to skip reading. Notice that every "yes" is really a statement about how low the stakes are - no users, throwaway code, prototype. Once the stakes go up, something has to read the code. If it isn't you on every diff then it has to be the constraints.</figcaption></figure></div><p><strong><span>An agent can propose anything. Your constraints decide whether a proposal is safe enough, correct, scoped, and useful, for you and your team to ship.</span></strong></p><p><span>This model offers a lot, but also leaves out many pieces, and those omissions are worth thinking about today. One issue is </span><strong><span>autonomy</span></strong><span>; agents might apply their intentions well, but may fail when there&#8217;s missing information or when what they try to do is ambiguous. That applies both to the task itself and to how it&#8217;s parameterized by the harness, environment, and other components. Many of the reasons that humans fail to ship great code are shared with what agents might do: brittle environments that don&#8217;t hold up under script-driven stress, nondeterministic builds, missing permissions, and weak tests. This motivates a better environment that gives agents trustworthy feedback, allows for low-damage failure modes, and makes it easier to progressively build up success.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rvbK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rvbK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rvbK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png&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;:304537,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/209070908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.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_!rvbK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!rvbK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05eeec2f-00ff-470c-bc96-9c8144d57feb_3840x2160.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><span>The environment we&#8217;re after is one where an agent can do real work, get feedback it can trust, and fail without doing much damage.</span></strong></p><p><span>The other important issue is trust. We can&#8217;t credulously hand off intent to something even as smart and robust as a modern agent without checking for correctness. We start with trust, but it has to be hard-earned.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IcZM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IcZM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IcZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png&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;:337546,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/209070908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.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_!IcZM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 424w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 848w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.png 1272w, https://substackcdn.com/image/fetch/$s_!IcZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e4e2b4-720c-4c67-a954-5f9539d6491d_3840x2160.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><span>Some constraints shape work before it begins. Others give feedback while the agent is working. Others decide whether its output can cross the production boundary at all.</span></strong></p><p><span>There are a bunch of ways to model how we put a verification structure around a system.</span></p><p><span>In my experience it helps to have a broader, but intentionally chosen, set of checks for your constraints instead of solely relying on unit tests. The idea is that each check has a distinct responsibility and that can range from type safety and performance to late-stage security scanning. Folks can define their own constraints too, including architecture rules that linting tools like ESLint can enforce. Many of these tools have built-in hooks that can be used to pull in agents, or humans, when things break.</span></p><p><strong><span>For now, much of the difference between useful agent output and slop still comes down to the skill of the team operating the loop.</span></strong></p><p><span>AI gives us high volume code generation and velocity, but this can also mean it gets harder for humans to review every single change. You have to instead be intentional with where their attention is going. If you put a human check into a system that otherwise moves at machine speed, don&#8217;t be surprised if that impacts productivity. Human attention is scarce and valuable so we should proactively direct it to those most nuanced problems that require our judgment. Downstream humans should only be pulled in when the automated guardrails for constraints break.</span></p><p><strong><span>Human &#8220;code review&#8221; in the future is going to look very different</span></strong></p><p><span>Correctness is one important dimension, but you may care about others as well, like maintainability, performance, security, efficiency, and comprehensibility. Just as correctness decomposes into many signal types, so does the rest of quality. And while it matters how many constraints we have in place, it matters more whether they&#8217;re challenging enough to meet our bar for quality and production readiness.</span></p><p><strong><span>Software quality isn&#8217;t a single metric. Think of it as a collection of signals of varying importance to you and your team.</span></strong></p><p><span>Back-pressure can be implemented through many tools: compilers rejecting invalid code, tests failing, security policies blocking bad practices, CI declining to deploy. Ideally it exists throughout the loop, not as a single review at the very end of all the work.</span></p><p><strong><span>Constraints and back-pressure let agents catch bad work before its a problem</span></strong></p><p><span>What happens if we can&#8217;t apply the constraint because the volume of changes is higher than our tools can consume? We end up building a queue and relying on a verification system that moves at human speed. To scale, we want to push as much as we can into the verification loop throughout and not wait until the end. If we can scale within our automated checks, we can increase the speed and throughput of our entire delivery system. If we run out of room in the verification loop, we need to do one of several things. First, we can scale our verification system and create more capacity to constrain and push back on changes that come in. Second, we can reduce the rate at which agents generate new changes so that verification can catch up to the volume of work. Third, we can lower our quality bar so that verification doesn&#8217;t push back as hard as it otherwise might. From a scaling perspective, we need to be ready to do all of these things. At the same time, we should not stop short of realizing that we could actually get more done by un-constraining in some directions. Maybe we can increase the speed of agent-generated changes by providing swarms of agent developers or automated software factories to create changes without waiting for us to review each of them.</span></p><p><span>And in some places we might want to give them more freedom as long as we keep tighter constraints in others. By providing tighter constraints where we care the most, we can maximize our throughput without sacrificing quality. Throughout these decisions there are many options. Most obviously, we have to trade between different dimensions of quality. As we&#8217;ve emphasized, security is very important, but we&#8217;ve also had to trade between delivering security and delivering a product on time. There is a spectrum from innovation-focused at one end to quality-focused at the other. Somewhere along the way, we have to make choices about where we want to be on that spectrum.</span></p><p><span>We want to send clear feedback from the environment and the system back to our agents or teams, so that people can focus on the more subjective concerns of taste, intent, and architecture. If we can help humans stay inside the safe range of constraints, we can avoid the need for them to work hard trying to figure out where things went wrong.</span></p><p><span>Software quality includes more than just correctness. Software quality also means maintainability, good performance, security, efficiency, and being easy to understand. All the constraints that help us meet these standards and keep our production flowing create back-pressure in our delivery pipeline.</span></p><p><span>We need to make deliberate decisions about where to apply strong constraints and where to remove or relax them. Apply strong constraints where they&#8217;re serving both of these goals. Don&#8217;t support them if they&#8217;re not serving one or both. Be ready to raise or lower standards as the case may require. And remember these constraints at different points in the software system are what make software quality enforceable.</span></p><p><span>We should apply strong constraints where they&#8217;ll serve this dual purpose best and consider removing or relaxing constraints that aren&#8217;t serving either purpose well. We should also be ready to shift quality bars up or down as needed. In effect, these constraints at various points in our software system are what give quality its teeth. In many cases, we can create more back-pressure and more constraints by deploying new tools or strengthening tools that are already in place. All of these things can be used to push back on most change requests. We want to build them throughout the pipeline. We don&#8217;t want to wait until the end of the pipeline when our CI system will simply tell us that we&#8217;re not allowed to deploy without fixing problems. We want to use these signals as early as we possibly can, through every possible pathway. The ultimate constraint in this system is the one we place on ourselves to stand behind the decisions and actions we&#8217;ve taken to build the system and to operate it. But like all other constraints, we need to make thoughtful trade-offs about how much we want our own judgment to restrain, to back-pressure, and to act as a final check.</span></p><p><strong><span>Quality is in the constraints that we place around our agents. So as you&#8217;re thinking about quality for your own apps, take this problem statement and come up with your own constraint-driven plan.</span></strong></p><p><em><span>This article was rated </span><a href="https://www.pangram.com/history/202b457f-9fbc-43f2-9778-70cb96c3a5b4?ucc=tUilR5ia5FA"><span>100% human written</span></a><span> by Pangram 4. A reminder that if you&#8217;re looking for a good starting point for setting up quality gates, </span><a href="https://fandf.co/4fTA599"><span>Sonar</span></a><span> offers a pretty good solution.</span></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_!_7mu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_7mu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_7mu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a341c00f-90bc-4354-abf4-e7a8914719ac_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;:535837,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/209070908?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.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_!_7mu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_7mu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa341c00f-90bc-4354-abf4-e7a8914719ac_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Software Factories, Light and Dark]]></title><description><![CDATA[A software factory is harnessing loops at scale.]]></description><link>https://addyo.substack.com/p/software-factories-light-and-dark</link><guid isPermaLink="false">https://addyo.substack.com/p/software-factories-light-and-dark</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Wed, 22 Jul 2026 03:44:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G0um!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>A software factory is harnessing loops at scale. You can run the loop with humans in it (light factory): trading judgment and concentration against speed and breakage. Or you can ignore the humans (dark factory) and let those agents scope, build and ship code, without anyone really reading the details. But if people stop reading, they&#8217;ll stop understanding your software. Your hardest job now is knowing which checks to build and how much autonomy to delegate.</strong></p><div><hr></div><p>This idea of the software factory is a term that dates back to <a href="https://en.wikipedia.org/wiki/R._W._Bemer">Bob Bemer&#8217;s</a> paper, &#8220;The economics of program production,&#8221; given in 1968. For half a century, many have dreamed of a world in which software is a repeatable and instrumentable production process (analogous to stamping out car parts in a factory) rather than the isolated craft of individuals. Historically, this dream has generally (although not universally) fallen flat, in part because of the difficulty of stamping out ideas.</p><p>But in the last two years, things have changed dramatically enough that now it makes sense to take a fresh look at the old dream. And since some subtleties can easily be glossed over, it&#8217;s worthwhile to be somewhat precise about exactly what is really new and different, and what may be recurring traps, dressed up as new opportunities.</p><p>Dex Horthy, co-founder of HumanLayer recently gave a great talk at AI Engineer World&#8217;s Fair called <strong><a href="https://youtu.be/htM02KMNZnk?t=27219">&#8220;Harness Engineering is not Enough: Why Software Factories Fail.&#8221;</a></strong> worth checking out on this topic.</p><h2><strong>The loop is the atom. The factory is the loop at scale.</strong></h2><p>Structure is everything, and it all starts with small units. The whole stack is really three concepts layered on top of each other: the loop, the harness, and the factory.</p><p><strong>A loop is one agent doing a single job on repeat: gather context, take an action, check the result, and go again until some condition is met. It is the smallest unit of agentic work, and everything above it is just loops stacked on loops.</strong></p><p>The point of <a href="https://addyosmani.com/blog/loop-engineering/">loop engineering</a> is that you stop prompting the agent turn by turn and instead design the small system that prompts it for you.</p><p><strong>A harness is the walls around a loop: the sandbox it runs in, the tools it can reach, the memory that survives between runs, and the gates that decide what &#8220;done&#8221; means. The loop is the behavior; the harness is the environment that behavior runs inside.</strong></p><p>Hand a raw model no harness and it will happily spin forever. The harness is everything around it that makes it useful and safe to run.</p><p><strong>A software factory is many harnessed loops running at once, fed by a queue of work and drained through a review gate into production, with humans owning the whole thing from above. It is not a bigger agent; it is an org chart made of loops.</strong></p><p>The final paradigm shift is moving from writing code to building and running <a href="https://addyosmani.com/blog/factory-model/">the factory</a> that writes it. The unit of work shifts up a level, to the loop, the harness, and the flow between them, rather than the individual code diff.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8LZk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8LZk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 424w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 848w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 1272w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8LZk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg" width="1456" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Loop wrapped into a harness, run many times as a factory&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Loop wrapped into a harness, run many times as a factory" title="Loop wrapped into a harness, run many times as a factory" srcset="https://substackcdn.com/image/fetch/$s_!8LZk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 424w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 848w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 1272w, https://substackcdn.com/image/fetch/$s_!8LZk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F074b17d2-84d6-4d91-82fb-95d158c663ed_1160x380.svg 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">Loop &#8594; harness &#8594; factory. A factory isn&#8217;t a smarter agent; it&#8217;s many harnessed loops feeding one review gate, with a human owning the outer loop.</figcaption></figure></div><h2><strong>The factory, drawn</strong></h2><p>The central slide Dex spent most time on was brilliant because it&#8217;s a clarifying wiring diagram that visualizes what otherwise is an obvious loop. Here&#8217;s my take on it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XqMB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XqMB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 424w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 848w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 1272w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XqMB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The agentic software factory as a closed loop&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The agentic software factory as a closed loop" title="The agentic software factory as a closed loop" srcset="https://substackcdn.com/image/fetch/$s_!XqMB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 424w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 848w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 1272w, https://substackcdn.com/image/fetch/$s_!XqMB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6a14cc-e1f3-41b3-a22d-aaa25d609bf2_1120x560.svg 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">The factory is a closed loop: intent and production signals feed a queue, the harness builds, automated checks and review gate it, deploy ships it, monitoring turns prod back into signals.</figcaption></figure></div><p>Intent flows from the vision of engineering leadership, and directly from engineers, into a queue of things to be done. Signals driven by incidents and user requests drive the same queue. The harness is just the thing that picks an item from the queue and builds a change for it. Beyond the harness, we can see all the automated checks required to make changes safe enough to let into production. These automated checks run at once, effortlessly, without any conscious involvement from engineers, thanks to CI, tests, static analysis, and scanning of all kinds. The only decision point here is the review gate. After approval, changes are deployed and monitored in production, with monitoring data feeding back into the signals that kicked the loop into motion to begin with.</p><p>By and large, every box in this diagram is almost zero cost: generation, tests, scanning. They all run at scale for negligible cost. There is only one expensive box that proves stubbornly resistant to scaling, and that&#8217;s the review gate. That shiny amber box is &#8220;judgment&#8221;, and where the crux of the argument about whether we can make development faster and more frequent resides.</p><h2><strong>Why we call it &#8220;dark&#8221;</strong></h2><p><strong>A dark factory runs with the lights physically off, because the only things on the floor are machines and machines don&#8217;t need light to see. A dark software factory is the same move: code ships that no human has read, verified only by other machines.</strong></p><p>The image is borrowed from manufacturing. Its origins are physical rather than digital, rooted in facilities where the lights are turned off and the work is carried out by robots. <a href="https://en.wikipedia.org/wiki/Lights_out_(manufacturing)">FANUC in Japan has been running lights-out factories of this sort since 2001</a>; Xiaomi, in 2024, opened a heavily automated dark factory of its own. What these have in common is a product assembled and shipped without a single human having read any of it. The &#8220;dark&#8221; comes in when that act of reading is removed from the process.</p><p>I&#8217;m not borrowing the concept for its vibe or as an insult. For all its creepy buzz, &#8220;dark&#8221; here is a simple physical claim: the original factory floor, but without light. In software, the floor is the diff. Whoever wrote the diff, whoever reviewed it, whoever shipped it, those humans are gone, and what remains is a diff verified only by the machines that built it.</p><p>This is a surprisingly easy thing to do, at least at first. It&#8217;s easy because that missing review step gets in the way of everything. Its absence makes your perception of your team&#8217;s vertical throughput seem suddenly and radically higher. It feels as if you&#8217;ve broken the sound barrier. For all its apparent ease, it&#8217;s harder than it seems to survive those dark workflows, with all their buried costs.</p><h2><strong>Harness engineering is not enough</strong></h2><p>The harness of orchestration, sandboxed prototyping, and tool calling as models interact with the world and each other will become increasingly powerful and effective. However, there&#8217;s an inherent in-model failure in trying to keep up with codebase quality over the long game and through additive changes, and I think there&#8217;s good reason to believe that models alone will ultimately lose that battle against <a href="https://addyosmani.com/blog/comprehension-debt/">comprehension debt</a>.</p><p><strong>Comprehension debt is the widening gap between how much code exists and how much any human still understands. A dark factory doesn&#8217;t pay it down; it takes it on as fast as it can, with the tests green the whole way.</strong></p><p>This is an important distinction because models do well at some tasks. But for anything that isn&#8217;t an immediate change to a small part of a codebase, especially in a complex brownfield system, model-only automated coding faces an insurmountable obstacle. Weekend toys and side projects are alike in that a few months of development cycles is usually enough to get things in working order, or at least close enough. But an enterprise system that has been under development for a decade or more is a different beast; it has to be maintained, in a professional environment at a professional pace. Three to six months into a project, you&#8217;re already drowning in unread code. That kind of environment, and especially the constraints enforced by production code, would make even a powerful agent do poorly, all of it in contrast to the vibe-coding enjoyed by developers working on weekend toys.</p><p>Dex reports from experience that this is a major failure, so much so that it required painstaking manual debugging to pinpoint. This came from running a fully automated code factory for about four months, during which no human looked at the code that was written. Underlying the experience is a tradeoff between two conflicting metrics. One is maximizing token utilization, the number we currently treat as progress. The other, which it quietly minimizes, is the amount of the system any human participant still understands at any moment.</p><p>Where the dark factory truly shines is in its ability to burn through pristine code while the tests stay green. The ultimate reckoning, when it comes, will not be a dramatic &#8220;it all goes sideways&#8221; moment. It will be quiet and late.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xTdO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xTdO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 424w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 848w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 1272w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xTdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg" width="1456" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A dark factory pipeline versus a lit factory pipeline&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A dark factory pipeline versus a lit factory pipeline" title="A dark factory pipeline versus a lit factory pipeline" srcset="https://substackcdn.com/image/fetch/$s_!xTdO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 424w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 848w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 1272w, https://substackcdn.com/image/fetch/$s_!xTdO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3361b302-9b6d-498c-9272-348b923cfa68_1120x430.svg 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">Dark and lit are the same pipeline with the lights in different places. The lit version doesn&#8217;t just re-add review at the end - it moves human judgment upstream to design and architecture, too.</figcaption></figure></div><h2><strong>The bottleneck was never generation</strong></h2><p>The fundamental constraint in a software factory isn&#8217;t how much code we can churn out: it&#8217;s how quickly we can verify it.</p><p><strong>Back pressure is the rule that you can only hand a loop as much autonomy as you can cheaply and reliably verify, and not one inch more. Verification, not generation, is the real constraint on a factory.</strong></p><p>Because unbounded generation capacity is in perpetual tension with the finite, non-scaling resource of human attention, the core problem is the gap between cheap generation and bounded review. Look at the funnel: as long as the neck representing verification doesn&#8217;t widen, it&#8217;s going to back up. As Dex points out, volume alone isn&#8217;t the problem: what we&#8217;re really suffering from is a surplus of bad PRs. When you&#8217;ve got high volume without trustworthy gates, manufactured defects are unavoidable. This is just back pressure again: autonomy can&#8217;t expand beyond what can be cheaply and reliably verified.</p><p>The second-order problem is why improving the model shouldn&#8217;t automatically close the gap between what it can generate and what can be verified. Training on well-architected systems is an arguably more difficult proposition than passing simple tests: remember, the cost functions measuring architectural excellence aren&#8217;t measured in seconds or even minutes, but in months and years. Tidy gradients are functionally impossible to compute, so a system expecting crisp, instant evaluation of complex design decisions isn&#8217;t going to be trained on good examples.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SDtO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SDtO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 424w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 848w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 1272w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SDtO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg" width="1456" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Unbounded generation meets a narrow verification gate&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Unbounded generation meets a narrow verification gate" title="Unbounded generation meets a narrow verification gate" srcset="https://substackcdn.com/image/fetch/$s_!SDtO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 424w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 848w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 1272w, https://substackcdn.com/image/fetch/$s_!SDtO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7dc8e38-697c-4735-95b2-e92182ab34b9_1120x400.svg 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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">Generation is a wide mouth; verification is the narrow neck. Speeding up the mouth just deepens the pile at the neck.</figcaption></figure></div><h2><strong>Turning the lights back on</strong></h2><p><strong>A lit factory is the same pipeline with the lights left on where judgment lives. The agents still do most of the building, but a human reads what comes out before it ships, and the lights stay on wherever a wrong call is expensive.</strong></p><p>The lit version doesn&#8217;t tack review onto the end but moves the point of human judgment upstream, to the product, the design, and the architecture before an agent starts a loop.</p><p>One great thing about that upfront hour is that it leads to fewer implementation hours. It turns a long, frustrating code review into a quick read of a two-hundred-line plan. You get to review a decision before it&#8217;s built, so later you aren&#8217;t chasing through two thousand lines of generated code to find out what the decision even was. Some decisions are expensive and long-lived enough that you&#8217;d want a person in on them early, before the cost compounds. Of course, there are still times you look at diffs, even when you&#8217;ve spent time up front.</p><p>You might be thinking that all sounds unglamorous. You&#8217;re right. The safety net is made up of perfectly ordinary architectural practices we&#8217;ve always known about and mostly ignored: good types and method signatures so that mistakes are caught by the compiler instead of in production; test seams where we can pin behavior and make change observable; laying out the code so the next reader, human or model, knows where to find the thing they care about; keeping call stacks short and legible; keeping component boundaries well defined so a change doesn&#8217;t have a huge blast radius; and dependency injection so we can swap out one piece for another. None of it is new. We&#8217;ve always said we care about good architecture. But now that we&#8217;re using automated coding agents, that architecture is finally doing a second job as a cheap and hard-to-fake safety net against the mistakes the agent will make.</p><p>That safety net has to live outside the model, because the model won&#8217;t supply it. The coding agents that feel most capable, Claude Code and Codex among them, are reinforcement-trained against their own harness and tools: fluent with all the tools and idioms of the trade, but not with things like long-term maintainability. The deliberate architecture we&#8217;ve always talked about is the tool that catches that debt, and the investment we make in it is us buying back our autonomy. Put that together with safe infrastructure, and there are some tight, low-risk loops you can run unattended. Horthy described one in a recent post: a nightly GitHub Actions cron that fixes exactly one anti-pattern, a lint violation or a needlessly optional prop, commits, and opens one small pull request, all on its own, so the team wakes up to a slightly better codebase and a diff short enough to read. But for loops with high enough stakes, you don&#8217;t want to risk waking up to a broken auth system, billing engine, or public API contract. Keep the lights on there, and trust that a person with judgment and a real working knowledge of the system will catch the mistake.</p><h2><strong>What earns a loop the dark</strong></h2><p>This rule applies whether you call it back pressure, verification, or the light switch.</p><p>A loop can earn itself fully automated status only if the check is cheap, runs at high frequency, and relies on something that can&#8217;t be easily faked out. Green-or-red oracles, type gates, property tests, and a review agent coupled with a real rubric all fit. You also need the oracle to answer immediately and not drift over time. When done can be proven not just by you but by a machine, you&#8217;ve reached automation.</p><p>Short loops are easier to verify than long ones. <a href="https://github.com/humanlayer/12-factor-agents/blob/main/content/factor-10-small-focused-agents.md">Dex&#8217;s rule of thumb</a>: an agent holds up for three to ten steps, then starts losing the thread past twenty. The reason is context accumulation, the more the agent drags along, the more likely it is to wander off. When a loop is short, verifying it is cheap. Sprawling loops hide mistakes in the corners, which is another way of saying they never earned lights-out status.</p><p>Keeping the lights on is the opposite case. A loop needs to be reviewed if a wrong answer is expensive and only a person can catch it. Subtle production bugs that can&#8217;t be caught by tests, large blast radii, and a decision that&#8217;s going to shape the work of a year or more all qualify. In those cases, <a href="https://addyosmani.com/blog/human-is-the-expensive-part/">your attention is the actual product</a>, the costly, essential one.</p><p>The danger is forgetting to flip each switch and just setting all of them to the same mode. All dark, and you&#8217;re stuck tearing everything down four months later. All lit, and no one can get reviews done in time and you&#8217;re stuck in a gigantic bottleneck. The hard, skilled job is deciding where to put each switch.</p><h2><strong>Loops, graphs or state machines?</strong></h2><p>When you hand an agent a task, you&#8217;re probably going to build a graph around it, whether you call that graph a finite state machine or a set of conditionally-linked service calls. It&#8217;s a framing where the software isn&#8217;t just following some abstract rules but a structured workflow: every node is an explicit step, and every edge between nodes is an explicit condition. </p><p>That sounds like a lot of structure, but most of it is already there in any software, since any code can be expressed as a control-flow graph. So the only real novelty is that an agent insisting on autonomy is really just walking around a particular graph, and its freedom is constrained to the inside of a node. And here&#8217;s the part people forget, which <a href="https://github.com/humanlayer/12-factor-agents">Dex wrote down</a> a year ago: software was always going to have that structure. There&#8217;s a reason we used to draw programs as flow charts. The genuinely new move was trying to throw the diagram away, leaning on a loop where the model picks the path tool call by tool call, until it declares itself done. That felt like liberation, right up until it met a ten-year-old codebase, and the discipline everyone is now rediscovering, owning your control flow, is really just walking the graph back around the loop. So the question of whether we should shift from loops back to graphs is almost an admission that we needed the flowchart all along.</p><p>Here&#8217;s what it looks like in practice. Take a bug to fix. As a pure loop, you sit down and think: figure out what&#8217;s wrong, change some code, run the tests, see what happens, and if that round doesn&#8217;t kill the run, loop back and start again. The whole journey is decided as you go, which problem you chase, the exact code you change, which tests you run and in what order, whether you run tests at all, and whether you try again or declare victory. As a graph, the first thing you do is map out what should happen. Reproduce the bug or go ask for more information, find the cause, try a fix, run the tests, and let a failing run route back to the fix while a passing one goes on to review, where only an approval reaches done. The agent is still clever inside each box; it just can&#8217;t wander off the paths you sanctioned. Santi laid this out with a diagram that makes the difference obvious.</p><p>The real appeal of that graph, of course, is that it&#8217;s back pressure drawn as a diagram. You give up some of the agent&#8217;s freedom and get mandatory checks and legible failure points in return, so when a run dies you can point at the node that killed it. It&#8217;s the same instinct behind Dex&#8217;s blunt line that most so-called agents aren&#8217;t very agentic at all, &#8220;mostly deterministic code, with LLM steps sprinkled in at just the right points.&#8221; And this isn&#8217;t just an artifact of how people happen to be building things right now: you can see the pattern in LangGraph and LlamaIndex Workflows, in Jerry Liu&#8217;s hybrid workflow-graph-over-agents with an outer loop that grows parts of the graph as it runs, and in David Khourshid&#8217;s reminder that this is really just state machines and the actor model turning up in new clothes.</p><p>One clarification, because the term is badly overloaded: when I keep calling this a graph, I don&#8217;t mean a knowledge graph. I mean a predefined directed graph of how the work should flow, conditional edges and all, giving the loop a shape you can actually trust.</p><h2><strong>Where the human actually goes</strong></h2><p>Notice that the person never left the factory. They moved.</p><p>I think engineers need to increasingly own the <a href="https://addyosmani.com/blog/own-the-outer-loop/">outer loop</a>. The agents can investigate a bug, write up the diagnosis, implement a fix, run the tests, and write up a report. That&#8217;s the execution of the inner loop, and they can do it as efficiently as anyone. But that was never the job. The bits you own are what I&#8217;d call the outer loop: decide whether it&#8217;s the right way to address the problem, verify that the diagnosis and implementation are sound, approve the change, and carry the consequences of being wrong. The boundary between the two loops is evidence, the diffs, the tests, the logs, and a brief explanation that connects them. Types, seams, and rubrics make it possible to oversee all this without doing a lot of work for every change.</p><p>I think it&#8217;s useful to put it this way: you&#8217;re not down on the line writing changes any more; you&#8217;re up at the end of the production line designing it and guarding the gate. There&#8217;s a lot you can do to make the model better and the harness more capable, but I&#8217;ve observed that identifying problems that are expensive in the long term is not typically something you can automate away. The core thing that&#8217;s still the job is to exercise human judgment better than any flow of paper and computing power.</p><p>Robots are fine operating in the dark, but humans need to see what they&#8217;re doing. If everything on the factory floor is dark, and you can&#8217;t see anything, and you can&#8217;t even find the light switch, that&#8217;s where the danger is.</p><p><strong>Pangram <a href="https://www.pangram.com/history/d151077c-b4ca-4277-a2fe-75e6cb282f06">scored</a> this article as 100% human written.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G0um!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G0um!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G0um!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G0um!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G0um!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G0um!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/207949243?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G0um!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G0um!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G0um!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G0um!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2867fd41-c596-4b85-bc56-4eb61c03f0e6_2400x1256.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Own the Outer Loop]]></title><description><![CDATA[Why loop engineering needs a human at the boundary]]></description><link>https://addyo.substack.com/p/own-the-outer-loop</link><guid isPermaLink="false">https://addyo.substack.com/p/own-the-outer-loop</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Thu, 09 Jul 2026 14:31:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Sd4F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the past year, the conversation around <strong><span>agentic engineering</span></strong> has moved to <strong><span>harnesses</span></strong> and <strong><a href="https://x.com/addyosmani/article/2064127981161959567?lang=en"><span>loops</span></a></strong>, <strong><span>fleets</span></strong> and <strong><span>software factories</span></strong>. My 2c is engineers need to <strong><span>own the outer loop</span></strong> - the <strong><span>accountability</span></strong> for these systems. This only gets more true as powerful models like Fable and GPT-5.6 become available.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xpZm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xpZm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xpZm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&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="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!xpZm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xpZm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e356d81-8300-4b65-ad66-e73ae74b3fb7_1956x1102.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Agents have leverage, and leverage creates obligations. <strong><span>Someone must be able to explain exactly what changed, why it was safe, and what will happen if they&#8217;re wrong.</span></strong> Otherwise, their actions can&#8217;t be justified. Which makes it unlikely their organization will ask for them in the first place.</p><p>And so I want to talk about three terms. The first, <strong><span>Quality</span></strong>, refers to all the checks we install before we let the system loose. Those checks produce evidence, and from that evidence we derive a Verdict. </p><p>The second, <strong><span>Verdict</span></strong>, refers to the final decision we make before work enters our dependent system: I&#8217;m the line-producer of this content. I run the team whose work is shipped under my name. The model may write the line, but the Verdict is mine. The work of my team will not enter our dependent systems without my decision. A Verdict is the production decision: should we ship, block, redirect, narrow the response, add a guardrail, or reject outright?</p><p>The third, <strong><span>Answerability</span></strong>, refers to the guarantee that if someone asks, I can explain why. </p><p>To say this another way: our agent (which I define as a model plus a harness of files, tools, memory, skills, sandboxes, permissions, observability, and recovery) is what runs our loop (which I define as investigation, implementation, verification, and repeat). And it&#8217;s what creates our software factory.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b5NR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b5NR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b5NR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!b5NR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!b5NR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7df09d3f-8dfb-4fd7-9de4-aa9bb3464d2c_1599x900.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 model is just the engine. The harness - tools, memory, permissions, sandboxes, tests - is the car you build around it so it can do real work safely.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7018!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7018!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7018!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7018!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7018!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7018!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!7018!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7018!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7018!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7018!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48f8bdf1-8d62-465f-aa14-3e34697f31df_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Wrap that harness in a repeatable cycle: investigate, implement, verify, repeat. The loop is how one good run becomes a process you can trust to run again. Wrap that harness in a repeatable cycle - investigate, implement, verify, repeat - where an independent check, not the model&#8217;s own say-so, decides when the work is done.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LODv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LODv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LODv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LODv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LODv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LODv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!LODv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LODv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LODv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LODv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eee1fe-f263-4ef5-af61-930279d183be_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Now run many loops at once. A factory is loops at scale - the agents ship the work inside, while humans own the decisions at the boundary. </p><p>And <strong><span>at the heart of that factory is a careful boundary between what&#8217;s inside the system and what&#8217;s outside it</span></strong>. Inside the system: we collect inputs (from the product team&#8217;s intent, or knowledge of previously shipped work, or of recent incidents, or of specific feedback from users). The agent loop investigates the task, implements a plan, and verifies the result. Then, evidence crosses that boundary. A human, who owns the dependent system, sees the evidence and decides whether to proceed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kqik!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kqik!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kqik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62704113-5908-4335-9a45-f7f62826e366_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!Kqik!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62704113-5908-4335-9a45-f7f62826e366_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And that, friends, is the shift we&#8217;re trying to make. Before, our agents were doing the inner loop of the execution loop. Now they run the inner execution loop. <strong><span>Engineers own the outer loop.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Xt5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Xt5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Xt5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!5Xt5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5Xt5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb190162-deb3-45ca-9ce5-15f31b3a173a_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Inside the system, there&#8217;s really just one kind of thing our agents are doing: capability. The capability to investigate tasks, implement plans, test their results, and report back. That&#8217;s the capability of a model. And as we&#8217;ve said, that future is already here.</p><p><strong><span>Outside the system, there&#8217;s a single kind of thing: agency. The agency to decide, verify, approve, and ow</span></strong>n.</p><p>We&#8217;re still talking about code, you see. It just needs to live in a place and be performed by people who know what they&#8217;re doing.</p><p>The potential for AI code is no longer marginal. In a Sonar 2026 survey, we asked teams about the share of their commits that were AI-assisted. It was small but non-trivial. And several of the respondents said they expect the share of AI-assisted commits to grow substantially. </p><p><a href="https://www.sonarsource.com/state-of-code-developer-survey-report.pdf">Sonar&#8217;s 2026 State of Code report</a> found that 42% of committed code was AI-generated or significantly AI-assisted, with expectations for that share to keep growing rather than plateauing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!auS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!auS_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!auS_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!auS_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!auS_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!auS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!auS_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!auS_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!auS_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!auS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e3fdfd6-602f-497c-b30a-253b1c8b6448_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Creation, in other words, is getting cheaper. Scarcer resources are review, validation, understanding, and maintenance.</p><p>We moved the speed of generation faster than we moved the speed of control. And so we have a trust-verification gap. A lot of people we talk to still express some degree of distrust in AI code. Yet fewer of them seem to consistently build that distrust into their verification processes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LZrj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LZrj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LZrj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d806a630-1380-4968-b6cb-925033278900_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!LZrj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LZrj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806a630-1380-4968-b6cb-925033278900_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And that&#8217;s a dangerous place to be in. We&#8217;re going to need cheaper, clearer ways to verify the trustworthiness of AI code.</p><p>If you look at the GitLab June 2026 report, you&#8217;ll see that governance questions have shifted.</p><p><a href="https://ir.gitlab.com/news/news-details/2026/GitLab-Research-Reveals-Organizations-Are-Generating-AI-Code-Faster-Than-They-Can-Control-It/default.aspx">GitLab&#8217;s June 2026 AI accountability research</a> shows that review and validation are the current bottlenecks when using AI and, more worryingly, that governance usually happens after code creation, after we&#8217;ve accepted the risk and lost control over ownership. Today, it&#8217;s not just about control. It&#8217;s about what constraints we set on the system. It&#8217;s about how we&#8217;ll check the work with evidence, and how we&#8217;ll hold teams accountable. It&#8217;s about who will own what part of the AI lifecycle.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yrrG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yrrG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yrrG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!yrrG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yrrG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4297e539-985a-448e-a8a7-be7099d6e33b_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 the final distinction in this series is between process and quality. Quality is the concept of back pressure. We mean it literally. <strong><span>We don&#8217;t want to grant our agents as much autonomy as they can possibly exercise.</span></strong> We want to grant them just enough autonomy that we have enough back pressure to stop them, regulate them, check their work, and ensure our humanity.</p><p>Ordinary engineering holds up a lot of signals that indicate that the work being done is doing the right thing. Type checks, tests, hooks, sandbox limits, audit logs, monitors. Our engineering systems are full of these kinds of signals, and they&#8217;re designed to provide enough back pressure to keep the system honest.</p><p>And so as long as our agents are emitting these same signals, we can trust our ordinary engineering to provide appropriate back pressure.</p><p><strong><span>Trusting our systems doesn&#8217;t mean we don&#8217;t want a human in the loop.</span></strong> It just means that the human doesn&#8217;t need to be in the inner loop. <strong><span>We want them in the constraints loop </span></strong>(what inputs, architectures, instructions, or invariants should we set?), <strong><span>the sampling loop </span></strong>(how much output should we sample and review?), <strong><span>the audit loop </span></strong>(what evidence should we keep and how do we make sure our audit log is effective?), <strong><span>and the ownership loop</span></strong> (what part of the production boundary should we own).</p><p>But the human doesn&#8217;t need to be in the inner loop.</p><p>The agent can ship more than you can review.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NouI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NouI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NouI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NouI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NouI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NouI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!NouI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NouI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NouI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NouI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059e0a70-bba4-4e96-9a20-0c06d3f7041c_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And the scarce resource is your own core human judgment, informed by quality signals like logs or tests.</p><p>The AI June 2026 report shows that, in the experimental setting, agentic delegation along hour-scale time horizons is essentially here. The work by <a href="https://openai.com/index/how-agents-are-transforming-work/">OpenAI this year on agents and the future of work</a> was a great source for these ideas. So we need to start thinking about how to establish this ownership boundary, as our systems start shipping more than we can review.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zUnE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zUnE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zUnE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!zUnE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zUnE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1c5b533-f5e8-41f9-8091-773fa3f0053d_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And that&#8217;s where the answerability comes in.</p><p>Because with long-horizon agents, the decisions made over hour-scale time horizons are just that - decisions. And not all the decisions are going to be recorded. You can&#8217;t trace them all back to input tokens. If all you&#8217;re doing is trusting that the output you get is the correct choice for the problem at hand, the hundreds or even thousands of human hours of work you&#8217;re going to need to reconstruct the chain of decisions that lead to it become impossible. And so, again, <strong><span>answerability becomes something that must be at the core of our system design</span></strong>.</p><h2><strong>Three hidden costs</strong></h2><p>And there are three hidden costs:</p><p><strong><span>Cognitive surrender ~ blindly accepting what AI gives you.</span></strong> When you delegate work to an agent, the work itself may appear to be the work of the agent. But it&#8217;s actually your work. It&#8217;s your reputation. It&#8217;s your responsibility. And it&#8217;s your software that suffered the defects in the output. And it&#8217;s your software that needs to be changed to reflect that output. So the agent&#8217;s output becomes your answer. And with it comes all the accountability. The <a href="https://executiveeducation.wharton.upenn.edu/thought-leadership/wharton-at-work/2026/05/thinking-fast-slow-and-artificially/">Wharton study</a> that put this together is reassuring when the AI is right. But when it&#8217;s wrong, the news isn&#8217;t great. When the AI was wrong, nearly three-quarters of people accepted it anyway, and felt more confident than they would have without the AI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WpuS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WpuS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WpuS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!WpuS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WpuS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa10723b7-66dc-425c-9f51-82404d97524c_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><span>Cognitive debt ~ erosion of your understanding and memory of how to solve problems.</span></strong> When you delegate work to an agent, you&#8217;re offloading all the thought work to the agent. And while thinking it all out yourself takes time and energy, thinking it out on a massive codebase takes resources that aren&#8217;t available when you&#8217;re trying to run up the learning curve. So the output you get is often unattainable by you. And the longer the time horizon of the agentic planning, the bigger the gap between the code the agent produces and your understanding of it becomes. The gap compounds. The debt accumulates. And the cost of climbing the learning curve grows almost exponentially. There&#8217;s a <a href="https://www.anthropic.com/research/AI-assistance-coding-skills">randomized controlled trial from Anthropic</a></p><p> looking at whether engineers who lean on AI to write code understand it as well as engineers who write it themselves. The conclusion was gloomy: on a comprehension quiz, the engineers who worked through AI scored seventeen percentage points lower than those who didn&#8217;t, 50 percent versus 67 percent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ck4j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ck4j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ck4j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!ck4j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ck4j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb5e5390-dcb8-4548-8edf-c984d9e7cd4f_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And then there&#8217;s the <strong><span>orchestration tax ~ its easy to spin up lots of agents now, but your cognitive bandwidth doesn&#8217;t parallelize in the same way.</span></strong> Steering your agent away from the worst behaviors, sorting the work the agent produces to identify the ones that need your attention, directing it to focus on the work you care about first, verifying your most important constraints and your most dangerous assumptions before you let it run&#8230;</p><p>All of that takes work, and it can&#8217;t be automated.</p><p>There&#8217;s no substitute for human judgment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k1QZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k1QZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k1QZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!k1QZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!k1QZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd03d0198-1c08-4228-a86a-60808b6514ff_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Brownfield systems are especially dangerous here, because the system behavior you have to audit doesn&#8217;t live in the code. It lives in the scars.</p><p>Fixes? Make attention the priority in your architectural decisions. Use worktrees, scopes, and evidence to reduce the coupling between your initial plan and the work that emerges from it. Time-box the effort to resolve unactionable steps. And make change in your software strictly an opt-in permission.</p><p><strong><span>Alpha, decay, and taste: these are the three core patterns that shape careers and performances across domains.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IODM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IODM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!IODM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!IODM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!IODM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IODM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!IODM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!IODM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!IODM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!IODM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7124ca6d-d8b6-4ae5-a301-8a6108324407_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Alpha is the lead part taken up by the highest achiever in the competition, when you&#8217;re playing your highest-value game move. Decays are established patterns that everyone learns through repetition and watching others (plateaus, if you like). Taste is the earliest we can sense the lead in an alpha or the change in a decay. It&#8217;s our judgment of what&#8217;s coming before we have any evidence that anything is happening.</p><p><a href="https://paulgraham.com/taste.html">Paul Graham&#8217;s point</a> is that when anyone can make anything, choosing what to make matters more, and Mitchell Hashimoto&#8217;s definition is the operational one: making high-quality qualitative judgments where no objective metric exists yet. From now on, taste drives everything: alpha shifts are taste changes. And decays fade out because we start to taste something different.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DHgb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DHgb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DHgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!DHgb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!DHgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfa1ebbf-fdd0-428c-bbe1-d084c6094157_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Next step? Operationalize your taste. How? Give it a name that reflects what you&#8217;re trying to move from limbic to conscious. Practice it in critique and examples. Make its rationale explicit.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OoXP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OoXP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OoXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!OoXP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OoXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23017b46-7366-441a-8ee8-630fc3e5d9c6_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And keep making the move that delivers the most durable competitive advantage in your industry. What&#8217;s that? Keep moving the edge up from just doing the task to teaching it, systematizing it, deciding when it should be done, and owning the result.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dXab!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dXab!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dXab!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dXab!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dXab!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dXab!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!dXab!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dXab!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dXab!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dXab!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd9e19f-c380-437c-914f-e35b46998633_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Everyone is a developer, but not everyone is an engineer. Engineering is what a developer turns into when they embrace a work discipline that is more strict: thorough and logically sound reasoning, consideration of constraints and tradeoffs, recognition of risk and exposure, and practical accountability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nfKL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nfKL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nfKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!nfKL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!nfKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb4f1da-9734-4fc0-84f7-6ec9b658e29a_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 future, people will leave the administrative work of engineering and embrace new roles that emerge as engineering becomes more demanding. Roles that are un-bundled from the spirit of craft but make clear what each person does. There will be those who prototype. Those who build. Those who sweep. Those who grow. Those who maintain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z4hg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z4hg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z4hg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7573db5-3a11-455b-879d-3bee32527c17_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!z4hg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!z4hg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7573db5-3a11-455b-879d-3bee32527c17_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 humans hold the edge of the system in the other direction, too. Increasing the alpha in the other direction: choosing what is worth doing, defining the constraints within which it should be done, deciding if the evidence is sufficient to proceed, and caring for the result. Whether it&#8217;s a single team or a hundred teams, this is the edge that only humans can hold.</p><p><strong><span>Accountability will scale the factory. </span></strong>Like attention and taste, accountability is also one of the three dualities that makes everything work. <strong><span>Without accountability, there are no rules. </span></strong>No wrangling with questioners. No trade-offs. No risks. No safety nets. If nobody owns the consequence of a decision, then high agency can only bring chaos.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jj5-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jj5-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jj5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!jj5-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jj5-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e442db-ba5b-4776-b810-b2ee3405290c_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 half-life of an edge is one release, but the half-life of a signature is a career. A signature is your name on the work, such that you feel you can stand behind what was shipped. Skills get you leverage; accountability turns leverage into trust.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!06Qm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!06Qm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!06Qm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!06Qm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!06Qm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7cbf25-edb0-4b6e-80fb-b8ac9fa71529_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Only people can choose. Only people inherit consequence. Agents can be asked to choose, route, merge, and escalate safely inside a policy, but they cannot inherit the consequences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!liae!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!liae!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 424w, https://substackcdn.com/image/fetch/$s_!liae!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 848w, https://substackcdn.com/image/fetch/$s_!liae!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!liae!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!liae!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!liae!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 424w, https://substackcdn.com/image/fetch/$s_!liae!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 848w, https://substackcdn.com/image/fetch/$s_!liae!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!liae!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68023872-c2f5-4aeb-9cd7-31e04e0a2ca1_1698x950.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 codebase should perhaps come with some kind of accountability contract that explicitly states the checklist that was understood when the change was accepted, the evidence that went into the decision, who was accountable for the change, and the system status after the change was blocked. Just like:</p><ul><li><p>Your attention and taste</p></li><li><p>Your evidence, verdict, and ownership</p></li><li><p>Your alpha, decay, and taste</p></li></ul><h2><strong>High agency</strong></h2><p>In a typical agentic workflow, <strong><span>high agency is the art of knowing when to delegate, when to inspect, when to stop, and when to own the result of a process</span></strong>. The ladder of agency runs from low to high: flag a potential problem, investigate it, execute against it, diagnose it, propose solutions, recommend fixes, and resolve the issue. A high rung on the agency ladder is discernment: found it, it&#8217;s not worth fixing, moving on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XzXA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XzXA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XzXA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!XzXA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XzXA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97fb0b1e-5976-4f32-89e3-007832c85763_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>The twelve pillars that hold up the software factory</strong></h2><p>Brownfield is the frontier for factories that hope to scale. All those clever little innovations may not feel like much yet, but the production environment is a lot. When building an entirely new system, it&#8217;s much easier to plan and implement sufficient back pressure mechanisms because you have full control. When you&#8217;re adding intelligent agents to a legacy system, however, it&#8217;s another matter entirely.</p><p>Legacy systems include the entirety of production behavior, future expectations from customers, migration histories, release and budget cycle durations, unspoken assumptions, edge cases, data weirdness, runbook procedurals, and all the scars that accumulated without the will to care for the system.</p><p>To be a steward of brownfield requires a form of durable engineering. Work has to be done to turn implicit knowledge into explicit constraints, keep it coherent across teams and through generations, formalize that knowledge into test procedures and functional specifications, and tie that knowledge to objective evidence. All while ratcheting failure into more learning. Because if the system doesn&#8217;t get the care it has always received, everything will come crashing down.</p><h2><strong>New Work is Real Work</strong></h2><p><strong><span>The work will get more interesting as you scale. Because when everything else is built, people will want to build new things. </span></strong>They&#8217;ll want to employ the alpha and taste they have developed through their craft to design new loops that can be grafted onto the software factory. Or they&#8217;ll want to build greenfield systems that employ all the knowledge of the software factory to one elegant, well meaning, principled effort. They&#8217;ll want to design and implement new forms of evidence that will rise to the level of verification for the new systems. They&#8217;ll want to take care of brownfield systems that are now so complex they need dedicated attention. They&#8217;ll want to design and manage new back-pressure mechanisms. They&#8217;ll want to design new agents. And they&#8217;ll want to build agency.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w5RD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w5RD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w5RD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!w5RD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 424w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 848w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.png 1272w, https://substackcdn.com/image/fetch/$s_!w5RD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64bc0d2-c3e4-431c-94ce-10d74f96aab0_1599x900.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>And, as they do, they&#8217;ll come to see that all this is real work. That&#8217;s a good thing.</p><p>Automation creates bottlenecks. Bottlenecks in production that are worth owning. Because automation gives us control over industrial scale. But there&#8217;s also new bottlenecks that arise from industrial scale. <strong><span>The bottleneck moves from &#8220;can we build this?&#8221; to &#8220;should this exist, can we answer for it?&#8221;</span></strong></p><p>What I&#8217;m suggesting is a practical operating model for scaling agentic engineering. There&#8217;s inner and outer loops. The inner loop is where the work is done. Loops are designed to be as independent as possible. <strong><span>Put all quality assurances and verification inside the loop. Once you&#8217;ve designed and validated the loop itself, the only thing you have left to do is to grant autonomy by putting in place a back-pressure mechanism that acts to control the rate at which the loop is run and its scope of operation. And put humans in their rightful place, on the right decisions.</span></strong> Don&#8217;t treat understanding as a hand-off or a release gate, but rather as a point of decision where humans are primed to provide their insight. And then for every artifact that exists and is fed back into production and into new teams and engineers, leave behind better artifacts.</p><p><strong><span>Build the factory; keep the lights on; make work legible, verifiable, owned.</span></strong></p><p>An agent can write it. But before it reaches users, someone must explain why it should exist, why it&#8217;s safe enough to be part of production, and what they will do when it is wrong.</p><p>That is agentic engineering at the outer loop - that is the work now.</p><p><em><span>Pangram has </span><a href="https://www.pangram.com/history/ae6caccc-b70f-4336-a019-5c3411516871"><span>scored</span></a><span> this article as 100% human written. It was cross posted to </span><a href="https://x.com/addyosmani/status/2074927530482835916"><span>Twitter/X</span></a><span>.</span></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_!Sd4F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sd4F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 424w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 848w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 1272w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sd4F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:747448,&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://addyo.substack.com/i/206209109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.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_!Sd4F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 424w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 848w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.png 1272w, https://substackcdn.com/image/fetch/$s_!Sd4F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49cbb422-812c-4901-9ef9-5fcd3c96db31_2400x1256.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Agentic Autonomy Levels]]></title><description><![CDATA[A working model of autonomy for agentic engineering]]></description><link>https://addyo.substack.com/p/agentic-autonomy-levels</link><guid isPermaLink="false">https://addyo.substack.com/p/agentic-autonomy-levels</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Fri, 03 Jul 2026 14:30:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2N4L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In most conversations about agentic engineering, the action has changed from prompting to <strong><span>operating</span></strong>. Here&#8217;s a frontier looking into the fog: <strong><span>software factories, goals, loops, background sessions, subagents, hooks, sandboxes, agent-approving agents</span></strong>. For many creators of the future, this behavior will be baked into products day-1: Claude Code and Codex expose the shift directly.</p><p>From the engineer standpoint, you&#8217;ll use <strong><span>low autonomy</span></strong> to limit risk and increase reversibility, but use <strong><span>higher autonomy</span></strong> for explicit activities, and fleets of parallel agents safely refactoring massive codebases. The core question about an action is always: <strong><span>what level does this task deserve, and what verification makes that level defensible?</span></strong></p><p>The edge of the frontier is the <strong><span>manager agent</span></strong> that wakes on its trigger, delegating to its helpers while <strong><span>continuously verifying their output</span></strong>, and <strong><span>returning with only the decisions that must be made by a human</span></strong>. Folks using this kind of setup may indeed already be running hundreds or thousands of agents, largely on evergreen codebases. Like most all thinking about autonomy, <strong><span>how you perceive the scale is still different for everyone</span></strong>.</p><p>The scale most often mentioned is from <strong><span>Steve Yegge&#8217;s single-axis ladder </span></strong>mentioned in &#8220;<a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Welcome to Gas Town</a>&#8221; and in The Pragmatic Engineer. It&#8217;s a good reference if you want a number that tells you how AI-native you are: the ladder gives you a single number to measure if you know your trust in a single agent. Here&#8217;s one version of it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hcvt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hcvt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hcvt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg" width="1456" height="1409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1409,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&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="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!Hcvt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hcvt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e5a74-bbd6-44e4-8bd4-f50761d86eec_1554x1504.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 early 2026, even while work began to shift from delegation to orchestration, this was a fairly good proxy for measuring risk. Today, however, <strong><span>many skill sets may have increased significance and leverage when you can run many agents at once.</span></strong> A single rung cannot help you place multi-agent skill.</p><p>Instead, almost every autonomy debate I&#8217;ve seen conflates two questions that should be separated: <strong><span>how far away from yourself are we letting this single agent go, and what is our skill at coordinating many agents?</span></strong></p><p>To capture these two dimensions separately, we&#8217;ll use two axes: <strong><span>agency and orchestration.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gf3I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gf3I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gf3I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/daab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!gf3I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gf3I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaab52b4-1e07-40a3-8426-34a3ea1b8101_1764x1270.jpeg 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>On the agency axis, low includes suggesting candidate actions and <strong><span>waiting for a decision</span></strong>.</p><p>Mid means that the agent is working on a particular task, but <strong><span>scopes what it does</span></strong>, and <strong><span>constantly reports back</span></strong> what it does along with evidence, so you can keep steering it.</p><p>At the <strong><span>high agency </span></strong>end, the agent is <strong><span>working towards a goal</span></strong>, experimenting, learning, testing, finding ways to solve a problem, getting blocked, asking questions, trying different approaches, and returns all of this work in <strong><span>evidence</span></strong>.</p><p>On the orchestration axis, low means one agent, one thread. At mid, you&#8217;ve got several agents, each working in its own worktree, possibly working towards different goals, but isolated. At the high end, you&#8217;ve got an orchestrator that can take a backlog, issue tracker, schedule, or other queue, and turn it into continuous work, and you only need to step in when things fail: &#8220;management by exception.&#8221; Products and features incorporating these ideas include:</p><ul><li><p>Claude Code&#8217;s /plan, /goal, /loop, /background, /batch, /code-review, /security-review modes, subagents, hooks, checkpointing, agent delegation and management practices, background sessions, agent-team patterns, /schedule arguments</p></li><li><p>Codex&#8217;s local/cloud threads, Goal mode, worktrees, Automations, subagents, review panes, GitHub code review, hooks, sandboxing, Auto-review, and rerun</p></li></ul><p>These capabilities don&#8217;t fit onto a single ladder.</p><h2><strong>The climb: three eras and a single stack</strong></h2><p>If you read the ladder bottom-up, you&#8217;re imagining climbing both agency and orchestration at the same time. In effect, the six levels represent three separate eras that we all pass through:</p><p>First, you&#8217;re in the driver&#8217;s seat, and an agent mostly just helps, waiting for you to steer it.</p><p>Second, the agent takes charge of a bounded task or goal, but you&#8217;re still around to steer it and verify what it does.</p><p>And third, in the era of orchestration, the system is capable of running the show, dispatching work across many agents, and you mostly need to step in when things go wrong: &#8220;management by exception.&#8221;</p><p>This makes things simpler, because the vertical position on the ladder neatly captures the two axes (orchestration only kicks in near the top), leaving it as a single steady climb through the rungs. And yet, the climb is still part of a shift that we&#8217;re all going through.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D7Gn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D7Gn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D7Gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg" width="1456" height="1190" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1190,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!D7Gn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!D7Gn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c4b11a-e01f-4b49-87e8-1562ed7ca7fb_1554x1270.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A good day doing engineering includes touching several rungs, sometimes more: it&#8217;s normal to switch between the eras a few times in the course of a task.</p><h2><strong>The six levels in detail</strong></h2><p><strong><span>Level 0: Assist</span></strong></p><p>The agent makes suggestions that are mostly good and often perfect, but you will always decide whether they&#8217;re good enough to act on. Think autocomplete, inline edit suggestions, or hanging around in a chat session discussing a change that nobody has taken ownership of yet. Use for costly errors, tiny changes, or when you&#8217;re forming your own judgment. Verification mostly takes place locally.</p><p><strong><span>Level 1: Supervised action</span></strong></p><p><strong><span>The agent edits or runs commands on your behalf, asking you before executing anything consequential.</span></strong> This is the default posture for most people. It can be done in local sandbox with approvals before applying changes -  where each approval is an independent verification that the change is okay to apply -  or in an interactive session. Failure mode is approval fatigue; all approvals feel the same regardless of what they&#8217;re approving. You might solve this by squinting at the diff, following some heuristics, checking in with another person before approving, or just agreeing to let the agent be responsible. Codex Auto-review solves this problem by delegating the final approval of boundary conditions to a separate reviewer agent.</p><p><strong><span>Level 2: Scoped task delegation</span></strong></p><p><strong><span>Hand off a bounded task to the agent. </span></strong>That task will have a clear goal, constraints, and a working definition of what done looks like. You&#8217;ll stay nearby, able to interrupt, but mostly not involved. This is the center of gravity in the software engineering world. Verification is shifting away from you (you may need to rest and sleep) towards evidence that the agent can produce: passing automated tests, proper types, lint suggestions, screenshots, repro steps, provenance by example, etc.</p><p><strong><span>Level 3: Goal-driven autonomy</span></strong></p><p><strong><span>The agent does whatever it takes to achieve a goal, stopping only when some condition is met.</span></strong> In prompt mode, this means the prompt itself becomes the goal (e.g., &#8220;Can you reduce this page&#8217;s time-to-interactive below 1 second?&#8221;). In Codex, this is Goal mode: the agent cycles through plan-&gt;act-&gt;test-&gt;review steps until it stops meeting success criteria. In Claude Code, it&#8217;s the /goal, /loop, and /schedule commands. For this level to be useful, the stopping condition must be measurable in a way that can be automated.</p><p>Don&#8217;t ask your agent to help with vague, wooly goals like improving user experience in general&#8221; or &#8220;make the codebase more testable.&#8221; Pick something specific, measurable, and automated: find bugs in production that elude static analysis, reduce load time, ensure that we have a strict TypeScript build with no explicit anys, triage all dependencies to keep just those that we understand and which pass our tests, etc. And, finally, to find bugs in production, the agent will need to be in a production-like environment.</p><p><strong><span>Level 4: Parallel delegation</span></strong></p><p><strong><span>Work across many agents in parallel.</span></strong> Each agent works on an isolated slice of the task. The biggest bottleneck at this level is decomposition: defining the right slices to delegate. Supports include: subagents, background sessions, /batch, worktrees, agent teams, etc. Failure mode is false parallelism: running many agents against overlapping slices at once, so instead of more work you get merge conflicts and duplicated decisions. To do this well, agents need to be isolated from one another, each owning their own files and status. Each needs to have its own review queue, as well. And finally, each agent incurs a cost -  in terms of tokens consumed -  proportional to the number of agents running at the same time. On the human side, orchestration tax makes the marginal cost of adding an agent go up after a few.</p><p><strong><span>Level 5: Managed-by-exception orchestration</span></strong></p><p><strong><span>Define what success looks like, and which policies should apply.</span></strong> A manager agent will wake up based on triggers (e.g. new issue, new task, clock), dispatch worker agents, monitor their progress, verify output, retry on failure, escalate to more competent agents or humans when conditions are met, aggregate results, and ultimately return work products (e.g. PRs) and evidence to external systems. Think factory: the issue tracker or backlog is the input, and the product of the factory is the output (i.e. many fixed issues, bugs). Agents work in an appropriately isolated environment with lots of walls (and if needed, escape hatches), and only an operating system -  defined by the manager agent -  defines what the factory is expected to do.</p><p>The design of this operating system is left to the human; OpenAI has proposed a <a href="https://openai.com/index/open-source-codex-orchestration-symphony/">spec</a> for Symphony which has a Linear board at the center: <strong><span>each issue gets its own agent workspace, and the agent continuously ensures that it is making progress towards its goal as defined in a spec file in its own workspace</span></strong>. Human review can be done at the altitude where evidence is generated, but the frontier (i.e. what is most powerful in the orchestration world) is to build continuous agent factories with hundreds or even thousands of agents. At this point in the climb, it becomes increasingly important to have independent verification: separate implementers and reviewers, separate test runners and QA, separate security checks, separate process gates for acceptance.</p><h2><strong>Risk and reversibility set the ceiling.</strong></h2><p>I remember reading an earlier <a href="https://www.anthropic.com/research/measuring-agent-autonomy">Anthropic study</a> on some of the hardest tasks with Claude Code where it asked for clarification more than twice as often as users interrupted. Experienced users (~750 sessions vs under 50) were more likely to auto-approve and interrupt keeping an eye on the progress.</p><p>They also did a lot of broader <a href="https://www.anthropic.com/research/claude-code-expertise">analysis</a> of how people use Claude Code. They looked at ~400K sessions from ~235K people between October 2025 and April 2026. From each session they could figure out the decisions someone makes like how many actions they ask for in each prompt, which of these they choose to auto-approve, how often they interrupt etc. People make ~70% of the planning decisions, but Claude does ~80% of the execution. <strong><span>High autonomy is not about leaving people out of the loop, but moving from having them do every step to having them decide which direction to go next.</span></strong></p><p><strong><span>If we want to determine whether a large AI system is operating with high autonomy, the three questions we should be asking are</span></strong>: </p><ul><li><p>How quickly will we know we&#8217;re wrong about what it&#8217;s doing? </p></li><li><p>How cleanly can we undo what it&#8217;s doing? </p></li><li><p>What would prove we&#8217;re right about what it&#8217;s doing? </p></li></ul><p>If the answer to all three is: not quickly, at great difficulty, and trusting the summary, it&#8217;s not high autonomy.</p><p><strong><span>Every run of an agent should be preceded by a contract that defines what it&#8217;s trying to do. </span></strong></p><p>The goal: what we&#8217;re trying to achieve (not an activity, not the technique, but an outcome). </p><p>The scope: what domain we&#8217;re operating in, and what techniques are allowed. </p><p>Non-goals: what isn&#8217;t part of the objective. </p><p>Tools and permissions: how the agent can interoperate with the world. Stopping condition: when to stop; ideally, a measurable variable. </p><p>Evidence: specific tests, screenshots, logs, database records or other indicators that can be used to confirm something has been done (independent of the agent). </p><p>Escalation: who gets involved in what circumstances (including who runs the agent). </p><p>And budget: a limit on how much time, effort and tokens are to be devoted to the task (tokens are the budget of large AI models - you can also include a limit on the number of times it can attempt the task and a limit on the degree of parallelism).</p><h2><strong>Metrics make autonomy just a little more reliable</strong></h2><p>Deciding on metric after-the-fact is probably not enough. Metrics can be put in place in advance, in a concise doc. And that makes autonomy feel more reliable and makes the leap of faith just a little easier to take.</p><p>While there are many ways to measure success, considering tracking some version of these metrics for each level of autonomy:</p><ul><li><p>Mean time between interventions</p></li><li><p>Longest successful unattended run with accepted work</p></li><li><p>Share of actions run in the sandbox vs escalated</p></li><li><p>Percentage of actions auto-approved vs rejected</p></li><li><p>Mean number of agent actions per human instruction</p></li><li><p>Clarification request rate Interrupt request rate</p></li><li><p>Review time per accepted change</p></li><li><p>Rework rate on each level of confidence</p></li><li><p>Defect escape rate on each level of confidence</p></li><li><p>Token cost per accepted change</p></li></ul><p>Such metrics can tell a story: a single agent kept busy by human handoffs is Level 4 with a dashboard. A conservative agent, unwilling to proceed without automated intake, retries, and decent evidence, is Level 5 with a real gate.</p><h2><strong>Think about readiness</strong></h2><p>Classify work by risk and by how easily it can be undone. Apply autonomy conservatively, rising only as evidence supporting the higher level accumulates. A payment engine refactor protected by strong tests and reviewer agents with a clean rollback path can support much higher autonomy than a documentation automation task lacking any canonical truth. The autonomy level should follow the verification process, not the task name.</p><h2><strong>Four anti-patterns</strong></h2><p>Every system can easily fall prey to these four autonomy anti-patterns unless vigilantly avoided.</p><p><strong><span>Autonomy as status</span></strong> -  an agent&#8217;s autonomy rating becomes a meaningless badge of status. Higher autonomy is treated as proof of capability, not of safety, and agents are run hotter than verification supports. Fix: Praise and reward those who settle on the correct level of autonomy and relentlessly avoid overstepping.</p><p><strong><span>Permission laundering</span></strong> -  the tyranny of approval fatigue leads us to grant AI agents and tools wildly broader access than necessary. Fix: Better boundaries are always a fix, such as sandbox profiles, scoped writable roots, allowlisted commands, hooks, and Auto-review.</p><p><strong><span>Summary substitution</span></strong> -  the agent&#8217;s work summary substitutes for review, assuming the summary is sufficient. Fix: Bundle the same evidence packet as with fully manual reviews (a diff, tests, logs, screenshots, reviewer findings, risks, gaps, etc.) while avoiding cognitive surrender.</p><p><strong><span>Fleet cosplay </span></strong>-  dozens of agents run in parallel, but a human persists in orchestrating every dependency manually. Fix: Shared state, ownership rules, and better dependency tracking gradually reduce the need to coordinate manually. Smaller WIP limits force a focus on encoding and documenting the coordinated steps until orchestration becomes automated.</p><p><strong><span>A calibration exercise</span></strong></p><p>Review the last ten tasks you undertook with agent assistance. For each task, record the autonomy level exercised, the risk involved, how easily the work could be undone, the evidence produced to meet verification requirements, the review time, if any rework was needed, and whether the autonomy level chosen would still be a fit next time.</p><p><strong><span>How to climb safely</span></strong></p><p>Move up one axis at a time. Start with a single supervised agent to do a single scoped task that produces defensible evidence of success (an autonomy level 1, if tidy enough). Then gradually expand in the three orthogonal directions. Parallelize read-heavy exploration tasks (autonomy level 4). Add write agents acting on separate worktrees with constrained file ownership rules (autonomy level 4). Add recurring automations, then agent-led orchestration based on issues, voice, etc. Every step up the lever requires a new set of safety mechanisms (such as new failure modes).</p><p>Name them: Longer single-agent runs can lead to drift, context rot, dropped communication, or strayed objectives. Background work can lead to stale assumptions and weak handoffs. Too much parallel work can lead to merge conflicts or duplicated decisions. Too much recurring work can lead to silent token spend or stale prompts. Managed by exception can lead to long review queues and alert fatigue. Fix not trusting harder; instead, narrow scope, ensure better evidence, enable cheaper rollback paths, harden gates, and define clearer ownership rules.</p><p><strong><span>Use the autonomy level:</span></strong></p><ul><li><p>Level 0 is best for delicate work and when judgment is still being formed.</p></li><li><p>Level 1 is best for most exploration, if the work is done close to the boundaries of what is well-understood.</p></li><li><p>Level 2 is best for most bounded tasks, knowing there may be unknown depends and unforeseen gotchas.</p></li><li><p>Level 3 is best where the success conditions can be stated with sufficient clarity.</p></li><li><p>Level 4 is best when the work can be cleanly split across these success conditions.</p></li><li><p>Level 5 is best once the coordination and communication needed across the various success conditions is fully encoded.</p></li></ul><p><strong><span>Verification will always be the bottleneck.</span></strong></p><p>Despite current bravado and current tooling, the mature posture of an engineering team working with AI agents is <strong><span>calibrated autonomy</span></strong>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dsls!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dsls!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dsls!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dsls!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dsls!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dsls!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!dsls!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dsls!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dsls!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dsls!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b4446d8-b988-46b5-91fe-2d44ac921a51_1900x1066.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 near future, we&#8217;ll want to design loops that know when to work, when to verify, and when to ask -  but <strong><span>the skill of the engineer will still lie in choosing the right level of autonomy and in building patterns and defensible evidence that guard against its darker corners</span></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2N4L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2N4L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2N4L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg&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;:52241,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/204795713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2N4L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2N4L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5a99c5-704d-45ee-93fb-3d51a232a19c_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Agentic Code Review]]></title><description><![CDATA[Why review is the most leveraged skill in software right now.]]></description><link>https://addyo.substack.com/p/agentic-code-review</link><guid isPermaLink="false">https://addyo.substack.com/p/agentic-code-review</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Tue, 16 Jun 2026 14:31:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ya4s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Coding agents are extraordinarily good now and getting better fast. The interesting consequence is that <strong>the hard part of engineering moved from writing code to deciding whether to trust it, which makes review the most leveraged skill in software right now</strong>. How you approach it depends enormously on who you are: a solo developer with no users and a team maintaining a ten-year-old application are not solving the same problem.</em></p><p>I am more optimistic about agentic engineering than I have ever been. The agents are genuinely good, they get better every month, and on an ordinary week I now ship things I would not have attempted in the same time a year ago. This write-up is a map of where the interesting work went, because it did move, and most teams have not fully caught up to where.</p><p>Code review used to work because of a happy accident of relative speed. A senior engineer could read code faster than a junior could write it, so review kept pace without anyone designing it to, and the team absorbed how the system fit together as a side effect of reading each other&#8217;s diffs. A lot of that was not deliberate. It fell out of a single fact: writing code was the slow, expensive part, and reading it was cheap and fast.</p><p>That fact no longer holds. An agent will produce a thousand lines of often solid, well-formatted code in less time than it takes me to read this paragraph, while a human&#8217;s reading speed has not changed since roughly the day we started staring at screens for a living. So the constraint moved downstream, to the one step that did not get faster: a person being confident the change is right. I do not think that is a loss. It is the most leveraged place in software to be good right now, and it is where I have put most of my attention this year.</p><p>There is a happy twist here that shapes the rest of this piece. <strong>The same tools generating all that extra code are also the best thing I have for keeping up with it. </strong>On my own projects, including the popular open-source ones, I now point Claude Code or Codex at a batch of incoming PRs and have them triage the queue for me, and that has genuinely changed how I spend my time. So this is not an anti-AI argument, and I will come back to exactly how I use it.</p><p>It is also not a data dump, and not another round of whether letting a model write your code is wonderful or the end of the craft, because that framing is useless. The only answer that survives contact with a real codebase is that it depends entirely on who you are. A developer vibe-coding a side project a dozen people will ever run, and a team keeping a ten-year-old enterprise system alive for another quarter, share almost no constraints worth naming, and most of the advice in circulation is really one of those two people telling the other how to live.</p><h2><strong>What the 2026 data actually shows</strong></h2><p><strong>The productivity gains from AI are real, but raw output overstates them: about four times the code for a tenth more delivered value. The gap between those numbers is review work, which is exactly why review is where the leverage now sits.</strong></p><p>For a couple of years this was anecdote and argument. It is now measured at scale, by organizations with no shared agenda and in several cases competing commercial interests, and the measurements keep pointing the same way: AI pushes output sharply up, and pushes both quality and reviewability down.</p><p><a href="https://www.faros.ai/blog/ai-acceleration-whiplash-takeaways">Faros AI</a> instrumented 22,000 developers across 4,000 teams and tracked what happened as teams moved from low to high AI adoption. This is March 2026 data, about as current as anything here. The upside is real and worth stating plainly: developers merge considerably more PRs and complete more work, and throughput per engineer climbs. Then the rest of the report:</p><ul><li><p>code churn up <strong>861%</strong></p></li><li><p>the incidents-to-PR ratio up <strong>242.7%</strong></p></li><li><p>the per-developer defect rate up from <strong>9% to 54%</strong></p></li><li><p>median review <em>duration</em> up <strong>441.5%</strong>, with time-to-first-review and average review time both roughly doubling</p></li><li><p>PRs merged with <strong>zero review up 31.3%</strong></p></li></ul><p>The last figure is the one I find hardest to dismiss, because nobody chose it. There was no decision to stop reviewing. <strong>Reviewers simply could not keep pace with the volume, so code began merging unread, and that became normal. </strong>The detail I keep returning to is that teams with mature, disciplined engineering practices were hit just as hard as everyone else. Good process did not protect them, because the volume arrived faster than any process was designed to absorb.</p><p>One caveat to hold throughout: CodeRabbit and Faros both sell into this market, so their framing is not disinterested. That does not make the numbers wrong, the effect sizes are large and consistent across unrelated sources, but vendor research deserves to be read with that in mind.</p><p><a href="https://www.businesswire.com/news/home/20251217666881/en/CodeRabbits-State-of-AI-vs-Human-Code-Generation-Report-Finds-That-AI-Written-Code-Produces-1.7x-More-Issues-Than-Human-Code">CodeRabbit</a> studied 470 open source PRs in December 2025, 320 AI-coauthored and 150 human-only, and found the AI changes carried roughly <strong>1.7x more issues</strong>: logic and correctness problems up about 75%, security issues 1.5 to 2x more common, readability problems more than tripling. Their AI director David Loker described these as &#8220;predictable, measurable weaknesses that organizations must actively mitigate&#8221;. Predictable is the operative word. These are known, locatable weaknesses, which is good news: it means a review process, human or automated, can be aimed straight at them.</p><p><a href="https://www.gitclear.com/research/ai_tool_impact_on_developer_productive_output_from_2022_to_2025">GitClear</a> has interesting data here too. In their productivity data through 2025, daily AI users produce around <strong>4x the raw output</strong> of non-users, but measured against their own output a year earlier, the real productivity gain is only about <strong>12%</strong>. You are generating roughly four times the code for something like a tenth more delivered value, and a human still has to review all four times of it. To GitClear&#8217;s credit, Bill Harding is explicit that some of even that 12% is selection bias, because stronger developers concentrated in the AI cohort. The gap between 4x the code and a tenth more value is the review problem stated in one line.</p><p><a href="https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/">GitHub</a> reports that Copilot review has now run over 60 million reviews, a 10x increase in under a year, and more than one in five reviews on the platform involves an agent. This is no longer a niche practice. It is how code gets made.</p><p>Four datasets, four methods, one conclusion. We poured machine-speed output into a system built for human-speed work. The bottleneck did not disappear; it <a href="https://addyosmani.com/blog/verification-bottleneck/">moved to verification</a>, and review is where that bill comes due.</p><h2><strong>Everyone is solving a different problem</strong></h2><p><strong>How much review a change needs depends almost entirely on its blast radius, and most advice you read was written by someone operating at a very different one.</strong></p><p>Almost all the alarming data above comes from enterprise telemetry and from open source maintainers being overwhelmed. It is entirely real if that is your situation. If you are one person shipping something a handful of people will ever run, much of it simply does not apply to you, and you should not be made to feel otherwise.</p><p>Three variables determine where you sit:</p><ul><li><p><strong>blast radius</strong>: what happens when it breaks. Nothing, or angry users and money and PII on the line.</p></li><li><p><strong>how long the code lives</strong>: a throwaway prototype you might rewrite next week, or a codebase you will maintain for years.</p></li><li><p><strong>how many people need to understand it</strong>: just you holding the whole thing in your head, or a team that has to share ownership over time.</p></li></ul><p>Run the same diff through those three and &#8220;good review&#8221; means genuinely different things.</p><p>If you are working solo on a greenfield project with no users, review&#8217;s second job, distributing knowledge across a team, does not exist for you. You are the team. </p><p>The reasonable move is to lean hard on <a href="https://addyosmani.com/blog/verification-bottleneck/">tests and automation</a>, review the parts that genuinely matter, and accept a lighter touch on the rest. Duplication and churn cost far less when the code may not exist in a month and nobody is paged at 3am when it breaks. The catch, and people learn this one painfully, is that it only works if the tests are real. Skipping review without a safety net does not remove the work, it <a href="https://addyosmani.com/blog/intent-debt/">defers it</a> at a higher price, and standards slip when no one is there to push back. No users is permission to defer review. It is not permission to skip verification.</p><p>Then the project gets users. This is the dangerous middle, and the crossing is rarely noticed at the time. Review&#8217;s bug-catching role suddenly matters, because bugs now hurt people, and its knowledge-sharing role switches on, because it is no longer only you. Teams keep their solo-era habits a few months too long, and then there is a postmortem and the Faros numbers stop being a chart and become their own dashboard.</p><p>At the far end is the large organization with an old codebase and many users. Here every alarming figure lands at full strength. A change nobody understood is <a href="https://addyosmani.com/blog/comprehension-debt/">comprehension debt</a> that becomes someone&#8217;s on-call incident. Review is doing several jobs at once, and the volume of agent output quietly breaks all of them. The Faros finding about mature teams is aimed squarely here.</p><p>So the point is not &#8220;enterprises should be cautious and solo developers can relax&#8221;. It is that the purpose of review changes with your position, so the rules have to change with it. Bolt an enterprise&#8217;s locked-down, multi-agent, evidence-required pipeline onto a two-person prototype and you have added friction for no benefit. Run &#8220;tests pass, ship it&#8221; on a payments system and you have built an incident generator with a green checkmark on top. Most bad advice in this space is one position on that spectrum prescribing to another.</p><h2><strong>What review is actually for now</strong></h2><p><strong>Review was built to check an author&#8217;s reasoning and catch bugs + knowledge share with the team. An agent does reason, but that reasoning is usually thrown away rather than attached to the code, so the reviewer has to reconstruct a rationale that never made it into the diff. The good news: that is a tooling problem, and capturing the reasoning makes review dramatically easier.</strong></p><p>This is the part that genuinely changed, and I think it is underappreciated.</p><p>When a human writes code, intent comes along for free. The reasoning, the alternatives weighed and discarded, lived in the author&#8217;s head, and review was you checking that reasoning. Modern agents do reason, often visibly, producing thinking traces and weighing options and explaining themselves as they go. The catch is that this reasoning is usually discarded the moment the diff is produced. It is rarely captured, rarely attached to the PR, and in any case it is the agent&#8217;s reasoning about how to implement the task, not a human&#8217;s judgment about whether it was the right task to begin with. So review shifts from checking reasoning that sits in front of you to reconstructing intent that never got written down, which is harder and slower, and we keep acting surprised that it takes <a href="https://www.faros.ai/blog/ai-acceleration-whiplash-takeaways">441% longer</a>.</p><p>A 2026 paper, <a href="https://arxiv.org/html/2604.16754v1">AI Slop and the Software Commons</a>, analyzed 1,154 posts across 15 Reddit and Hacker News threads where developers discussed &#8220;AI slop&#8221;. One line from a developer caught my eye: reviewing an agent&#8217;s PR made them &#8220;the first human being to ever lay eyes on this code&#8221;.</p><p>That points straight at the fix. <strong>In normal review the author already understood the change and you were checking their work. With an agent PR, nobody has reconstructed the why yet. The reviewer is the first to try. </strong></p><p>As the paper puts it, review &#8220;wasn&#8217;t built to recover missing intent&#8221;. The encouraging part is that missing intent is recoverable: the reasoning existed, we just discarded it. Have the agent state what it was trying to do and what it ruled out, capture that <a href="https://addyosmani.com/blog/intent-debt/">as a decision log</a> on the PR, and a large part of the reconstruction cost disappears. This is a tooling problem, and tooling problems get solved.</p><p>None of which makes &#8220;have the AI review the AI&#8221; a complete answer on its own. A second model with different priors genuinely catches real bugs, and it catches a lot of them, which is why you should run one. What it does not supply is the human judgment about whether this is the right change to build in the first place. That judgment stays with a person, and it happens to be the most interesting part of the job, the part worth keeping.</p><h2><strong>The tools are good, but not always for the reason they advertise</strong></h2><p><strong>The current AI reviewers are genuinely good, and they occasionally don&#8217;t flag the same lines as each other, so the right move is not picking the best one but running two that are built differently.</strong></p><p>The dedicated AI review tools are good now, and I think you should be running at least your main coding agent if not a dedicated review agent on everything, side projects included. </p><p><a href="https://www.coderabbit.ai/">CodeRabbit</a> is the most widely deployed and topped the independent <a href="https://www.coderabbit.ai/blog/coderabbit-tops-martian-code-review-benchmark">Martian benchmark</a> (January to February 2026) on F1, around 49% precision with the best recall in the field.</p><p><a href="https://www.greptile.com/">Greptile</a> trades precision for recall: around an 82% bug-catch rate against CodeRabbit&#8217;s 44% in one benchmark, at the cost of more false positives.</p><p><a href="https://claude.com/blog/code-review">Anthropic&#8217;s Code Review</a> reports under 1% of its findings marked incorrect by their engineers, and the figure I would actually show a manager: it raised their internal rate of PRs receiving a substantive review from 16% to 54%. The long tail of changes that used to get a glance and an approval now gets read by something.</p><p>The most useful result I have seen this year is not from a vendor. An engineer <a href="https://dev.to/_vjk/best-ai-code-reviewer-in-2026-we-ran-4-in-parallel-for-3-weeks-146-prs-679-findings-1c0f">ran four reviewers in parallel</a>, CodeRabbit, Sentry Seer, Greptile and Cursor BugBot, across 146 real PRs and 679 findings over three and a half weeks:</p><blockquote><p>Of 617 distinct flagged locations, <strong>93.4% were caught by exactly one of the four tools</strong>. 6% by two. Almost none by three. <strong>None at all by all four.</strong></p></blockquote><p>The four tools never once flagged the same line. Each was strong at a different class of problem: Greptile with near-zero false positives on correctness and architecture, CodeRabbit with the widest net and one-click fixes, Seer best on production-failure severity. That is the adversarial review argument demonstrated on a real codebase rather than in a paper. Heterogeneity is the whole point. Four copies of one model is a single reviewer with a larger invoice, whereas four genuinely different reviewers surface a set of bugs no single member could find alone, the human included.</p><p>In practice: do not agonize over the single best tool, there isn&#8217;t one. At the high-stakes end, run two with deliberately different characters (the experiment above paired Greptile for everyday correctness with Seer for production-failure severity, with almost no overlap). If you are solo, one good reviewer plus real tests is plenty. And whatever the marketing says, measure it on your own code, because every one of these results was specific to a particular codebase, and yours will be too.</p><h2><strong>Should we just let AI review more of it?</strong></h2><p><strong>The machine is already reviewing more of your code than you are. The only real decision left is whether you do that deliberately, and the amount of human you keep should scale with your blast radius.</strong></p><p>I keep hearing a question that would have been heresy a year ago, now from experienced engineers: should the machine be doing more of the reviewing, perhaps most of it? I no longer think that is a foolish question.</p><p>The uncomfortable part is that AI review works. Under 1% of Anthropic&#8217;s findings are marked wrong, the tools catch bugs humans read straight past, and they do not get tired on the thirtieth PR of the day, which is exactly when a human is least reliable. Meanwhile humans are visibly not keeping up: zero-review merges are up 31% and review times are up triple digits. In a real sense the machine is already reviewing more of the code than we are. The honest framing is not &#8220;should we let AI review more&#8221; but &#8220;AI is already doing it, are we going to be deliberate about that or let it happen by default while pretending humans still read everything&#8221;.</p><p><a href="https://addyosmani.com/blog/loop-engineering/">Loop engineering</a> sharpens this. The premise of a loop is that you stop being the person who prompts the agent and instead build a system that prompts it, and a central part of that system is a judge: an agent that decides whether the work is done before moving on. The reviewer is the next role being designed out of the inner loop, on purpose. We spent a year automating the writing, and the loops are now automating the checking, and the human keeps getting pushed up and out. &#8220;Where does the human stay&#8221; is not a seminar question, it is something you decide every time you wire up a loop, whether or not you realize you are deciding it.</p><p>Where I currently land is: the answer may not be &#8220;a human reads every line&#8221;. That is over. But it is also not &#8220;let the loop review itself and walk away&#8221;. When an agent writes the code, another reviews it and a third judges it, you have a closed loop of models with broadly correlated blind spots, especially when they come from the same family, confidently agreeing in the same places. A confident &#8220;looks good&#8221; with no human anywhere in it is <a href="https://addyosmani.com/blog/cognitive-surrender/">borrowed confidence</a>: the system&#8217;s certainty becomes yours, and nobody actually understood anything. The loop can be both very sure and very wrong, with no human left to tell the difference.</p><p>So the human does not leave; the human moves up a level. You stop reviewing every diff and start owning the parts that do not transfer to a model. Accountability matters.</p><p>The judgment of whether this is even the right change to build, as distinct from whether the code is correct. The high-blast-radius gates where being wrong is expensive. And the awkward one: the behavior nobody specified, because a model reviews the code that exists and rarely flags the requirement that nobody thought to write down, which remains <a href="https://addyosmani.com/blog/comprehension-debt/">a human-shaped gap</a> I do not expect to close soon. </p><p>Human in the loop becomes human on the loop: sampling, spot-checking and auditing the system rather than reading every PR, and spending your limited attention where being wrong would actually hurt.</p><p>This is already how I work on my own projects, including the open-source ones that now see more PRs in a day than I could carefully read in an evening. I point Claude Code or Codex at a batch of incoming PRs and ask for a first pass: a high-level read of what looks safe to merge, what needs more work, and what is genuinely high-risk. I do not auto-merge on the result, and I do not lazy-merge whatever it approves. What it gives me is a way to allocate attention. I can spend a few minutes confirming the changes it considers low-risk, and put real, careful time into the ones it flags as dangerous. The detail that matters is that this is not my old review hour made slightly faster. It is a different shape of hour, and at the volume I now deal with, it is the main reason the queue stays survivable at all.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!svQQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!svQQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!svQQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg&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;:null,&quot;alt&quot;:&quot;Claude Code and Codex running side by side, each producing a risk-sorted summary of a batch of pull requests on one of my projects.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Claude Code and Codex running side by side, each producing a risk-sorted summary of a batch of pull requests on one of my projects." title="Claude Code and Codex running side by side, each producing a risk-sorted summary of a batch of pull requests on one of my projects." srcset="https://substackcdn.com/image/fetch/$s_!svQQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!svQQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff13550e1-9671-4bf2-8cf0-80c9e9cc92a5_2400x1350.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>&#128247; <em>Codex and Claude Code giving me a first-pass, risk-sorted read of a batch of PRs. The triage is the help. The merge decision stays mine.</em></p><p>A more extreme version of the same move is Kun Chen, an <a href="https://creatoreconomy.so/p/how-this-ex-meta-l8-engineer-ships-40-prs-a-day-with-ai-kun-chen">ex-Meta L8 engineer now shipping around 40 PRs a day as a solo builder, who has largely stopped reviewing code</a> as told to <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Peter Yang&quot;,&quot;id&quot;:6052627,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2dbd75e-1c5a-48ab-94ef-b24caea63cdf_1024x1024.png&quot;,&quot;uuid&quot;:&quot;05bc43fe-a18e-4a69-90eb-4598109c6a8b&quot;}" data-component-name="MentionToDOM"></span>. It would be easy to dismiss this, except he is an L8, unusually good at the thing he stopped doing, which is what makes it interesting. He runs 20 to 30 agents in parallel and has moved his effort into the plan: he writes detailed plans up front, the agents run for hours against them, and he says plan quality determines how long they can run unattended. That is the move I described above. It is worth being precise about what actually happened, because it is not that he stopped verifying. The intent did not vanish, he wrote it down himself in the plan, so the &#8220;first human to ever lay eyes on this&#8221; problem is half-solved: a human did understand the why, just up front rather than after. And he did not work without a net, he built an automated review gate (he calls it No Mistakes) that checks the code before it merges, and he stays on escalation when an agent gets stuck. The human does the expensive thinking before the code exists and the machine does the line-by-line afterward, which may well be the shape of where this goes.</p><p>But he is a solo builder with no large team and no decade-old system full of landmines beneath him. The exact conditions that make 40 PRs a day without review rational for him are conditions most readers do not have. Copy his workflow onto a team shipping to many users and you reproduce the Faros numbers on your own dashboard. He is not wrong; he is a long way down one specific end of the spectrum.</p><p>Which is the spectrum point again. Solo with no users: letting AI review almost all of it is a defensible 2026 position, and you should not feel guilty about it. Maintaining something large for many people: let the machine handle the first pass, the second pass and the boring 90%, but keep a real human on the load-bearing paths and do not let the loop close completely on anything that can hurt someone. How much human you keep is a dial, and you set it by blast radius, not by guilt.</p><h2><strong>What to actually do</strong></h2><p><strong>Stop reviewing everything to the same depth. Spend scarce human attention only where being wrong is costly, and let cheap deterministic gates and AI reviewers handle the rest.</strong></p><p>The organizing idea is to match review effort to the cost of being wrong, push the cheap deterministic work as early as possible, and reserve human attention for what only humans can do.</p><p><strong>Tier by risk, not by author.</strong> A config change earns a linter and a glance. A revision to your core business logic path earns the full stack: types, tests, two different AI reviewers, a human who owns that system, and a security pass. Do not spend a heavy review on boilerplate, and do not wave through a big change because the tests are green. The <a href="https://addyosmani.com/blog/verification-bottleneck/">layered approach</a> is the same everywhere; what changes is how many layers a given diff has to clear.</p><p><strong>Fast-fail the expensive tail.</strong> The most useful recent finding for teams drowning in agent PRs is <a href="https://arxiv.org/html/2601.00753">Early-Stage Prediction of Review Effort</a> (January 2026), which studied 33,707 agent-authored PRs. Agents are good at small, well-defined changes, around 28% merge almost instantly, but they tend to &#8220;ghost&#8221; the moment they get subjective feedback, abandoning the back-and-forth that review actually is. (A companion 2026 paper found <a href="https://arxiv.org/html/2601.15195">reviewer abandonment accounted for 38% of rejected agent PRs</a>.) The researchers built a &#8220;circuit breaker&#8221; that predicts high-maintenance PRs from cheap signals like file types and patch size before a human looks, and it works well. Triage agent PRs up front, fast-track the trivial ones, and do not let a person sink an hour into a sprawling change the agent will abandon as soon as you push back.</p><p><strong>Raise the bar for what you will even review.</strong> The fix for being buried is not locking down the repository, it is <a href="https://www.builder.io/blog/developers-drowning-in-ai-prs">refusing to review changes that arrive without evidence</a>. Require, before review: a statement of what the change is for, a diff that is not 3,500 lines with no comments, the test output, and proof it was actually run. This is how you stop being the first human to read the code. You push the intent-reconstruction work back onto whoever submitted it, where it is cheap, rather than absorbing it yourself, where it is expensive.</p><p><strong>Keep PRs small, deliberately.</strong> Agent PRs run large, <a href="https://www.faros.ai/blog/ai-acceleration-whiplash-takeaways">51% larger on average</a> in the Faros data, and reviewer engagement is one of the strongest predictors that a PR merges at all. A large unreviewable PR gets <a href="https://addyosmani.com/blog/comprehension-debt/">rejected outright</a> or, worse, rubber-stamped. Instruct your agents to produce small commits. A diff a human can actually read is now a design constraint, not a courtesy.</p><p><strong>Read the test changes more carefully than the code.</strong> This is the agent failure mode to watch. The agent changes behavior, then &#8220;fixes&#8221; the test by rewriting the assertion to match the new, broken behavior. A green check over 200 edited tests means nothing until you have confirmed the edits were correct. Treat any diff that rewrites many tests as a flag and read those first. Mutation testing earns its place here: coverage tells you a line ran, mutation testing tells you whether the test would notice if that line were wrong.</p><p><strong>Treat CI as the wall that does not move.</strong> Watch for the patterns <a href="https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/">GitHub now warns reviewers about</a>: removed tests, skipped lint, lowered coverage thresholds, a duplicated helper that already exists elsewhere, and untrusted input flowing into a prompt. That last one deserves emphasis, because agent-built features are a fresh source of <a href="https://simonwillison.net/series/prompt-injection/">prompt injection</a>: if a change pipes user-controlled text into an LLM call without thinking about what that text can instruct the model to do, the vulnerability is not visible in the diff, it is latent in the data that will arrive later. Agents will also weaken CI to make themselves pass, not maliciously, just gradient descent finding the cheapest path to green. Deterministic gates are the one part of the pipeline that cannot be talked out of their verdict by a confident paragraph, so keep them strict.</p><p><strong>A human owns the merge.</strong> A model cannot be paged and cannot be held responsible for what it shipped, so whoever clicks merge owns it. When an AI review says &#8220;looks good&#8221; in a calm, confident voice, it is handing you <a href="https://addyosmani.com/blog/cognitive-surrender/">confidence it has not necessarily earned</a>. Treat every AI review as a sensor, not a verdict: data, not a decision.</p><p>If you are solo with no users, the tiering, the test-change discipline and CI are most of what you need; the rest is overhead until people show up. If you are the large organization, all of it is the baseline, and the triage and intake bar are the difference between a review process that scales and one that quietly collapses.</p><h2><strong>What this means if you run a team</strong></h2><p><strong>The bottleneck is no longer how fast you write code, it is how fast a trusted human can be confident in a review. Cutting the people who provide that confidence because &#8220;AI made us faster&#8221; simply converts the saving into future incidents.</strong></p><p>The binding constraint on shipping is no longer how fast you can write code. It is how fast a trusted human can be confident a change is correct. Any plan that treats generation as the bottleneck and review as free will quietly stall, with the velocity dashboard staying green the whole way.</p><p>The Faros report is direct about this: QA and review work rises even as output rises, so reducing engineering headcount because &#8220;AI made us faster&#8221; is dangerous unless you have closed the review gap first. The senior-engineer tax, review time up by triple digits, falls hardest on the people you can least afford to bottleneck, and it is invisible to any metric that only counts merged PRs.</p><p>Open source maintainers hit this wall first and hardest. The <a href="https://arxiv.org/html/2604.16754v1">steady stream of plausible but hollow contributions</a> costs real triage time even when it is well-intentioned, and that is the canary. Companies are next. The ones handling it well treat review capacity as a real resource to be measured, protected and spent deliberately, not as slack that AI has freed up.</p><h2><strong>Writing got cheap, understanding didn&#8217;t</strong></h2><p><strong>Code review did not become less important when agents arrived. It became the central activity. Writing code is increasingly solved and getting cheaper by the month; the durable advantage is the system that lets you trust what was written.</strong></p><p>Do not take the one-size answer in either direction. If you are solo with no users, the enterprise horror stories about churn and duplication are a future risk, not today&#8217;s fire, so lean on your tests, review what matters, and stay honest that the deferred work is still owed. If you maintain something large for many people, every alarming number here is about you, and the only thing that holds is a tiered, evidence-required, deliberately heterogeneous review process with a human owning the merge.</p><p>What is constant across the whole spectrum is the underlying economics. We made writing cheap, and understanding stayed exactly as expensive as it has always been. The teams that do well over the next few years will not be the ones generating the most code, they will be the ones who built a review system they can actually trust, and who never confuse &#8220;the tests passed&#8221; with &#8220;a person understands what this does and why&#8221;.</p><p>Or, as <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Simon Willison&quot;,&quot;id&quot;:5753967,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5a30d45c-fcba-407a-bebf-96f51a8944a4_48x48.jpeg&quot;,&quot;uuid&quot;:&quot;48311855-ce0a-4a87-95ba-4fc82caa3434&quot;}" data-component-name="MentionToDOM"></span> keeps putting it, <a href="https://simonwillison.net/2025/Dec/18/code-proven-to-work/">your job is to deliver code you have proven to work</a>. Agents have not changed that. They have made the proving the center of the job rather than an afterthought, and I think that is a good trade. </p><p><strong>Understanding a system well enough to stand behind it is the most durable and most interesting skill in software, and there has never been a better time to get extraordinarily good at it.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ya4s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ya4s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ya4s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg&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;:55854,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/202172785?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ya4s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ya4s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F762e6720-3a1f-45a0-9a81-8033975a97f4_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Loop Engineering]]></title><description><![CDATA[Loop engineering is replacing yourself as the person who prompts the agent.]]></description><link>https://addyo.substack.com/p/loop-engineering</link><guid isPermaLink="false">https://addyo.substack.com/p/loop-engineering</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Mon, 08 Jun 2026 14:31:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ntYX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Loop engineering is replacing yourself as the person who prompts the agent. You design the system that does it instead.</strong> <strong>A loop here can be thought of a recursive goal where you define a purpose and the AI iterates until complete. </strong>It&#8217;s roughly five building blocks and Claude Code and Codex both have all five now. </p><p>I believe this <em>may</em> be the future of how we work with coding agents. However, its still early, I&#8217;m skeptical and you absolutely <em>have</em> to be careful about <strong>token costs</strong> (usage patterns can vary wildly if you are token rich or poor), so I want to unpack what it is and what it means.</p><div><hr></div><p>Peter Steinberger recently <a href="https://x.com/steipete/status/2063697162748260627">said</a>: &#8220;You shouldn&#8217;t be prompting coding agents anymore. You should be designing loops that prompt your agents.&#8221; Similarly, Boris Cherny, head of Claude Code at Anthropic, <a href="https://x.com/rohanpaul_ai/status/2063289804708835412">said</a> &#8220;I don&#8217;t prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D7tC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D7tC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 424w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 848w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 1272w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D7tC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png" width="1320" height="596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:1320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118058,&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://addyo.substack.com/i/201079702?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.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_!D7tC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 424w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 848w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.png 1272w, https://substackcdn.com/image/fetch/$s_!D7tC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2944249f-df8a-4a26-a170-dc27afe21db4_1320x596.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Okay, so what does any of that mean? </p><p>For like two years the way you got something out of a coding agent was you wrote a good prompt and shared enough context. You type a thing, you read what came back, you type the next thing. The agent is a tool and you are holding it the entire time, one turn after the other. That part is kind of over, or at least some think it&#8217;s going to be.</p><p>Now you build a small system that finds the work, hands it out, checks it, writes down what is done and then decides the next thing, and you let that system poke the agents instead of you. I wrote before about the cousin of this, <a href="https://addyosmani.com/blog/agent-harness-engineering/">agent harness engineering</a>, which is making the environment one single agent runs inside and the <a href="https://addyosmani.com/blog/factory-model/">factory model</a> - the system that builds the software. Loop engineering sits one floor above the harness. The harness but it runs on a timer, it spawns little helpers, and it feeds itself.</p><p>The thing that surprised me is this is not really a tool thing anymore. A year ago if you wanted a loop you wrote a pile of bash and you maintained that pile forever and it was yours and only yours. Now the pieces just ship inside the products. Steinberger&#8217;s list maps almost exactly onto the Codex app, and then almost the same onto Claude Code. And once you notice the shape is the same you stop arguing about which tool, you just design a loop that still works no matter which one you happen to be sitting in.</p><h2><strong>The five pieces, and then notes</strong></h2><p>A <a href="https://x.com/reach_vb/status/2063713960495558940">loop</a> needs five things and then one place to remember stuff. Let me list it first and then map it.</p><ol><li><p><strong>Automations</strong> that go off on a schedule and do discovery and triage by themselves.</p></li><li><p><strong>Worktrees</strong> so two agents working in parallel dont step on each other.</p></li><li><p><strong>Skills</strong> to write down the project knowledge the agent would otherwise just guess.</p></li><li><p><strong>Plugins and connectors</strong> to plug the agent into the tools you already use.</p></li><li><p><strong>Sub-agents</strong> so one of them has the idea and a different one checks it.</p></li></ol><p>Then the sixth thing, the memory. A markdown file, or a Linear board, anything that lives outside the single conversation and holds what&#8217;s done and what is next. Sounds too dumb to matter. But it&#8217;s the same trick every long running agent depends on and I went into it in <a href="https://addyosmani.com/blog/long-running-agents/">long-running agents</a>, the model forgets everything between runs so the memory has to be on disk and not in the context. The agent forgets, the repo doesnt.</p><p>Both products have all five now.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hj5a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hj5a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 424w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 848w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hj5a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png" width="1456" height="1002" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1002,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:317300,&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://addyo.substack.com/i/201079702?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.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_!Hj5a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 424w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 848w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!Hj5a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2058eaaa-382e-4f99-a8e9-2cb8261dce4d_2026x1394.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 names are a bit different here and there but the capability is the same thing. Let me go one by one because honestly the details are where a loop either holds together or quietly leaks everywhere.</p><h2><strong>Automations, this is the heartbeat</strong></h2><p>Automations are what make a loop an actual loop and not just one run you did once. In the Codex app you make one in the Automations tab and you pick the project, the prompt it will run, how often, and if it runs on your local checkout or on a background worktree. The runs that find something go to a Triage inbox, and the runs that find nothing just archive themselves which is nice. OpenAI uses them internally for boring stuff like daily issue triage, summarizing CI failures, writing commit briefings, hunting bugs somebody added last week. And an automation can call a skill, so you keep the recurring thing maintainable, you fire <code>$skill-name</code> instead of pasting a giant wall of instructions into a schedule that nobody will ever update.</p><p>Claude Code gets to the same place but through scheduling and hooks. You can run a prompt or a command on a interval with <code>/loop</code>, you can schedule a cron task, you can fire shell commands at certain points in the agent lifecycle with hooks, or you push the whole thing to GitHub Actions if you want it to keep running after you close the laptop. Same idea exactly, you define an autonomous task, you give it a cadence, and the findings come to you so you are not the one going around checking.</p><p>There is a second in-session primitive worth knowing, and it's the one closer to what this whole post is about. <code>/loop</code> re-runs on a cadence. <code>/goal</code> keeps going until a condition you wrote is actually true, and after every turn a separate small model checks whether you are done, so the agent that wrote the code isnt the one grading it. You give it something like "all tests in test/auth pass and lint is clean" and walk away. Codex has the same thing, also called <code>/goal</code>, it keeps working across turns until a verifiable stopping condition holds, with pause and resume and clear. Same primitive, both tools, wich is kind of the pattern for this whole article.</p><p>So this is the part that surfaces the work. The rest of the loop is what acts on it.</p><h2><strong>Worktrees so parallel doesn&#8217;t turn into chaos</strong></h2><p>The second you run more than one agent the files start colliding, that becomes the failure. Two agents writing the same file is the exact same headache as two engineers committing to the same lines and nobody talked to each other first. A git worktree fixes it, its a separate working directory on its own branch sharing the same repo history, so one agent&#8217;s edits literally can not touch the other one&#8217;s checkout.</p><p>Codex builds the worktree support right in so several threads hit the same repo at once and dont bump into each other. Claude Code gives you the same isolation with <code>git worktree</code>, a <code>--worktree</code> flag to open a session in its own checkout, and a <code>isolation: worktree</code> setting you stick on a subagent so each helper gets a fresh checkout that cleans itself up after. I wrote about the human side of all this in <a href="https://addyosmani.com/blog/orchestration-tax/">the orchestration tax</a>, the worktrees take away the mechanical collision but YOU are still the ceiling, your review bandwith decides how many you can actually run, not the tool.</p><h2><strong>Skills, so you stop explaining your project every single time</strong></h2><p>A skill is how you stop re-explaining the same project context every session like a goldfish. Both tools use the same format, a folder with a <code>SKILL.md</code> inside holding instructions and metadata, and then optional scripts, references, assets. Codex runs a skill when you call it with <code>$</code> or <code>/skills</code>, or by itself when your task matches the skill description, which is the reason a tight boring description beats a clever one. Claude Code does it the same way and I wrote the pattern up in <a href="https://addyosmani.com/blog/agent-skills/">agent skills</a>.</p><p>Skills are also where intent stops costing you over and over. I argued in <a href="https://addyosmani.com/blog/intent-debt/">the intent debt</a> that an agent starts every session cold and it will fill any hole in your intent with a confident guess. A skill is that intent written down on the outside, the conventions, the build steps, the &#8220;we dont do it like this because of that one incident&#8221;, written one time where the agent reads it every run. Without skills the loop re-derives your whole project from zero every cycle, with skills it kind of compounds.</p><p>One thing to keep straight, the skill is the authoring format and a plugin is how you ship it. When you want to share a skill across repos or bundle a few together you package them as a plugin. True in Codex, true in Claude Code.</p><h2><strong>Plugins and connectors, the loop touches your real tools</strong></h2><p>A loop that can only see the filesystem is a tiny loop. Connectors, which are built on MCP, let the agent read your issue tracker, query a database, hit a staging api, drop a message in Slack. Codex and Claude Code both speak MCP so the connector you wrote for one usually just works in the other. And plugins bundle connectors and skills together so your teammate installs your setup in one go instead of rebuilding the whole thing from memory.</p><p>This is the difference between an agent that says &#8220;here is the fix&#8221; and a loop that opens the PR, links the Linear ticket and pings the channel once CI is green by itself. The connectors are the reason the loop can act inside your actual environment instead of just telling you what it would do if it could.</p><h2><strong>Sub-agents, keep the maker away from the checker</strong></h2><p>The most useful structural thing in a loop, by far, is splitting the one who writes from the one who checks. The model that wrote the code is way too nice grading its own homework. A second agent with different instructions and sometimes a different model catches the stuff the first one talked itself into.</p><p>Codex only spawns subagents when you ask, runs them at the same time and then folds the results back into one answer. You define your own agents as TOML files in <code>.codex/agents/</code>, each with a name, a description, instructions and optional model and reasoning effort, so your security reviewer can be a strong model on high effort while your explorer is some fast read-only thing. Claude Code does the same with subagents in <code>.claude/agents/</code> and agent teams that pass work between them. The usual split in both is one agent explores, one implements, one verifies against the spec.</p><p>I made this case twice already, once as <a href="https://addyosmani.com/blog/code-agent-orchestra/">the code agent orchestra</a> and once as <a href="https://addyosmani.com/blog/adversarial-code-review/">adversarial code review</a>. The reason it matters specifically inside a loop is the loop runs while you are not watching, so a verifier you actually trust is the only reason you can walk away. Subagents do burn more tokens since each one does its own model and tool work, so spend them where a second opinion is worth paying for. This is also basically what Claude Code&#8217;s /goal does under the hood, a fresh model decides if the loop is done instead of the one that did the work, the maker and checker split applied to the stop condition itself.</p><h2><strong>What one loop looks like</strong></h2><p>Stick it together and a single thread turns into a little control panel. Here is one shape I keep using.</p><p>An automation runs every morning on the repo. Its prompt calls a triage skill that reads yesterdays CI failures, the open issues, the recent commits, and writes the findings into a markdown file or a Linear board. For each finding that is worth doing the thread opens an isolated worktree and sends a sub-agent to draft the fix, and a second sub-agent reviews that draft against the project skills and the existing tests.</p><p>Connectors let the loop open the PR and update the ticket. Anything the loop can not handle lands in the triage inbox for me. The state file is the spine of the whole thing, it remembers what got tried, what passed, what is still open, so tomorrow morning the run picks up where today stopped.</p><p>And look at what you actually did there. You designed it one time. You did not prompt any of those steps. Thats Steinberger&#8217;s whole point made real, and its the same loop in Codex or in Claude Code because the pieces are the same pieces.</p><h2><strong>What the loop still does not do for you</strong></h2><p>The loop changes the work, it does not delete you from it. And three problems actually get sharper as the loop gets better, not easier.</p><p>Verification is still on you. A loop running unattended is also a loop making mistakes unattended. The whole reason you split the verifier sub-agent from the maker is to make the loop&#8217;s &#8220;its done&#8221; mean something, and even then &#8220;done&#8221; is a claim and not a proof. I keep saying the same line from <a href="https://addyosmani.com/blog/code-review-ai/">code review in the age of AI</a>, your job is to ship code you confirmed works.</p><p>Your understanding still rots if you allow it. The faster the loop ships code you did not write, the bigger the gap between what exists and what you actually get. Thats <a href="https://addyosmani.com/blog/comprehension-debt/">comprehension debt</a> and a smooth loop just makes it grow faster unless you read what the loop made.</p><p>And the comfortable posture is the dangerous one. When the loop runs itself its very tempting to stop having an opinion and just take whatever it gives back. I called that <a href="https://addyosmani.com/blog/cognitive-surrender/">cognitive surrender</a>. Designing the loop is the cure when you do it with judgement and the accelerant when you do it to avoid thinking, same action, opposite result.</p><h2><strong>Build the loop. Stay the engineer.</strong></h2><p>I think this is a preview of how our work is going to evolve. That said, If I weren&#8217;t reviewing the code myself or if I relied entirely on automated loops to fix it my product&#8217;s quality would suffer. I&#8217;d likely end up stuck in a downward spiral, continuously digging myself into a deeper hole.</p><p>That said, go ahead and set up your loops, but don&#8217;t forget that prompting your agents directly is also effective. It&#8217;s all about finding the right balance.</p><p>Loops can also result in different outcomes depending on you. Two people can build the exact same loop and get completely opposite results. One uses it to move faster on work they understand deeply. The other uses it to avoid understanding the work at all. The loop doesn&#8217;t know the difference. You do.</p><p>That&#8217;s what makes loop design harder than prompt engineering, not easier. Cherny&#8217;s point isn&#8217;t that the work got easier. It&#8217;s that the leverage point moved. </p><p>Build the loop. But build it like someone who intends to stay the engineer, not just the person who presses go.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ntYX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ntYX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ntYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76297,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/201079702?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ntYX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ntYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b297081-dbed-48a8-9fa2-68b17b34eb67_2754x1536.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Long-running Agents]]></title><description><![CDATA[A long-running AI agent can keep making progress over hours, days, or weeks.]]></description><link>https://addyo.substack.com/p/long-running-agents</link><guid isPermaLink="false">https://addyo.substack.com/p/long-running-agents</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Thu, 30 Apr 2026 14:30:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FqTC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>A long-running AI agent can keep making progress over hours, days, or weeks. It can do this across many context windows and sandboxes, recover from failure, leave structured artifacts behind, and resume where it left off.</strong></p></blockquote><p>For two years the dominant image of an &#8220;AI agent&#8221; has been a chat window with a clever loop in it. You type a goal, the agent calls some tools, you watch tokens stream by, you stop watching when the work runs out of patience or the context window fills up. That paradigm got us a long way, but it has a ceiling. The model forgets. It declares &#8220;task complete&#8221; when it isn&#8217;t. It re-introduces a bug it fixed nine turns ago. The whole thing is structured around a single sitting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4O50!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4O50!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4O50!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4O50!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4O50!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4O50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg" width="1375" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1375,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Long-running AI agents&quot;,&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="Long-running AI agents" title="Long-running AI agents" srcset="https://substackcdn.com/image/fetch/$s_!4O50!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4O50!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4O50!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4O50!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda5ccdb-7770-425c-9e92-c72938025a32_1375x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Long-running agents are what comes next. The idea is easy to state: an agent that keeps making forward progress on a goal across many sessions and many sandboxes, possibly many days or weeks, while leaving the workspace clean enough that the next session can pick up where the last one left off. The engineering is harder. You have to solve for persistence, recovery, and verification in a way that doesn&#8217;t just paper over the cracks. You have to build a state layer that lives outside the model&#8217;s context window, and you have to design the handoff between sessions so the agent doesn&#8217;t lose its mind when it wakes up and finds itself in a different sandbox with a different context window.</p><p>This post is my attempt to lay out what&#8217;s changed, who&#8217;s pushing on it, and how an engineer can use long-running agents today without writing the whole thing from scratch.</p><div><hr></div><h2><strong>What &#8220;long-running&#8221; actually means</strong></h2><p>&#8220;Long-running&#8221; gets used to mean at least three different things in practice, and it helps to keep them separate.</p><p><strong>Long-horizon reasoning.</strong> The agent has to plan and execute over many dependent steps. This is mostly a model-quality story: coherence, planning, the ability to recover from a wrong turn ten steps ago. METR has been tracking this with their <em>time horizon</em> metric, which estimates how long a task a frontier model can complete with 50% reliability. The headline finding is that the metric has been <a href="https://metr.org/time-horizons/">doubling roughly every seven months</a> since 2019, and their <a href="https://metr.org/blog/2026-1-29-time-horizon-1-1/">TH1.1 update</a> earlier this year doubled the count of 8-hour-plus tasks in the eval set. <strong>If that curve holds, frontier agents complete tasks at the day scale by 2028 and the year scale by 2034.</strong></p><p><strong>Long-running execution.</strong> The agent&#8217;s <em>process</em> runs for hours or days. Maybe it&#8217;s a coding job, maybe it&#8217;s a research sweep, maybe it&#8217;s a 24/7 monitoring service. The model might be invoked thousands of times across the run. This is mostly a <em>harness</em> story, and it&#8217;s the one this post is mostly about.</p><p><strong>Persistent agency.</strong> The agent has an identity that outlives any single task. It accumulates memory, learns user preferences, and is always available. This is the <a href="https://docs.cloud.google.com/agent-builder/agent-engine/memory-bank/overview">Memory Bank</a> flavor of long-running.</p><p>In practice the three blur together. A real production agent does long-horizon reasoning <em>inside</em> a long-running execution <em>backed by</em> persistent agency. But the engineering problems are different in each, and so are the products that solve them.</p><div><hr></div><h2><strong>Why this matters</strong></h2><p>There are two reasons I believe this work matters a lot right now.</p><p>The first is a phase change in what&#8217;s economically feasible to delegate. An agent that runs for ten minutes can answer a question, summarize a doc, fix a small bug. An agent that runs for ten hours can own an entire feature, finish a migration that was on the backlog for six quarters, or do the kind of overnight research sweep that used to require a junior analyst. One of Anthropic&#8217;s <a href="https://www.anthropic.com/news/claude-sonnet-4-5">Claude Sonnet announcements</a> put concrete numbers on this last fall: 30+ hours of autonomous coding in internal tests, including <a href="https://venturebeat.com/ai/anthropics-new-claude-can-code-for-30-hours-think-of-it-as-your-ai-coworker">one run</a> that produced an 11,000-line Slack-style app. <strong>That&#8217;s already past the threshold where the answer to &#8220;should I delegate this?&#8221; is no longer obvious.</strong></p><p>The second is that persistence changes what the agent <em>is</em>. A stateless agent answers your question and disappears. A long-running one accumulates context: which competitor moved which way last week, which test flaked twice on Tuesday, what you usually mean by &#8220;the dashboard.&#8221; Anthropic&#8217;s <a href="https://www.anthropic.com/research/project-vend-1">Project Vend</a> was the most public early demonstration of this. They had a Claude instance run an actual office vending business for a month, managing inventory, setting prices, talking to suppliers. It failed in informative ways, and <a href="https://www.anthropic.com/research/project-vend-2">the second phase</a> ran much better, but the point wasn&#8217;t profitability. The point was watching what kinds of weird coherence problems show up when an agent has to maintain identity across weeks instead of turns.</p><p>Those are the same problems every team building production agents now hits.</p><div><hr></div><h2><strong>The three walls every long-running agent hits</strong></h2><p>Three walls show up in basically every write-up I&#8217;ve read this year.</p><p><strong>Finite context.</strong> Even a 1M-token window fills. And <a href="https://addyosmani.com/blog/agent-harness-engineering/">context rot</a>, the steady degradation of model performance as the window gets full, kicks in well before the hard limit. A 24-hour run is not going to fit in any context window the field has on its roadmap. Something has to give.</p><p><strong>No persistent state.</strong> A new session starts blank. Anthropic&#8217;s framing in their <a href="https://www.anthropic.com/research/long-running-Claude">scientific computing post</a> is the cleanest version I&#8217;ve seen: <em>&#8220;imagine a software project staffed by engineers working in shifts, where each new engineer arrives with no memory of what happened on the previous shift.&#8221;</em> Without an explicit persistence story, every shift change is a productivity disaster.</p><p><strong>No self-verification.</strong> Models reliably skew positive when they grade their own work. Asked &#8220;are you done?&#8221; they answer &#8220;yes&#8221; more often than they should. Without a separate signal that the work meets a bar, you get the agent that ships at 30% complete with full confidence.</p><p>Long-running agent designs are mostly answers to these three problems. <strong>The major labs have converged on similar shapes of answer, but with very different surface area.</strong></p><div><hr></div><h2><strong>The Ralph loop: one of the simpler practitioner versions of long-running agents</strong></h2><p>The <strong>Ralph loop</strong> (sometimes called the Ralph Wiggum technique) is one of &#8220;simpler&#8221; practitioner version of long-running agents, popularized by <a href="https://ghuntley.com/ralph/">Geoffrey Huntley</a> and <a href="https://github.com/snarktank/ralph">Ryan Carson</a>. The reference implementation is <a href="https://ghuntley.com/ralph/">literally a bash script</a> that loops:</p><ol><li><p>Pick the next unfinished task from a list (<code>prd.json</code> or equivalent).</p></li><li><p>Build a prompt with the task, the relevant context, and any persistent notes.</p></li><li><p>Call the agent.</p></li><li><p>Run tests or other checks.</p></li><li><p>Append what happened to <code>progress.txt</code>.</p></li><li><p>Update the task list (done, failed, blocked).</p></li><li><p>Go back to step 1.</p></li></ol><p>The reason it works is the same reason any of the harnesses below work: state lives outside the agent&#8217;s context. <code>prd.json</code> is the plan, <code>progress.txt</code> is the lab notes, <code>AGENTS.md</code> is the rolling rulebook. <strong>The agent itself is amnesiac, but the filesystem isn&#8217;t.</strong> Each iteration starts fresh and reads enough state from disk to keep going. Carson&#8217;s <a href="https://github.com/snarktank/compound-product">Compound Product</a> extends the idea by chaining multiple loops (an analysis loop that reads daily reports, a planning loop that emits a PRD, an execution loop that writes the code), which is roughly the open-source version of the planner-generator-evaluator triad Anthropic landed on independently.</p><p>I went deeper on all of this in <a href="https://addyosmani.com/blog/self-improving-agents/">Self-improving agents</a>: task list structure, progress files, QA gates, monitoring, the failure modes you&#8217;ll actually hit. The short version is that you can build a working long-running agent in an evening with a bash script and a JSON file. Most of what Google and Anthropic have productized is the work of making this pattern recoverable, secure, and observable at scale.</p><p>The big-lab stories below are different ways of paying for that production-readiness.</p><div><hr></div><h2><strong>Anthropic: harnesses, then the brain/hands/session split</strong></h2><p>Anthropic has been the most public about the engineering. Two posts are worth reading end-to-end.</p><p>The first is <a href="https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents">&#8220;Effective harnesses for long-running agents&#8221;</a>, which lays out a two-agent harness for autonomous full-stack development. An <strong>initializer agent</strong> runs once at the start of a project to set up the environment, expand the prompt into a structured <code>feature-list.json</code>, and write an <code>init.sh</code> that future sessions will run on boot. A <strong>coding agent</strong> is then woken up over and over, each session asked to make incremental progress on one feature, run tests, leave a <code>claude-progress.txt</code> note, and commit. A test ratchet (<em>&#8220;it is unacceptable to remove or edit tests because this could lead to missing or buggy functionality&#8221;</em>) sits in the prompt to stop the very common failure of an agent deleting failing tests to &#8220;make them pass.&#8221; <a href="https://www.infoq.com/news/2026/04/anthropic-three-agent-harness-ai/">InfoQ&#8217;s writeup</a> extends this into a planner, generator, and evaluator triad, on the same logic that separating generation from evaluation matters because models grade their own work too generously.</p><p>The second is <a href="https://www.anthropic.com/engineering/managed-agents">&#8220;Scaling Managed Agents: Decoupling the brain from the hands&#8221;</a>, the architectural post behind <a href="https://platform.claude.com/docs/en/managed-agents/overview">Claude Managed Agents</a> (Anthropic&#8217;s hosted runtime, launched in early April). The argument is that an agent has three components that should be independently replaceable. The Brain is the model and the harness loop that calls it. The Hands are sandboxed, ephemeral execution environments where tools actually run. The Session is an append-only event log of every thought, tool call, and observation.</p><p>This sounds abstract and it isn&#8217;t. Anthropic&#8217;s framing: <em>&#8220;every component in a harness encodes an assumption about what the model can&#8217;t do on its own.&#8221;</em> When you couple them, an assumption that goes stale (e.g., the model used to need an explicit planner and now plans natively) means the whole system has to change at once. When you decouple them, the harness becomes stateless, sandboxes become <em>cattle, not pets</em>, and a brain crash doesn&#8217;t lose the run. A fresh container calls <code>wake(sessionId)</code> and reconstitutes the state from the log. They reported <a href="https://www.anthropic.com/engineering/managed-agents">time-to-first-token dropped ~60% at p50 and over 90% at p95</a> just from being able to start inference before the sandbox is ready.</p><p><strong>The session-as-event-log idea is the part most teams underappreciate.</strong> It is what makes a long-running agent recoverable. Without it, a container failure is a session failure and you&#8217;re debugging into a stale snapshot. With it, the agent&#8217;s memory is a queryable artifact that lives outside whatever process happens to be running at the moment.</p><p>For the scientific computing crowd, Anthropic&#8217;s <a href="https://www.anthropic.com/research/long-running-Claude">long-running Claude post</a> reduces all of this to a simpler stack: <code>CLAUDE.md</code> as a living plan the agent edits as it learns, <code>CHANGELOG.md</code> as portable lab notes, <code>tmux</code> plus <code>SLURM</code> plus <code>git</code> as the execution and coordination layer, and the <strong>Ralph loop</strong>, a <code>for</code> loop that kicks the agent back into context whenever it claims completion and asks if it&#8217;s <em>really</em> done. Their flagship case study is a Boltzmann solver Claude Opus built over a few days that reached sub-percent agreement with a reference CLASS implementation. Months-to-years of researcher time, compressed.</p><p>Same patterns across all three posts: an explicit plan file, an explicit progress file, structured handoffs between sessions, separate generation from evaluation, and a loop that refuses to let the agent stop early.</p><div><hr></div><h2><strong>Cursor: planners, workers, judges</strong></h2><p><a href="https://cursor.com/blog/scaling-agents">Cursor&#8217;s &#8220;Scaling long-running autonomous coding&#8221;</a> is the other essential read this year. They walked into walls that Anthropic mostly papered over.</p><p>Their first attempt was a flat coordination model: equal-status agents writing to shared files with locks. It became a bottleneck and made the agents risk-averse, churning rather than committing. Their second attempt swapped locks for optimistic concurrency control, which removed the bottleneck but didn&#8217;t fix the coordination problem. The third design is what&#8217;s running in production now and what they describe as solving most of the problem:</p><ul><li><p><strong>Planners</strong> continuously explore the codebase and emit tasks. They can recursively spawn sub-planners.</p></li><li><p><strong>Workers</strong> are focused executors. They don&#8217;t coordinate with each other and they don&#8217;t worry about the big picture.</p></li><li><p><strong>Judges</strong> decide when an iteration is finished and when to restart.</p></li></ul><p>Two things stand out from the post. One: <em>&#8220;a surprising amount of the system&#8217;s behavior comes down to how we prompt the agents&#8221;</em> more than the harness or the model. Two: different models slot into different roles. Their reported finding is that a GPT model was better than Opus for <em>extended autonomous work</em> specifically because Opus tended to stop early and take shortcuts. <strong>Same task, different role, different model.</strong> The matching is becoming part of the design surface.</p><p>This pairs with <a href="https://cursor.com/blog/composer">Composer 2</a> (their proprietary frontier coding model that ships in <a href="https://cursor.com/changelog/2-0">Cursor 3</a>) and their <strong>background cloud agents</strong>: long-running tasks that run on Anysphere&#8217;s cloud infrastructure rather than your laptop. Eight-hour refactors and codebase-wide migrations survive a closed lid. You can start a task locally, hit <em>run in cloud</em> when you realize it&#8217;ll take 30 minutes, and re-attach later from your phone. Each agent runs in an isolated git worktree and merges back via PR. The handoff between local and remote is the part most teams haven&#8217;t figured out yet, and Cursor&#8217;s bet is that it has to be its own product surface.</p><p>The shape ends up close to Anthropic&#8217;s: roles are split, sessions are durable, judges sit beside the worker, and a long task runs in a cloud sandbox with git as the coordination substrate.</p><div><hr></div><h2><strong>Google: long-running agents on the Agent Platform</strong></h2><p>Google&#8217;s announcement at <a href="https://cloud.google.com/blog/products/ai-machine-learning/introducing-gemini-enterprise-agent-platform">Cloud Next &#8216;26</a> two weeks ago folded Vertex AI into the <strong>Gemini Enterprise Agent Platform</strong> and turned long-running agents into a named product, with named SLAs.</p><p>The pieces that matter for this post:</p><ul><li><p><strong>Agent Runtime</strong> supports agents that <em>&#8220;run autonomously for days at a time&#8221;</em> with sub-second cold starts and on-demand sandbox provisioning. The launch post&#8217;s example use case is a sales prospecting sequence that takes a week to play out, which is roughly the right shape for it.</p></li><li><p><strong>Agent Sessions</strong> persist conversation and event history. You can pin them to a custom session ID that maps to your own CRM or DB record, so the agent&#8217;s state lives next to the business state instead of in a separate AI silo.</p></li><li><p><strong><a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/memory-bank">Agent Memory Bank</a></strong> is the persistent long-term memory layer, generally available as of Next &#8216;26. It curates memories from sessions, scopes them to a user identity, and exposes a search API so the next agent invocation can pull what&#8217;s relevant. Payhawk reported that auto-submitting expenses through a Memory-Bank-backed agent cut submission time by over 50%.</p></li><li><p><strong>Agent Sandbox</strong> handles hardened code execution.</p></li><li><p><strong>Agent-to-Agent Orchestration</strong>, <strong>Agent Registry</strong>, <strong>Agent Identity</strong>, <strong>Agent Gateway</strong>, <strong>Agent Observability</strong>, and <strong>Agent Simulation</strong> cover basically every operational concern you&#8217;d otherwise build by hand for a production fleet, including the cryptographic-identity-and-audit-log story enterprises actually need to ship.</p></li></ul><p>Architecturally this is the same brain/hands/session split Anthropic described, just productized at platform scale and bundled with <a href="https://google.github.io/adk-docs/">ADK</a> (the code-first dev kit) and Agent Studio (the visual one). If you&#8217;re building inside Google Cloud, you don&#8217;t have to design a session log or a memory store from scratch anymore. You wire an ADK agent into Memory Bank and Sessions, deploy onto Agent Runtime, and the persistence question is answered.</p><p>Notice how much this looks like the pattern Anthropic and Cursor describe, just unbundled into named services with SLAs. Three years ago you&#8217;d have built all of this yourself. <strong>Now you pick which version of &#8220;decoupled brain, hands, and session&#8221; you want to rent.</strong></p><div><hr></div><h2><strong>Five patterns for long-running agents in production</strong></h2><p>Shubham Saboo and I <a href="https://x.com/GoogleCloudTech/status/2046989964077146490">wrote up</a> five design patterns we&#8217;ve seen separate working long-running agents from demos. They aren&#8217;t Google-specific, but they map cleanly onto the primitives Agent Runtime now exposes, so it&#8217;s worth walking through them here in shortened form.</p><p><strong>Checkpoint-and-resume.</strong> The most common multi-day failure is context loss. An agent processes 200 documents over four hours, hits an error on document 201, and without a checkpoint you start from scratch. Treat the agent like a long-running server process: write intermediate state to disk, checkpoint every N units of work, recover from failures. The Agent Runtime sandbox gives you a persistent filesystem, but choosing the right checkpoint granularity (not every step, not only the end) is on you.</p><p><strong>Delegated approval (human-in-the-loop).</strong> Most &#8220;human-in-the-loop&#8221; implementations are: serialize state to JSON, fire a webhook, hope someone responds. The state goes stale, the notification gets buried, the agent re-deserializes into a slightly different world. Long-running runtimes let the agent pause in place with full execution state intact: reasoning chain, working memory, tool history, pending action. Hours of human time pass, the agent consumes zero compute, and it resumes with sub-second latency. Mission Control is Google&#8217;s inbox for this. The pattern works regardless of vendor.</p><p><strong>Memory-layered context.</strong> A seven-day agent needs more than session state. Memory Bank handles long-term curated memory, Memory Profiles add low-latency lookups, and the failure mode you&#8217;ll hit in production is <strong>memory drift</strong>: the agent learns a procedural shortcut from a few atypical interactions and starts applying it broadly. <strong>Govern memory like you govern microservices.</strong> Agent Identity controls who can read and write which banks. Agent Registry tracks which version of which agent is running. Agent Gateway enforces policy on the wire. The auditing question stops being &#8220;what are my agents doing?&#8221; and becomes &#8220;what are my agents remembering, and how is that changing their behavior?&#8221;</p><p><strong>Ambient processing.</strong> Not every long-running agent talks to a human. Some sit on a Pub/Sub stream or a BigQuery table and act on events as they arrive: content moderation, anomaly detection, inbox triage. The architectural decision worth making early is to not hardcode policy into the agent. Define it in the Gateway and the fleet picks up policy changes without redeploys. Ambient agents run unsupervised for long stretches, and the only sane way to update a hundred of them is to update the policy layer once.</p><p><strong>Fleet orchestration.</strong> In real systems, you rarely have one agent. A coordinator delegates sub-tasks to specialists (a Lead Researcher Agent, a Scoring Agent, an Outreach Agent), each running independently for different durations. Each specialist gets its own Identity (so the Outreach Agent can&#8217;t read financial data meant for Scoring), its own policy enforcement, its own Registry entry. This is the same coordinator/worker shape distributed systems have used for decades. What&#8217;s new is that ADK handles it declaratively with graph-based workflows, and a bad deployment in one specialist doesn&#8217;t cascade to the others.</p><p>The patterns compose. A compliance system might use checkpointing for document processing, delegated approval for review gates, memory layering for cross-session knowledge, and fleet orchestration to coordinate the specialists. The opening question is always the same: <em>what&#8217;s the longest uninterrupted unit of work your agent needs to perform?</em> Minutes, and you don&#8217;t need long-running agents. Hours or days, and these patterns are where to start. The <a href="https://x.com/GoogleCloudTech/status/2046989964077146490">full write-up with code samples</a> covers each pattern in depth.</p><div><hr></div><h2><strong>So how do you actually build one today?</strong></h2><p>This is the practical question and it has a different answer depending on what you&#8217;re building.</p><p><strong>You&#8217;re a developer who wants long-running coding work on your own repo.</strong> Just use <a href="https://addyosmani.com/blog/agent-harness-engineering/">Claude Code</a> (or Antigravity, Cursor, or Codex). The harness is already there. Treat your <code>AGENTS.md</code> like a pilot&#8217;s checklist: short, every line earned by a real failure. Add hooks for typecheck and lint that surface failures back to the agent. Write a plan file before the agent starts. Use <a href="https://addyosmani.com/blog/self-improving-agents/">the Ralph loop</a> when the agent claims it&#8217;s done and you don&#8217;t believe it. For multi-hour or overnight jobs, run in a worktree so a closed laptop doesn&#8217;t kill the run, and have it commit progress every meaningful unit of work. <strong>This is the path most people should take, and it&#8217;s where the most leverage is right now.</strong></p><p><strong>You&#8217;re building a hosted agent product.</strong> Don&#8217;t build the runtime. Pick a managed one. The three real options today: <a href="https://cloud.google.com/products/gemini-enterprise-agent-platform">Google&#8217;s Agent Platform</a> (Agent Engine + Memory Bank + Sessions), <a href="https://platform.claude.com/docs/en/managed-agents/overview">Claude Managed Agents</a>, or roll something on top of <a href="https://google.github.io/adk-docs/">ADK</a>, the <a href="https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk">Claude Agent SDK</a>, or <a href="https://platform.openai.com/docs/codex">Codex SDK</a> and host it yourself. The trade-off is the usual one. Managed gets you the brain/hands/session split, observability, identity, and an audit trail out of the box. Self-hosted gets you control and the ability to use weird models for weird roles (Cursor&#8217;s pattern). For most teams, the right starting point is a managed runtime plus your own ADK or SDK code for the actual loop.</p><p><strong>You&#8217;re doing something autonomous and operational</strong> (monitoring, research, ops). Memory Bank-style persistence is what you want, and it&#8217;s the part that doesn&#8217;t exist in Claude Code. ADK + Memory Bank + Cloud Run + Cloud Scheduler is the cleanest stack I&#8217;ve seen for &#8220;agent runs every N hours, accumulates state, alerts on a threshold.&#8221; This is also where Cursor&#8217;s planner/worker/judge split starts to matter more than it does for IDE coding, because the work is genuinely parallel and the failure modes are different.</p><p>A few things matter regardless of which path you take.</p><p><em>Write down the done-condition before the agent starts.</em> This is the single highest-leverage move for long runs. The Anthropic harness post calls it the feature list; Cursor calls it the planner&#8217;s task spec. Either way, it&#8217;s an external file with explicit, testable completion criteria, and it exists so the agent can&#8217;t quietly redefine <em>done</em> mid-run.</p><p><em>Separate the evaluator from the generator.</em> Self-grading is the failure mode. A planner / worker / judge pipeline, or a generator / evaluator pair, is a real architectural pattern not a stylistic preference. Even if it&#8217;s the same model in different roles with different prompts.</p><p><em>Invest in the session log, not just the prompt.</em> The append-only event log is what makes the agent recoverable, debuggable, and auditable. If you can&#8217;t reconstruct what the agent did in the last 24 hours from durable storage, what you have is a long-running shell script that happens to call an LLM, not a long-running agent.</p><p><em>Treat compaction and context resets as first-class.</em> Anthropic is explicit that summarization-as-compaction wasn&#8217;t enough for very long jobs; they had to do full context resets where the harness tears the session down and rebuilds it from a structured handoff file. It is essentially how humans onboard a new engineer.</p><div><hr></div><h2><strong>There are some real limitations right now</strong></h2><p>A few things are still genuinely unsolved.</p><p><strong>Cost.</strong> A 24-hour run with a frontier model and a few tools is not cheap. Without budgets, circuit breakers, and a hard cap on tool spend, an agent can quietly burn through a week&#8217;s API budget in an afternoon. This is solvable, but it&#8217;s an explicit step you have to take.</p><p><strong>Security.</strong> A long-running agent with API keys, cloud access, and the ability to run shell commands has a much larger attack surface than a chat session. The brain/hands separation pattern matters here too: credentials should be unreachable from the sandbox where model-generated code runs, which is one of the benefits Anthropic calls out for Managed Agents.</p><p><strong>Alignment drift.</strong> Over many context windows, agents drift. The original goal gets summarized, then re-summarized, then loses fidelity. This is the part hooks and judges exist to defend against. It is also the most common reason &#8220;the agent went off and did something I didn&#8217;t ask for.&#8221;</p><p><strong>Verification.</strong> Auditing 24 hours of autonomous activity is a real human-time problem. Observability and structured artifacts (PRs, commits, briefings, test runs) are how you make this tractable. Without them, you&#8217;re scrolling logs and you&#8217;ll miss what matters.</p><p><strong>The human role.</strong> Defining work crisply enough that an agent can run for a day on it is harder than doing the work yourself. The skill that&#8217;s appreciating in value isn&#8217;t writing code. It&#8217;s writing specs that survive contact with an autonomous executor.</p><div><hr></div><h2><strong>Where this is going</strong></h2><p>Google, Anthropic, and Cursor have converged on roughly the same shape. <strong>Separate the model loop from the execution sandbox from the durable session log. Split planning from generation from evaluation. Bake in compaction, hooks, and context resets. Expose memory as a managed service that any agent invocation can query.</strong></p><p>Surface area is what differs. Google&#8217;s Agent Platform is the enterprise-stack version, with the identity and audit trail story baked in. The patterns underneath are the same. Claude Managed Agents is &#8220;Anthropic&#8217;s harness, hosted.&#8221; Cursor&#8217;s background agents are &#8220;long-running coding, pulled out of the IDE and into the cloud.&#8221;</p><p>The harder problems for the next year aren&#8217;t in any of those layers individually. They&#8217;re in the coordination above them. Many long-running agents on a shared codebase. Agents that read their own traces and patch their own harnesses. Harnesses that assemble tools and context just-in-time for a task instead of being pre-configured at startup. That&#8217;s where the agent stops looking like a smarter chat window and starts looking like a colleague who&#8217;s been on the project longer than you have.</p><p>The model is still load-bearing. But the gap between a chat window and an agent you can leave running overnight is mostly in the state, sessions, and structured handoffs wrapped around it. That&#8217;s where I&#8217;d spend my learning time right now.</p><p><em>You might be interested in checking out some of my O&#8217;Reilly books such as <a href="https://beyond.addy.ie/">Beyond Vibe Coding</a>, <a href="https://www.oreilly.com/library/view/the-effective-software/9798341638167/">The Effective Software Engineer</a> or <a href="https://www.oreilly.com/library/view/web-performance-engineering/9798341660182/">Web Perf engineering in the age of AI</a>.</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_!FqTC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FqTC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FqTC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg&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;:41180,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/195959711?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FqTC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!FqTC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf57c226-c3eb-4c62-86c4-083008b5f2f1_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[The Agent Stack Bet]]></title><description><![CDATA[The bet every serious developer needs to make on on their agent stack]]></description><link>https://addyo.substack.com/p/the-agent-stack-bet</link><guid isPermaLink="false">https://addyo.substack.com/p/the-agent-stack-bet</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Sat, 18 Apr 2026 17:16:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w6mN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Peek under the hood of most &#8220;production agents&#8221; shipping today and you won&#8217;t find intelligence. You&#8217;ll find custom plumbing, fragile session logic, shared service accounts, and a security model held together by hope. This can be so much better.</p><p>If you&#8217;ve spent the last 18 months putting agents into production, you already know the models and tools have gotten <em>dramatically</em> better. You also know the problems that are still burning your on-call rotation are not problems you can prompt your way out of. We are running into a <strong>stack ceiling</strong>, and it is quietly creating a <strong>governance</strong> and <strong>reliability gap</strong> that the next generation of agentic systems cannot grow through.</p><p>Right now the industry is living with what I&#8217;d call <em>excessive agency</em>: <strong>autonomous systems given broad permissions to get things done</strong>, then left to discover - at runtime, in production - that a schema drifted, an API changed, or a downstream service started returning PII it wasn&#8217;t supposed to. Agents mark tasks &#8220;complete&#8221; while leaving a trail of corrupted state behind them. The humans find out on Monday.</p><p>This is not a failure of the people building agents. It is a failure of the stack they&#8217;re building on.</p><p>Here are the four architectural bets I think every serious team has to make in the next twelve months.</p><h2><strong>1) Agents need identities, not shared credentials</strong></h2><p>Every engineer who has shipped agents to production knows this specific flavor of dread: you have agents doing useful work, and effectively zero visibility into which tools they touched, which data they moved, or which credentials they used to do it. I call this <em>governance debt</em> - the silent accumulation of security and audit risk that eventually forces a full rewrite, usually right after the first incident that reaches the CISO.</p><p>The root cause is that most agents today are ghosts. They don&#8217;t have identities. They borrow a service account, inherit a human&#8217;s OAuth token, and &#8220;promise&#8221; - in application code, in a prompt - to stay inside the lines. In a real enterprise environment, a promise in a prompt is not a policy.</p><p><strong>My bet is that agent identity has to move from the application layer down into the platform layer.</strong> </p><p>The difference is between bolted-on vs. embedded security. Bolted-on looks like middleware in front of every tool call, politely asking the agent to behave: easy to bypass, expensive in latency, and invisible to your existing IAM. Embedded looks like a badge reader welded into a steel frame. The agent has a distinct, unforgeable identity recognized at the network and platform level, and policy is enforced at the source. If the agent reaches for a database it isn&#8217;t cleared for, the connection never opens. No middleware, no vibes.</p><p>Done right, this turns &#8220;a fleet of liabilities&#8221; into something that looks a lot more like a managed workforce: every action attributable, every permission auditable, every agent revocable with one call.</p><h2><strong>2) Agents need universal context, not scraped windows</strong></h2><p>Context management is a tax every builder is currently paying. Teams are burning a huge share of their engineering hours (and tokens) on undifferentiated plumbing - custom serialization, bespoke session stores, hand-rolled memory layers - just to keep an agent from forgetting its mission halfway through a multi-step task.</p><p>Worse, the context agents <em>can</em> get their hands on is usually siloed. A browser-based agent can see the open tab. A desktop wrapper can see the files a user happened to drag in. Neither of them can easily reason across the systems where the business actually lives - the CRM, the ERP, the data warehouse, the ticketing system, the transcripts, the project plans - at the same time.</p><p><strong>Agents need universal context that integrates at the platform level.</strong> If we don&#8217;t fix this, we should be honest that the ceiling of agentic AI is &#8220;slightly better spreadsheet autocomplete,&#8221; and we should stop writing vision pieces about it.</p><h1><strong>3) Agents need to survive your laptop closing</strong></h1><p>Here&#8217;s the uncomfortable version of this: a lot of what ships today as &#8220;an agent&#8221; isn&#8217;t yet ready to deploy across a business. </p><p>I want to be precise, because the frontier has genuinely moved in the last six months. Environments like Claude Code, OpenClaw, and similar platforms are capable - persistent task state, scheduled execution, multi-agent coordination, and long-running sessions that survive disconnects are no longer aspirational. These are not toys. The question has moved on.</p><p>The question now is whether an agent can run for a week instead of an hour. Whether it can cross three handoffs, two credential rotations, and an approval gate without a human babysitting the session. Whether the work it did on Tuesday is auditable on Friday by someone who wasn&#8217;t in the room. A session that survives a dropped WebSocket is table stakes. A mission that survives a quarter is the bar enterprises actually need.</p><p>Real work doesn&#8217;t fit in a session, and most of it doesn&#8217;t fit in a day either. A procurement workflow spans weeks and a dozen handoffs. A compliance audit runs for a month. An incident investigation outlives three on-call rotations. </p><p><strong>Most agents today hit a hard ceiling - sometimes time-based, sometimes token-based, sometimes governance-based - and when they hit it, the mission fails and a human picks up the pieces from wherever the transcript ended.</strong></p><p>Enterprise-grade autonomy requires durable, cloud-native execution with a much higher floor than &#8220;the session stayed up.&#8221; Concretely, that means:</p><ul><li><p><strong>State</strong> and <strong>checkpointing</strong> that survives restarts, disconnects, redeploys, and model version changes by default - not bolted on with a local Redis and a prayer.</p></li><li><p><strong>Context that outlives the window</strong>: long-horizon memory, summarization, and handoff between agent instances, so a multi-week task doesn&#8217;t die because a single run exhausted its tokens.</p></li><li><p><strong>Missions that outlive sessions</strong>: agents that stay on the job across days, handoffs, and credential rotations, with an auditable trail of what happened while you were asleep.</p></li><li><p><strong>First-class human-in-the-loop primitives,</strong> so the agent can pause and ask for permission to do something new instead of silently deciding it has the authority.</p></li></ul><p>Persistence with guardrails. That&#8217;s the bar. Anything less and you&#8217;re building demos that happen to run for a long time.</p><h1><strong>4) Agents need platforms</strong></h1><p>The pattern I see most often in strong teams is the saddest one: brilliant engineers draining their bandwidth into stack problems that do not differentiate their product. Custom memory. Bespoke eval harnesses. Homegrown observability. Handwritten retry logic. A tracing system that almost works. None of this is the hard part of the agentic era, and none of it is what your users are paying you for.</p><p>The real value lives in domain reasoning and business logic - the judgment calls that are specific to your company, your customers, your regulatory environment. Everything underneath should be the platform you <em>build on</em>, not the plumbing you <em>build</em>.</p><p>This is why the maturation of open primitives matters right now. Open-source orchestration frameworks exist precisely so the scaffolding isn&#8217;t locked behind any single vendor&#8217;s roadmap. The model that worked for cloud compute, containers, and CI/CD - start local on open primitives, graduate to a managed platform when you&#8217;re ready to scale - is the model agent platforms need to copy. </p><p><strong>Teams should be able to prototype on their laptop with the same building blocks they&#8217;ll run in production, and cross that boundary without a rewrite.</strong></p><p>That&#8217;s the engineering standard that lets teams stop fighting plumbing and get back to the product.</p><h2><strong>The five-year horizon</strong></h2><p>The teams that pull ahead in the next five years will not pull ahead by being smarter at writing boilerplate. They&#8217;ll pull ahead by <strong>choosing the right agent foundation</strong> and spending their engineering hours on the problems <em><strong>only they can solve</strong></em>.</p><p>Every month spent rebuilding the common stack - identity, context, persistence, orchestration - is a month not spent on the logic that actually makes your agents worth deploying. </p><p><strong>The agent stack has to become a solved problem.</strong> The only real question is whether you want to solve it yourself, again, or build on a foundation that was engineered for agents from the ground up.</p><p>My bet is on the latter. I think yours should be too.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w6mN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w6mN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 424w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 848w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w6mN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg" width="1456" height="930" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85329,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/194581773?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w6mN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 424w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 848w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!w6mN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F618c5adc-46c0-4142-9254-4ed4c5ab0eca_2556x1632.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Is the IDE dead?]]></title><description><![CDATA[How Agent orchestration is replacing the editor as the center of developer work]]></description><link>https://addyo.substack.com/p/death-of-the-ide</link><guid isPermaLink="false">https://addyo.substack.com/p/death-of-the-ide</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Fri, 20 Mar 2026 14:31:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wgTu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>The </strong><em><strong>center</strong></em><strong> of developer work is moving.</strong> Not disappearing - moving. Away from continuous, line-by-line editing inside a single window, and <strong>toward supervising agents</strong> that can plan, rewrite files, run tests, and propose changes for review. IDEs as we know them may stop being the primary tool for software work, or heavily evolve.</p><p>Across the tools many developers including myself are already using daily - <a href="https://conductor.build/">Conductor</a>, <a href="https://code.claude.com/docs/en/claude-code-on-the-web">Claude Code Web</a>, <a href="https://github.com/copilot/agents">GitHub Copilot Agent</a>, <a href="http://jules.google">Jules</a>, <a href="https://www.vibekanban.com/">Vibe KanBan</a>, even cmux - the same shift keeps showing up: <strong>the control plane is becoming the primary surface, and the editor is becoming one of several instruments underneath it.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Av7X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Av7X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Av7X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg&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;:466191,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/191542117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Av7X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Av7X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbfdde15-b9fc-4cf8-a399-5769c44274e7_2400x1350.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Cursor just shipped <a href="https://cursor.com/glass">Glass</a> - a new interface explicitly built to make &#8220;working with agents clear, intuitive, and in your control&#8221; where agent management is the primary experience and the traditional editor is something you reach for when you need to go deeper. The <a href="https://x.com/F2aldi/status/2034801927041818823">reaction</a> from developers was immediate: </p><blockquote><p><em>Now Cursor feels more like an Agent Orchestrator than an IDE. Managing agents in parallel is easier</em></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_!P0AV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P0AV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P0AV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png&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;:619387,&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;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/191542117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.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_!P0AV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!P0AV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48500cf2-98ed-4280-8ae9-25e3ae8d0669_1920x1080.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>But Glass is one data point in a much larger pattern. Terminal UIs like <a href="https://cmux.com/">cmux</a> highlight how the surfaces we&#8217;re used to are evolving to better manage agent workflows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BGo7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BGo7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 424w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 848w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 1272w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BGo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png" width="1456" height="843" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:843,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;cmux terminal app screenshot&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="cmux terminal app screenshot" title="cmux terminal app screenshot" srcset="https://substackcdn.com/image/fetch/$s_!BGo7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 424w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 848w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 1272w, https://substackcdn.com/image/fetch/$s_!BGo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936597fd-b43d-4b9e-8e0c-f6ae8aaa9929_3840x2224.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>From editing files to steering workstreams</h2><p>Historically, IDEs optimized for a tight inner loop: open files &#8594; edit &#8594; build &#8594; debug &#8594; repeat. <strong>The &#8220;death&#8221; argument is that this loop is no longer the dominant unit of productivity once agents can execute most of it autonomously.</strong></p><p>The new loop looks like this: <strong>specify intent &#8594; delegate &#8594; observe &#8594; review diffs &#8594; merge</strong>. What makes it different from &#8220;autocomplete with a chat window&#8221; is tool-using autonomy combined with interfaces designed to make that autonomy governable.</p><p>You can see this playing out across tools already in heavy use. Claude Code Web (or Desktop) and Codex let developers hand off well-defined tasks to agents running in isolated cloud environments, with progress visible in a browser - no terminal, no local setup required. </p><p>GitHub Copilot&#8217;s Agents plan and implements multi-file changes independently, creates branches, runs tests, and surfaces a PR for review; the developer&#8217;s primary job becomes reviewing the outcome and iterating, not directing each step. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L3L8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L3L8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 424w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 848w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L3L8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png" width="549" height="302.779532967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:549,&quot;bytes&quot;:549881,&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://addyo.substack.com/i/191542117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.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_!L3L8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 424w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 848w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!L3L8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9eef48-c593-4a33-a05c-cd2602ef85ff_3018x1664.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Conductor takes a different approach: a desktop app for running multiple Claude Code agents simultaneously in isolated workspaces, with live progress monitoring across all of them. And Google&#8217;s Jules handles asynchronous background tasks - you assign work, it runs, you review the result when it&#8217;s done. </p><p>What these tools share is a mental model: <strong>the agent is the unit of work, not the file</strong>. The interface worth optimizing is the one that helps you direct, monitor, and review agents - not the one that helps you type faster.</p><div><hr></div><h2>The orchestration layer taking shape</h2><p>The displacement story becomes persuasive only when you look at the specific interface patterns converging across tools.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uidv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uidv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 424w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 848w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 1272w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uidv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif" width="562" height="398.72664835164835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1033,&quot;width&quot;:1456,&quot;resizeWidth&quot;:562,&quot;bytes&quot;:136737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/avif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/191542117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Uidv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 424w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 848w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 1272w, https://substackcdn.com/image/fetch/$s_!Uidv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9d9a9-4541-4381-b6b8-14d07e95a2c2_2500x1774.avif 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Work isolation as a primitive.</strong> Parallel agents need to not step on each other. Virtually every serious tool in this space has landed on git worktrees (or similar) as the answer. Conductor maps each agent session to its own isolated workspace. Vibe Kanban (shown above) does the same for its kanban-driven agent workflow. The pattern is near ubiquitous because the problem is real: without isolation, parallel agents produce chaos.</p><p><strong>Planning and task state as the primary UI.</strong> Tools like Vibe Kanban have replaced &#8220;tabs and files&#8221; with &#8220;tasks and states&#8221; as the top-level mental model. You create task cards (a landing page, a backend service, an email integration), assign each to an agent and a model, and manage the whole effort like a lightweight project board - except the &#8220;team&#8221; is running autonomously. This is a project management surface that happens to have agents doing the implementation.</p><p><strong>Background agents and async-first design.</strong> Some of the most interesting tools in this space don&#8217;t even try to keep you in the loop during execution. Cursor, Copilot and Antigravity support background agents that run without requiring your presence - you define intent, step away, and review when they&#8217;re done. Jules works similarly: assign a task, come back to a diff. The implicit promise is that your attention is too valuable to spend watching a progress bar. That&#8217;s a significant departure from the IDE&#8217;s real-time, synchronous feedback loop.</p><p><strong>Attention management for parallel agents.</strong> When many agents run concurrently, the real bottleneck becomes knowing which one needs you <em>right now</em>. This is why tools like Conductor surface live progress across sessions and cmux introduced notification rings and unread badges for terminal panes. &#8220;Agent needs attention&#8221; is becoming a first-class event in the developer environment - something to route and triage, not just notice.</p><p><strong>Agents embedded into the software lifecycle.</strong> GitHub&#8217;s Copilot coding agent is asynchronous, secured by a control layer, and powered by GitHub Actions - attached to how code actually ships (issues &#8594; PRs &#8594; CI &#8594; merge), not just how it gets written. </p><p>None of these tools claim IDEs are obsolete - many still interoperate with them. But the repeated patterns (parallel workspaces, diff-first review, task state, background execution, lifecycle integration) are precisely what &#8220;death of the IDE&#8221; proponents mean when they talk about a center-of-gravity shift.</p><div><hr></div><h2>Why developers still reach for an IDE</h2><p><strong>The best critique of &#8220;the IDE is dead&#8221; is that the IDE </strong><em><strong>still</strong></em><strong> compresses several genuinely hard problems into a high-fidelity feedback loop</strong>: precise navigation, local reasoning, interactive debugging, and the ability to <em>understand</em> a system by directly manipulating it.</p><p>Even the most ambitious orchestration tools keep a manual-edit escape hatch. For example, reviewing diffs in-thread, commenting on changes, and then opening the result in your editor for manual adjustments. That&#8217;s an acknowledgment that human intervention is part of the intended workflow.</p><p>Agent tooling itself highlights where the limits still are. Multi-file refactorings in large repositories remain among the toughest challenges for software engineering agents. These are exactly the situations where interactive code navigation and human judgment still matter most - where you need to hold a mental model of the system that the agent can&#8217;t fully reconstruct from context alone.</p><p>The failure mode that keeps developers anchored to IDE-level inspection is agents being <em>almost</em> right. When something is 90% correct and subtly broken, the cost of finding the issue often exceeds what it would have taken to write it yourself. For high-stakes changes, the IDE remains the best instrument for that kind of deep, precise inspection.</p><div><hr></div><h2>The new costs: review fatigue and governance overhead</h2><p>If development becomes &#8220;run many agents in parallel&#8221; the workflow inherits problems that look less like text editing and more like distributed systems management - observability, permissions, isolation, and governance.</p><p>Agent workflows invert the labor. Instead of writing, you&#8217;re reviewing. That sounds like an improvement until you&#8217;re staring at twelve diffs from twelve parallel agents at the end of the day. Review fatigue is real, and it&#8217;s one of the reasons the most thoughtful tools in this space focus on attention routing, structured plans, and review-first gates rather than pushing for full autonomy by default.</p><p>The security surface also expands as agents gain access to more tools, repos, and external systems. As agents can browse the web, query databases, write to filesystems, and trigger deploys, what they&#8217;re <em>allowed</em> to do becomes as important as what they&#8217;re <em>capable</em> of doing.</p><p>On observability and control, IDE-integrated agent modes are already pushing toward explicit tool logs and approval gates. The governance question isn&#8217;t optional once agents act asynchronously and touch CI pipelines.</p><div><hr></div><h2>What survives: the IDE, the control plane, or both</h2><p>A clear reading of the landscape is that &#8220;death of the IDE&#8221; is directionally right about the <em>center of gravity</em>, but wrong as a literal forecast.</p><p>The strongest version of the claim is this: <strong>the IDE stops being the primary workspace and becomes one of several subordinate instruments</strong> - used for targeted inspection, debugging, and final edits - while planning, orchestration, review, and agent management move into dashboards, issue trackers, observability terminals, and cloud control planes. </p><p>The &#8220;bigger IDE&#8221; framing is equally well-supported. The new &#8220;IDE&#8221; is a system that provides multi-agent orchestration, isolated workspaces, permissions and audit logs, diff-first review, reliable tool connectivity, and attention routing. <strong>The file editor is still there. It&#8217;s just no longer the front door.</strong></p><p>The IDE isn&#8217;t dying. It&#8217;s being <em>de-centered</em>. The work is moving outward - into orchestration surfaces where humans define intent, delegate to parallel agent runtimes, and spend more time supervising, reviewing, and governing than typing. </p><p><strong>The IDE remains critical for correctness, comprehension, and the hard problems agents still struggle with. But its no longer the only place where programming happens - and for a growing number, it&#8217;s no longer the first place they go.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wgTu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wgTu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wgTu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg&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;:30361,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/191542117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wgTu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wgTu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2368a63a-b3fc-4358-a6c5-57f2a33c6fd8_1376x768.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[14 More lessons from 14 years at Google]]></title><description><![CDATA[This time about teams, trust, and the systems around the code.]]></description><link>https://addyo.substack.com/p/14-more-lessons-from-14-years-at</link><guid isPermaLink="false">https://addyo.substack.com/p/14-more-lessons-from-14-years-at</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Thu, 12 Feb 2026 15:30:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4cMX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A while back, I wrote down <a href="https://addyo.substack.com/p/21-lessons-from-14-years-at-google">21 lessons from my time at Google</a>. The response caught me off guard because of <em>which</em> ones stuck. It wasn&#8217;t tech-specific advice. It was the stuff about people, decisions, and the messy reality of building things together.</p><p>That made me realize I&#8217;d left a lot on the table. The first list skewed toward individual craft - how to write better code, how to think about your career. But some of the hardest lessons I&#8217;ve learned aren&#8217;t about how you work. They&#8217;re about how teams work: how decisions actually get made, where coordination breaks down, what separates the groups that ship from the ones that spin.</p><p>These lessons pick up where the first left off. They&#8217;re less about being a better individual engineer and more about the systems around the engineering.</p><h2><strong>1. The best engineers pick the right problems to solve.</strong></h2><p>Every yes is an implicit no to something else.</p><p>I&#8217;ve watched talented engineers burn out because they said yes to everything - every bug, every feature request, every &#8220;quick favor.&#8221; Their calendar filled up with other people&#8217;s priorities, and their own roadmap became a graveyard of half-finished ideas.</p><p>Sometimes it&#8217;s just because they truly do care so much about the product. Protect your bandwidth from &#8220;nice to have&#8221; the same way you protect production from outages. The skill is doing the right things and letting the wrong things stay undone.</p><p>The engineers who create disproportionate impact aren&#8217;t necessarily faster or smarter. They&#8217;re more ruthless about what deserves their attention. They&#8217;ve learned that the opportunity cost of working on the wrong thing is working on the wrong thing.</p><h2><strong>2. If you can&#8217;t say what decision you&#8217;re asking for, you&#8217;re not ready for the meeting.</strong></h2><p>Most meetings fail not because they&#8217;re unnecessary, but because they&#8217;re disguised journaling. I&#8217;ve sat through hundreds of hours where smart people talked around a problem without ever naming what they needed. The meeting ends with vibes and no owner.</p><p>I learned to start with the ask: approve, choose, unblock, or inform.</p><p>Just those four words changed how I prepare for every meeting. If I can&#8217;t pick one, I&#8217;m not ready to take anyone&#8217;s time. And when I&#8217;m on the receiving end, I&#8217;ve started asking &#8220;what decision do you need from me?&#8221; within the first two minutes. It sounds blunt, but people are usually relieved - they often didn&#8217;t realize they hadn&#8217;t defined it themselves.</p><p>The hidden cost of vague meetings isn&#8217;t just the hour you lose. It&#8217;s the week of drift that follows while everyone waits for clarity that never came.</p><h2><strong>3. &#8220;We should&#8221; is not a plan. &#8220;On Tuesday, I will&#8221; is a plan.</strong></h2><p>The difference between motion and progress is specificity.</p><p>Teams drown in intentions. I&#8217;ve watched roadmaps fill up with &#8220;we should improve the onboarding flow&#8221; and &#8220;we should reduce latency&#8221; and &#8220;we should document the API.&#8221; Months later, the same items are still there, gathering dust and guilt. You might think that&#8217;s a solved problem now that we have <a href="https://addyosmani.com/blog/agentic-engineering/">agentic engineering</a>, but not quite.</p><p>Convert talk into the smallest next action someone can actually do, then put a name and a date on it. Not &#8220;we should improve onboarding&#8221; but &#8220;On Tuesday, Sarah will run three user sessions and document the top friction points.&#8221;</p><p>This is about respecting that humans need traction to make progress. Vague intentions create anxiety. Specific commitments create momentum. The plan doesn&#8217;t have to be perfect - it just has to be concrete enough that someone can actually start.</p><h2><strong>4. Slow code is sometimes a symptom. Slow decisions are always a problem.</strong></h2><p>Speed is about removing the friction that makes smart people hesitate. &#8220;Bias towards action&#8221; when you can.</p><p>When a project drags, the instinct is to blame velocity: people aren&#8217;t working hard enough, the codebase is messy, there aren&#8217;t enough engineers. But in my experience, slow code is often a symptom. Slow decisions are the disease.</p><p>If decisions routinely take weeks or months, look deeper. Missing context means people can&#8217;t evaluate tradeoffs. Unclear ownership means everyone&#8217;s waiting for someone else to decide. Fear of accountability means people hedge instead of commit.</p><p>The fastest engineering team I ever worked with wasn&#8217;t the one with the best programmers. It was the one where decisions happened in hours instead of weeks because the authority was clear, the context was shared, and being wrong wasn&#8217;t a career risk.</p><h2><strong>5. Reliability is a product feature. Treat it like one.</strong></h2><p>Users don&#8217;t praise reliability but they do notice its absence.</p><p>This creates a dangerous dynamic: reliability work is invisible until it fails, which means it&#8217;s perpetually under-resourced compared to shiny new features.</p><p>Error budgets are one way to make the tradeoff explicit. If your service has an SLO of 99.9% uptime, you have a &#8220;budget&#8221; of 0.1% downtime to spend on innovation. Burn through it, and you focus on reliability until you&#8217;ve earned it back. This is a framework for having honest conversations about risk.</p><p>The teams that maintain both velocity and reliability don&#8217;t do it through heroics. They do it by treating reliability as a first-class product feature with its own roadmap, its own metrics, and its own advocates. </p><p>You wouldn&#8217;t ship a feature without product review. Don&#8217;t ship a system without some kind of reliability discussion.</p><h2><strong>6. You can&#8217;t &#8220;communication&#8221; your way out of a bad interface between teams.</strong></h2><p>Team interaction modes exist for a reason: collaboration (working closely together), service (clear API and SLAs), or facilitation (one team helping another build capability). </p><p>Most cross-team pain isn&#8217;t about effort or good intentions. It&#8217;s about unclear boundaries and messy contracts. I&#8217;ve watched teams &#8220;improve communication&#8221; by adding more meetings, more Slack channels, more syncs - and it doesn&#8217;t make things better.</p><p>The problem isn&#8217;t that people aren&#8217;t talking. It&#8217;s that the interface between teams is undefined. Who owns what? What&#8217;s the contract? What can team A depend on team B for, and vice versa?</p><p>Choose deliberately, and you&#8217;ll need fewer meetings to make things work. Try to paper over a bad interface with communication, and you&#8217;ll burn out your most collaborative people while the underlying dysfunction remains.</p><h2><strong>7. The best escalation comes with a proposal.</strong></h2><p>&#8220;Here&#8217;s the problem&#8221; is half the job. I used to think my role was to identify issues and bring them to leadership. That&#8217;s necessary but insufficient.</p><p>&#8220;Here are two options, the tradeoffs, and what I recommend&#8221; is how you get unblocked and earn trust. It shows you&#8217;ve done the thinking. It gives decision-makers something super specific to react to instead of an open-ended problem to solve.</p><p>It makes their job easier, which makes them more likely to give you what you need.</p><p>The difference between &#8220;I need help&#8221; and &#8220;I need you to choose between A and B, and here&#8217;s why I lean toward B&#8221; is the difference between being a problem-raiser and being a problem-solver.</p><p>Both identify issues. Only one earns increasing trust and autonomy.</p><h2><strong>8. Avoid hero culture. Build systems that don&#8217;t require heroes.</strong></h2><p>The hero is burned out, undocumented, and a single point of failure.</p><p>If one person saving the day is a recurring pattern, that&#8217;s a failure mode rather than a badge of honor. I&#8217;ve seen teams celebrate their heroes while ignoring the dysfunction that made heroism necessary.</p><p>When they leave - and they always leave eventually - the team discovers that no one else really knows how things work. The celebration of heroism masks a systemic problem: the path for &#8220;normal humans on a normal day&#8221; doesn&#8217;t work.</p><p>Make the normal path the default. Document the system. Spread the knowledge. Design for the average Tuesday, not the exceptional crisis. Heroes should be unnecessary, and if they&#8217;re necessary, you should be working to make them unnecessary.</p><h2><strong>9. Make observability part of the feature.</strong></h2><p>A feature without telemetry is a liability in disguise.</p><p>If you ship a feature without knowing how it behaves in production, you shipped uncertainty. </p><p>I&#8217;ve watched teams celebrate launches only to discover weeks later that their feature was silently failing for 20% of users. They had no logs, no metrics, no dashboards but a gap where understanding should be. This can cause all kinds of pain if you want to fix it, including unshipping just to properly A/B test with observability in place.</p><p>Logs, traces, dashboards, and alerts aren&#8217;t &#8220;ops work.&#8221; They&#8217;re how you learn. They&#8217;re how you know whether the thing you built actually works for real people doing real things in real conditions.</p><p>The best engineers I know treat observability as part of the definition of done. Not &#8220;I wrote the code&#8221; but &#8220;I wrote the code and I can see it working.&#8221;</p><h2><strong>10. Small PRs are kindness. Especially if the PR is AI generated.</strong></h2><p>Small changes are easier to review, easier to reason about, and easier to revert.</p><p>I used to write large pull requests. I liked the idea of a complete feature being reviewable at once. I was optimizing for my convenience at the expense of my reviewers&#8217; sanity. Smaller PRs are often better for everyone.</p><p>They ship faster because they don&#8217;t sit in a review queue while someone tries to find an hour to understand your thousand-line diff. If you want teammates to trust your pace, make your work reviewable.</p><p>The hidden benefit is that small PRs force you to think in increments. Instead of one monolithic change, you build up capability piece by piece. Each piece gets feedback. Each piece can be rolled back independently. It&#8217;s slower per-PR but faster to actual production.</p><h2><strong>11. When you add a team, you add edges, not just nodes.</strong></h2><p>Coordination cost grows faster than headcount.</p><p>This is why &#8220;just throw more people at the problem&#8221; often fails, and why adding heads late in a project can make it later. Every new person adds communication overhead with everyone they need to coordinate with. The graph gets denser, not just larger.</p><p>I&#8217;ve seen managers genuinely puzzled when a team doubled in size but output barely changed. The answer is always the same: the new edges ate the new capacity. More people meant more alignment meetings, more context-sharing, more waiting for decisions that now required more stakeholders.</p><p>The solution isn&#8217;t to stop hiring. It&#8217;s to be intentional about reducing edges. Clear ownership. Autonomous teams with minimal dependencies. Interfaces that let people work in parallel instead of in lockstep. The best organizations aren&#8217;t the ones with the most people - they&#8217;re the ones with the most leverage per person.</p><h2><strong>12. The migration is never just a migration</strong></h2><p>Every migration is a negotiation between the system you have, the system you want, and the people who didn&#8217;t ask for either.</p><p>I&#8217;ve seen migrations estimated at one quarter stretch to years. Not because the technical work was wrong, but because nobody accounted for the human work: convincing teams to prioritize your migration over their roadmap, supporting the long tail of edge cases nobody knew existed, and maintaining two systems in parallel while the old one refuses to die.</p><p>The technical plan is the easy part. The hard part is designing for coexistence. You will run old and new simultaneously for longer than you think. You will discover that the &#8220;legacy&#8221; system encodes decisions nobody documented and workflows nobody remembers designing but everyone depends on. You will need a adoption strategy that doesn&#8217;t require every team to drop what they&#8217;re doing at once.</p><p>The migrations that actually finish share three traits: a sponsor who stays engaged past the kickoff, a team that really owns the migration instead of treating it as a side quest, and a clear deprecation date that people believe is real. Without all three, you get a migration that&#8217;s perpetually &#8220;almost done&#8221; - which is worse than not starting, because now you&#8217;re paying the cost of two systems indefinitely.</p><p>If you&#8217;re not willing to fund the finish, don&#8217;t start the migration.</p><h2><strong>13. AI makes drafts cheap. Taste becomes expensive.</strong></h2><p>Everyone can generate code now. The barrier to producing code, content, designs - it&#8217;s largely collapsing. AI will write you ten versions of anything in the time it used to take to write one.</p><p>The differentiator is choosing: what to build, what to delete, what to simplify, what not to ship, and what &#8220;good&#8221; looks like. Taste - the ability to distinguish between options and pick the right one - becomes the scarce resource.</p><p>Use AI to explore options fast, then apply judgment ruthlessly. The engineers who thrive in this environment won&#8217;t be the ones who generate the most. They&#8217;ll be the ones who curate the best.</p><p>Production is cheap. Editing is expensive. Selection is everything.</p><h2><strong>14. Trust is a latency optimization for teams.</strong></h2><p>This is the highest-leverage thing you can build. Not a system but credibility.</p><p>When people trust you, they don&#8217;t need five meetings to approve a decision. They assume competence, good intent, and follow-through. Decisions that would take weeks in a low-trust environment take hours in a high-trust one.</p><p>Every time you deliver on a promise, every time you&#8217;re honest about a mistake, every time you make someone else&#8217;s life easier, you&#8217;re depositing into an account that will pay dividends for years.</p><p>I&#8217;ve watched engineers with modest technical skills accomplish enormous things because everyone trusted them. I&#8217;ve watched brilliant engineers accomplish little because nobody would take their calls.</p><p>The code doesn&#8217;t matter if you can&#8217;t get anyone to ship it with you.</p><h2><strong>A final thought</strong></h2><p>The first time around, I said these lessons come down to staying curious, staying humble, and remembering that the work is about people. I still believe that.</p><p>But if this second list has a through-line, it&#8217;s something more specific: the work is about making it easier for normal people to do extraordinary things on a normal day. A career in engineering gives you plenty of time to learn these things the hard way and I&#8217;ve certainly learned a lot during my time at Google so far.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IMBS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IMBS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IMBS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg" width="308" height="410.49280270956814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1574,&quot;width&quot;:1181,&quot;resizeWidth&quot;:308,&quot;bytes&quot;:234411,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/187716319?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IMBS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IMBS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F797bdb7f-ae19-4038-a929-14265678f331_1181x1574.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 hope a few of them save you a scar or two. And if they do, share what you&#8217;ve figured out with someone earlier in the journey. </p><p>That&#8217;s how the good lessons travel.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4cMX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4cMX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4cMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1246393,&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://addyo.substack.com/i/187716319?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.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_!4cMX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!4cMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f101eb-1d56-49a1-8b88-1c8890a86dbb_7838x7838.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[The 80% Problem in Agentic Coding]]></title><description><![CDATA[Managing comprehension debt when leaning on AI to code]]></description><link>https://addyo.substack.com/p/the-80-problem-in-agentic-coding</link><guid isPermaLink="false">https://addyo.substack.com/p/the-80-problem-in-agentic-coding</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Wed, 28 Jan 2026 17:20:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lmAD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Andrej Karpathy&quot;,&quot;id&quot;:23972309,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6d0938b-93a9-4ead-933f-26da5da1bafc_400x400.jpeg&quot;,&quot;uuid&quot;:&quot;17d7fb74-2769-43c2-9344-1afaa83fa8c8&quot;}" data-component-name="MentionToDOM"></span> said something this week that made me pause: </p><blockquote><p><strong>&#8220;I rapidly went from about 80% manual+autocomplete coding and 20% agents to 80% agent coding and 20% edits+touchups. I really am mostly programming in English now.&#8221;</strong></p></blockquote><p>The inversion happened over a few weeks in late 2025. While this may apply to new (greenfield) or personal projects more than existing or legacy apps, I imagine <strong>how far AI takes you is still further than a year ago. </strong>You can thank models, specs, skills, MCPs and our workflows improving. </p><p>Boris Cherney, creator of Claude Code, has recently echoed similar sentiments:</p><blockquote><p><strong>&#8220;Pretty much 100% of our code is written by Claude Code + Opus 4.5. For me personally it has been 100% for two+ months now, I don&#8217;t even make small edits by hand. I shipped 22 PRs yesterday and 27 the day before, each one 100% written by Claude. I think most of the industry will see similar stats in the coming months - it will take more time for some vs others.&#8221;</strong></p></blockquote><p>Some time ago I wrote about &#8220;<a href="https://addyo.substack.com/p/the-70-problem-hard-truths-about">the 70% problem</a>&#8221; - where AI coding took you to 70% completion, then leave the final 30% last mile for humans. That framing may now be evolving. The percentage may shift to 80% or higher for certain kinds of projects, but the nature of the problem changed more dramatically than the numbers suggest.</p><p>Armin Ronacher&#8217;s <a href="https://x.com/mitsuhiko/status/2010446141817844207">poll</a> of 5,000 developers compliments this story: 44% now write less than 10% of their code manually. Another 26% are in the 10-50% range. We&#8217;ve crossed a threshold. But here&#8217;s what the triumphalist narrative misses: the problems didn&#8217;t disappear, they shifted. And some got worse.</p><p><strong>I want to caveat: I&#8217;ve definitely felt the shift to 80%+ agent coding on new side-projects, however, this is </strong><em><strong>very</strong></em><strong> different in large or existing apps, especially where teams are involved. Expectations differ, but this is a taste of where we&#8217;re headed.</strong></p><h2>The mistakes changed</h2><p><strong>AI errors evolved from syntax bugs to conceptual failures - the kind a sloppy, hasty junior may make under time pressure.</strong></p><p>Karpathy catalogs what still breaks: </p><blockquote><p><strong>&#8220;The models make wrong assumptions on your behalf and run with them without checking. They don&#8217;t manage confusion, don&#8217;t seek clarifications, don&#8217;t surface inconsistencies, don&#8217;t present tradeoffs, don&#8217;t push back when they should. They&#8217;re still a little too sycophantic.&#8221;</strong></p></blockquote><p><strong>Assumption propagation</strong>: The model misunderstands something early and builds an entire feature on faulty premises. You don&#8217;t notice until you&#8217;re five PRs deep and the architecture is cemented. This is kind of two-steps-back pattern.</p><p><strong>Abstraction bloat</strong>: Given free rein, agents can overcomplicate relentlessly. They&#8217;ll scaffold 1,000 lines where 100 would suffice, creating elaborate class hierarchies where a function would do. You have to actively push back: &#8220;Couldn&#8217;t you just...?&#8221; The response is always &#8220;Of course!&#8221; followed by immediate simplification. They&#8217;re optimizing for looking comprehensive, not for maintainability.</p><p><strong>Dead code accumulation</strong>: They often don&#8217;t clean up after themselves. Old implementations linger. Comments get removed as side effects. Code they don&#8217;t fully understand gets altered anyway because it was adjacent to the task.</p><p><strong>Sycophantic agreement</strong>: They don&#8217;t always push back. No &#8220;Are you sure?&#8221; or &#8220;Have you considered...?&#8221; Just enthusiastic execution of whatever you described, even if your description was incomplete or contradictory.</p><p><strong>It&#8217;s possible to mitigate some of this via Skills if you know what to watch for.</strong></p><p>These otherwise persist despite system prompts, despite CLAUDE.md instructions, despite plan mode. They&#8217;re not bugs to be fixed - they&#8217;re sometimes inherent to how these systems work. </p><p><strong>Agents optimize for coherent output, not for questioning your premises.</strong></p><p>I've watched this happen on my own teams - code that looks right in review but breaks three commits later when someone touches an adjacent system. </p><p>If you&#8217;re data minded, recent <a href="https://www.sonarsource.com/blog/ai-coding-trust-gap/">survey data</a> suggests &#8220;verification bottleneck&#8221; has emerged: only 48% of developers consistently check AI-assisted code before committing it, even though 38% find that reviewing AI-generated logic actually requires more effort than reviewing human-written code. <strong>We&#8217;re generating correct code faster, but may be accumulating technical debt even faster.</strong></p><h2>Comprehension debt: a hidden cost we don&#8217;t track</h2><p><strong>Generation (writing code) and discrimination (reading code) are different cognitive capabilities. You can review code competently even after your ability to write it from scratch has atrophied. But there&#8217;s a threshold where &#8220;review&#8221; becomes &#8220;rubber stamping.&#8221;</strong></p><p><a href="https://x.com/jeremytwei/status/2015886793955229705">Jeremy Twei</a> coined the perfect term for this: <em>comprehension debt</em>. It&#8217;s certainly tempting to just move on when the LLM one-shotted something that seems to work. This is the insidious part. The agent doesn&#8217;t get tired. It will sprint through implementation after implementation with unwavering confidence. The code looks plausible. The tests pass (or seem to). You&#8217;re under pressure to ship. You move on.</p><p><strong>Over time, you may understand less of your own codebase.</strong></p><p>I caught myself doing this last week. Claude implemented a feature I&#8217;d been putting off for days. The tests passed. I skimmed it, nodded, merged. Three days later I couldn&#8217;t explain how it worked.</p><p>Yoko Li <a href="https://x.com/stuffyokodraws/status/2013373307291340870">captured</a> the addiction loop perfectly: </p><blockquote><p><strong>&#8220;The agent implements an amazing feature and got maybe 10% of the thing wrong, and you&#8217;re like &#8216;hey I can fix this if I just prompt it for 5 more mins.&#8217; And that was 5 hrs ago.&#8221;</strong></p></blockquote><p>You&#8217;re always <em>almost</em> there. The final 10% feels tantalizingly close. Just one more prompt. Just one more iteration. The psychological hook is real.</p><p>Someone <a href="https://news.ycombinator.com/user?id=vibeprofessor">else</a> put it differently: </p><blockquote><p>&#8220;I spend most of my time babysitting agents. The AGI vibes are real, but so is the micromanagement tax. You&#8217;re not coding anymore, you&#8217;re supervising. Watching. Redirecting. It&#8217;s a different kind of exhausting.&#8221;</p></blockquote><p><strong>The dangerous part: it&#8217;s trivially easy to review code you can no longer write from scratch.</strong> If your ability to &#8220;read&#8221; doesn&#8217;t scale with the agent&#8217;s ability to &#8220;output,&#8221; you&#8217;re not engineering anymore. You&#8217;re hoping.</p><h2>The productivity paradox: More code, same throughput</h2><p><strong>Individual output surged 98% in high-adoption teams, but PR review time increased anywhere as high as 91%. </strong></p><p>The data from <a href="https://www.faros.ai/blog/key-takeaways-from-the-dora-report-2025">Faros AI</a> and Google&#8217;s <a href="https://dora.dev/research/2025/dora-report/">DORA report</a> are interesting:</p><ul><li><p>Teams with high AI adoption merged 98% more PRs</p></li><li><p>Those same teams saw review times balloon 91%</p></li><li><p>PR size increased 154% on average</p></li><li><p>Code review became the new bottleneck</p></li></ul><p>Atlassian&#8217;s 2025 survey found the paradox in stark terms: 99% of AI-using developers reported saving 10+ hours per week, yet most reported <em>no decrease in overall workload</em>. The time saved writing code was consumed by organizational friction - more context switching, more coordination overhead, managing the higher volume of changes.</p><p><strong>We got faster cars, but the roads got more congested.</strong></p><p>We're producing more code but spending more time reviewing it. The bottleneck just moved. When you make a resource cheaper (in this case, code generation), consumption increases faster than efficiency improves, and total resource use goes up. </p><p>We&#8217;re not writing less code. We&#8217;re writing <em>vastly</em> more code, and someone still has to understand much of it. There are of course groups of developers who feel this should no longer be the case if AI can do that.</p><h2>Where the 80/20 split actually works</h2><p><strong>The 80% threshold is most accessible in greenfield contexts where you control the entire stack and comprehension debt stays manageable through small team size.</strong></p><p>This actually works in a few contexts. </p><ul><li><p>Personal projects where you control everything</p></li><li><p>MVPs where &#8220;good enough&#8221; is actually good enough</p></li><li><p>Startups in greenfield territory without legacy constraints</p></li><li><p>Teams small enough that comprehension debt stays manageable</p></li></ul><p>In these environments, the agent&#8217;s weaknesses matter less. You can scaffold rapidly, refactor aggressively, throw away code without political friction. The pace of iteration outweighs occasional misdirection.</p><p>In mature codebases with complex invariants, the calculus inverts. The agent doesn&#8217;t know what it doesn&#8217;t know. It can&#8217;t intuit the unwritten rules. Its confidence scales inversely with context understanding.</p><p>Someone pointed out the obvious thing I was tiptoeing around: the first 90% might be easy, but the last 10% can take a long time. 90% accuracy is fine for non-mission-critical stuff. For the parts that actually matter, it's nowhere close. Self-driving cars work great until they don't, and that's why L2 is everywhere but L4 is still mostly vaporware.</p><p>For non-engineers, the wall is lower but still real. Tools like AI Studio, v0 and Bolt can turn sketches into working prototypes instantly. But hardening that prototype for production - handling real user data at scale, ensuring security and compliance - still requires engineering fundamentals. AI gets you 80% to an MVP; the last 20% requires patience, learning deeply or hiring engineers.</p><h2>Two different populations</h2><p><strong>We&#8217;re not seeing a smooth curve of adoption - we&#8217;re seeing a split between those who&#8217;ve crossed the threshold and everyone else. The gap between early adopters and the rest is widening, not closing.</strong></p><p>Armin&#8217;s poll revealed what raw adoption numbers obscure: 44% of developers still write over 90% of their code manually. We have a bimodal distribution, not a bell curve. On one side: people like Karpathy and the Claude Code team, shipping dozens of PRs daily with 100% AI-written code, iterating faster than ever before. On the other: the vast majority, incrementally adopting copilot-style tools but not fundamentally changing their workflow.</p><p>The age split may be visible in discourse too. Younger developers seem more willing to adapt workflow radically. Older developers are more skeptical - not because they can't use the tools, but because they've seen enough cycles to know the difference between a temporary productivity boost and a sustainable practice. Both might be right.</p><p>Stack Overflow&#8217;s 2025 survey showed only 16% reported &#8220;great&#8221; productivity improvements. Half saw modest gains. The top frustrations: &#8220;AI solutions that are almost right, but not quite&#8221; (66%) and &#8220;debugging AI code takes longer than writing it myself&#8221; (45%).</p><p>The engineers who <em>appear</em> to be thriving in 2026 aren&#8217;t just using better tools. They&#8217;ve reconceptualized their role from <em>implementer</em> to <em>orchestrator</em>. They&#8217;ve learned to think declaratively rather than imperatively. They&#8217;ve accepted that their job is now architectural oversight and quality control, not line-by-line coding.</p><p>Those struggling are trying to use AI as a faster typewriter. They haven&#8217;t adapted their workflow. They&#8217;re fighting the agent&#8217;s approach instead of redirecting its goals. They haven&#8217;t invested in learning to prompt effectively which is now as critical as writing good documentation or design specs ever was.</p><p>There's an uncomfortable truth here: <strong>orchestrating agents feels a lot like <a href="https://addyosmani.com/blog/coding-agents-manager/">management</a></strong>. Delegating tasks. Reviewing output. Redirecting when things go sideways. If you became an engineer because you didn't want to be a manager, this shift might feel like a betrayal. The role changed underneath you.</p><p><strong>The gap seems to be widening. The people who&#8217;ve figured out how to work with these tools are shipping stuff I can barely keep up with. Everyone else is... still figuring it out.</strong></p><p>This split may make some uncomfortable. I&#8217;ve always said I&#8217;m a builder, but I also enjoyed programming. The idea that these are now diverging paths - that you have to pick one - feels reductive. Like we&#8217;re forcing a binary on something more complicated. Someone in the comments said it perfectly: both viewpoints are valid, just different wiring. Neither is wrong.</p><h2>From imperative to declarative: The real leverage</h2><p><strong>Don&#8217;t tell the AI what to do - give it success criteria and watch it loop. The magic isn&#8217;t in the agent writing code, it&#8217;s in the agent iterating until it satisfies conditions you specify.</strong></p><p>Karpathy&#8217;s observation about leverage cuts to the core: </p><blockquote><p><strong>&#8220;LLMs are exceptionally good at looping until they meet specific goals and this is where most of the &#8216;feel the AGI&#8217; magic is to be found.&#8221;</strong></p></blockquote><p>The shift from imperative to declarative development:</p><p><strong>Old model (imperative)</strong>: &#8220;Write a function that takes X and returns Y. Use this library. Handle these edge cases. Make sure to...&#8221;</p><p><strong>New model (declarative)</strong>: &#8220;Here are the requirements. Here are the tests that must pass. Here&#8217;s the success criteria. Figure out how.&#8221;</p><p>This works because agents never get demoralized. They&#8217;ll try approaches you wouldn&#8217;t have patience for. They iterate relentlessly. If you specify the destination clearly, they&#8217;ll navigate there - even if it takes 30 failed attempts.</p><p>The patterns that work:</p><ul><li><p>Write tests first, let the agent iterate until they pass</p></li><li><p>Hook it up to a browser via MCP, let it verify behavior visually</p></li><li><p>Implement the naive correct version, then optimize while preserving correctness</p></li><li><p>Define the API contract, let it implement to spec</p></li></ul><p>But this only works if your success criteria are actually correct. Garbage in, garbage out scales with capability.</p><p>The developers succeeding with this approach spend 70% of their time on problem definition and verification strategy, 30% on execution. The ratios inverted from traditional development, but the total time decreased dramatically.</p><h2>The slopacolypse question</h2><p><strong>When anyone can generate thousands of lines of code in minutes, the ability to say &#8216;we don&#8217;t need this&#8217; becomes more valuable.</strong></p><p>Karpathy warned: </p><blockquote><p>&#8220;<strong>I am bracing for 2026 as the year of the slopacolypse across all of github, substack, arxiv, X/instagram, and generally all digital media.&#8221;</strong></p></blockquote><p>The concern is straightforward: when anyone can generate arbitrarily large volumes of plausible-looking code, content, papers, or posts, how do we maintain signal-to-noise ratio?</p><p>Boris Cherny offers a counterpoint: &#8220;My bet is that there will be no slopcopolypse because the model will become better at writing less sloppy code and at fixing existing code issues. In the meantime, what helps is having the model code review its code using a fresh context window.&#8221;</p><p>Both can be true simultaneously. The capability for slop exists at unprecedented scale. The tooling to prevent it is emerging. The question is which scales faster.</p><p><strong>The slopacolypse will be driven by people who mistake velocity for productivity.</strong> Agents are marathon runners with no sense of direction unless you give it to them. They will sprint ten miles into a brick wall if you don&#8217;t audit the &#8220;code actions&#8221; where necessary.</p><p>The teams I&#8217;ve seen handle this well tend to do a few things:</p><ul><li><p>Fresh-context code reviews help, though it feels weird asking the same model to critique its own code. It works, though - give it a clean slate and it catches its own mistakes.</p></li><li><p>Automated verification at every step (CI/CD, linters, type checkers, tests as guardrails)</p></li><li><p>Deliberate constraints on agent autonomy (bounded tasks, clear success criteria)</p></li><li><p>High emphasis on human-in-the-loop at architectural decision points</p></li></ul><p>The code quality problems Karpathy describes - overcomplication, abstraction bloat, dead code - these improve as models improve. But they won&#8217;t disappear. They&#8217;re emergent from how these systems approach problems.</p><h2>What actually works: practical patterns</h2><p><strong>The future belongs to those who can maintain a coherent mental model of the macro while agents handle tactical drudgery of the micro.</strong></p><p>After watching teams adapt over the past year, effective patterns have crystallized:</p><p><strong>1. Agent-first drafts with tight iteration loops</strong> </p><p>Don&#8217;t use AI for one-off suggestions. Generate entire first drafts, then refine. The Claude Code team practice: have the model review its own code with a fresh context window. This catches issues before human review.</p><p><strong>2. Declarative communication</strong> </p><p>Spend 70% of effort on problem definition, 30% on execution. Write comprehensive specs, define success criteria, provide test cases up front. Guide the agent&#8217;s goals, not its methods.</p><p><strong>3. Automated verification</strong> </p><p>If you repeatedly fix the same class of mistake, write a test or lint rule preemptively. Make the agent explain its code and flag potential problems before you review.</p><p><strong>4. Deliberate learning vs. just focusing so much on production</strong> </p><p>Use AI as a learning tool, not a crutch (you&#8217;ve heard this a few times now). When the agent writes something you don&#8217;t understand, that&#8217;s a signal to dig deeper. Treat AI-generated code like code from a mentor - review it to learn, not just to ship.</p><p><strong>5. Architectural hygiene</strong> </p><p>More modularization, clearer API boundaries. Well-documented style guides fed into prompts. High-level architecture descriptions provided before coding begins. The planning phase expanded; the coding phase compressed; the review phase focused on design rather than syntax.</p><p><strong>The developers who thrive won&#8217;t be those who generate the most code. They&#8217;ll be those who know which code to generate, when to question the output, and how to maintain comprehension even as their hands leave the keyboard.</strong></p><h2>The uncomfortable truth about skill development</h2><p><strong>If your ability to &#8220;read&#8221; doesn&#8217;t scale at the same rate as the agent&#8217;s ability to &#8220;output,&#8221; you aren&#8217;t engineering anymore. You&#8217;re rubber stamping.</strong></p><blockquote><p>&#8220;It&#8217;s been like the boiling frog for me. Started by copy-pasting more into ChatGPT. Then more in-IDE prompting. Then agent tools. Suddenly I barely hand code anymore. The transition was so gradual I didn&#8217;t notice until I was already there&#8221; [<a href="https://news.ycombinator.com/user?id=shawabawa3">HN</a>]</p></blockquote><p>There&#8217;s early evidence of skill atrophy in heavy AI users. Junior developers who rely on AI for everything report feeling less confident in problem-solving abilities over time. It&#8217;s the Google effect applied to coding - when you outsource constantly, your brain stops retaining.</p><p>I don&#8217;t know what the solution is, but I&#8217;ve been trying a few things:</p><ul><li><p>Use TDD: write tests (or think through test cases) before letting AI implement</p></li><li><p>Pair with seniors: discuss AI suggestions in real-time to learn the decision-making process</p></li><li><p>Ask for explanations: have the AI justify its approach, not just generate solutions</p></li><li><p>Alternate: write some features manually to maintain muscle memory</p></li></ul><p><strong>The risk is real: it&#8217;s dangerously easy to review code you can no longer write from scratch.</strong> When that happens, you&#8217;ve become dependent on the tool in a way that limits your growth.</p><p>The engineers who will thrive long-term are those who use AI to accelerate gaining experience, not to bypass it entirely. They maintain their fundamentals while leveraging AI to explore more territory faster.</p><h2>Where this leaves us</h2><p><strong>The shift from 70% to 80% isn&#8217;t about percentages - it&#8217;s about the gap between prototype and production-ready software. That gap is narrowing, but it hasn&#8217;t closed.</strong></p><p>Karpathy asks the right questions: </p><blockquote><p><strong>&#8220;What happens to the &#8216;10X engineer&#8217; - the ratio of productivity between the mean and the max engineer? It&#8217;s quite possible that this grows a lot. Armed with LLMs, do generalists increasingly outperform specialists?&#8221;</strong></p></blockquote><p>These questions will define the next few years.</p><p>One thing is certain: AI wrote 80% of code for early adopters in late 2025. Even if your percentage is much lower, it&#8217;s likely higher than a year ago. This places disproportionate emphasis on the human&#8217;s role: owning outcomes, maintaining quality bars, ensuring tests actually validate behavior.</p><p><strong>The danger isn&#8217;t that the agent fails. I think it&#8217;s that it succeeds so confidently in the wrong direction that you stop checking the compass.</strong></p><p>DORA&#8217;s 2025 report crystallized the reality: AI is an amplifier of your development practices. Good processes get better (high-performing teams saw 55-70% faster delivery). Bad processes get worse (accumulating debt at unprecedented speed). There is no silver bullet.</p><p>Karpathy&#8217;s final observation resonates most: </p><blockquote><p><strong>&#8220;I didn&#8217;t anticipate that with agents programming feels </strong><em><strong>more</strong></em><strong> fun because a lot of the fill in the blanks drudgery is removed and what remains is the creative part. I also feel less blocked/stuck and I experience a lot more courage because there&#8217;s almost always a way to work hand in hand with it to make some positive progress.&#8221;</strong></p></blockquote><p>He also notes: &#8220;LLM coding will split up engineers based on those who primarily liked coding and those who primarily liked building.&#8221;</p><p><strong>That&#8217;s probably the most insightful prediction about where this is headed.</strong></p><p>If you liked the act of writing code itself - the craft of it, the meditation of it - this transition might feel like loss. If you liked building things and code was the necessary means, this feels like liberation.</p><p>Neither response is wrong. But the tooling is optimizing for the latter.</p><h2>For the skeptics (you&#8217;re right to be skeptical)</h2><p>The productivity claims are often overhyped. AI still makes mistakes a competent junior wouldn&#8217;t. Comprehension debt is real and poorly understood. The slopacolypse risk is genuine.</p><p>But the shift is real. When Karpathy admits he barely writes code directly anymore, when the Claude Code team ships 20+ PRs daily with 100% AI-written code, we&#8217;re past the point of dismissing this as hype.</p><p><strong>As software engineers, our identity was never &#8220;the person who can write code&#8221; - it was &#8220;the person who can solve problems with software.&#8221;</strong></p><p>AI isn&#8217;t replacing engineers. It&#8217;s amplifying them - for better and for worse.</p><p>My advice: embrace the tools, but own the outcome. Use AI to accelerate learning, not skip it. Focus on fundamentals that matter more than ever: robust architecture, clean code, thorough tests, thoughtful UX. These remain as important as ever - maybe more so, since implementation is no longer the bottleneck.</p><p>I don&#8217;t know where this goes. Karpathy&#8217;s probably right that it&#8217;ll split people between those who liked coding and those who liked building. </p><p>We&#8217;re all figuring this out in public, one PR at a time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lmAD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lmAD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lmAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9189021-cd66-44d9-8683-520663047835_2400x1350.png&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;:2876019,&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://addyo.substack.com/i/185933546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.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_!lmAD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!lmAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9189021-cd66-44d9-8683-520663047835_2400x1350.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[How to write a good spec for AI agents]]></title><description><![CDATA[How to structure, plan, and iterate for high-performance coding agents]]></description><link>https://addyo.substack.com/p/how-to-write-a-good-spec-for-ai-agents</link><guid isPermaLink="false">https://addyo.substack.com/p/how-to-write-a-good-spec-for-ai-agents</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Mon, 19 Jan 2026 15:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qALe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR: Aim for a clear spec covering just enough nuance (this may include structure, style, testing, boundaries) to guide the AI without overwhelming it. Break large tasks into smaller ones vs. keeping everything in one large prompt. Plan first in read-only mode, then execute and iterate continuously.</strong></p><blockquote><p><em>&#8220;I&#8217;ve heard a lot about writing good specs for AI agents, but haven&#8217;t found a solid framework yet. I could write a spec that rivals an RFC, but at some point the context is too large and the model breaks down.&#8221;</em></p></blockquote><p>Many developers share this frustration. Simply throwing a massive spec at an AI agent doesn&#8217;t work - context window limits and the model&#8217;s &#8220;attention budget&#8221; get in the way. The key is to write smart specs: documents that guide the agent clearly, stay within practical context sizes, and evolve with the project. This guide distills best practices from my use of coding agents including Claude Code and Gemini CLI into a framework for spec-writing that keeps your AI agents focused and productive.</p><p>We&#8217;ll cover five principles for great AI agent specs, each starting with a bolded takeaway.</p><h2><strong>1. Start with a high-level vision and let the AI draft the details</strong></h2><p><strong>Kick off your project with a concise high-level spec, then have the AI expand it into a detailed plan.</strong></p><p>Instead of over-engineering upfront, begin with a clear goal statement and a few core requirements. Treat this as a &#8220;product brief&#8221; and let the agent generate a more elaborate spec from it. This leverages the AI&#8217;s strength in elaboration while you maintain control of the direction. This works well unless you already feel you have very specific technical requirements that must be met from the start.</p><p><strong>Why this works:</strong> LLM-based agents excel at fleshing out details when given a solid high-level directive, but they need a clear mission to avoid drifting off course. By providing a short outline or objective description and asking the AI to produce a full specification (e.g. a spec.md), you create a persistent reference for the agent. Planning in advance matters even more with an agent - you can iterate on the plan first, then hand it off to the agent to write the code. The spec becomes the first artifact you and the AI build together.</p><p><strong>Practical approach:</strong> Start a new coding session by prompting:</p><blockquote><p>&#8220;You are an AI software engineer. Draft a detailed specification for [project X] covering objectives, features, constraints, and a step-by-step plan.&#8221; </p><p>Keep your initial prompt high-level - e.g. &#8220;Build a web app where users can track tasks (to-do list), with user accounts, a database, and a simple UI&#8221;. </p></blockquote><p>The agent might respond with a structured draft spec: an overview, feature list, tech stack suggestions, data model, and so on. This spec then becomes the &#8220;source of truth&#8221; that both you and the agent can refer back to. GitHub&#8217;s AI team promotes <a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/">spec-driven development</a> where &#8220;specs become the shared source of truth&#8230; living, executable artifacts that evolve with the project&#8221;. Before writing any code, review and refine the AI&#8217;s spec. Make sure it aligns with your vision and correct any hallucinations or off-target details.</p><p><strong>Use Plan Mode to enforce planning-first:</strong> Tools like Claude Code offer a <a href="https://code.claude.com/docs/en/common-workflows">Plan Mode</a> that restricts the agent to read-only operations - it can analyze your codebase and create detailed plans but won&#8217;t write any code until you&#8217;re ready. This is ideal for the planning phase: start in Plan Mode (Shift+Tab in Claude Code), describe what you want to build, and let the agent draft a spec while exploring your existing code. Ask it to clarify ambiguities by questioning you about the plan. Have it review the plan for architecture, best practices, security risks, and testing strategy. The goal is to refine the plan until there&#8217;s no room for misinterpretation. Only then do you exit Plan Mode and let the agent execute. This workflow prevents the common trap of jumping straight into code generation before the spec is solid.</p><p><strong>Use the spec as context:</strong> Once approved, save this spec (e.g. as SPEC.md) and feed relevant sections into the agent as needed. Many developers using a strong model do exactly this - the spec file persists between sessions, anchoring the AI whenever work resumes on the project. This mitigates the forgetfulness that can happen when the conversation history gets too long or when you have to restart an agent. It&#8217;s akin to how one would use a Product Requirements Document (PRD) in a team: a reference that everyone (human or AI) can consult to stay on track. Experienced folks often &#8220;<a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">write good documentation first</a> and the model may be able to build the matching implementation from that input alone&#8221; as one engineer observed. The spec is that documentation.</p><p><strong>Keep it goal-oriented:</strong> A high-level spec for an AI agent should focus on what and why, more than the nitty-gritty how (at least initially). Think of it like the user story and acceptance criteria: Who is the user? What do they need? What does success look like? (e.g. &#8220;User can add, edit, complete tasks; data is saved persistently; the app is responsive and secure&#8221;). This keeps the AI&#8217;s detailed spec grounded in user needs and outcome, not just technical to-dos. As the <a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/">GitHub Spec Kit docs</a> put it, provide a high-level description of what you&#8217;re building and why, and let the coding agent generate a detailed specification focusing on user experience and success criteria. Starting with this big-picture vision prevents the agent from losing sight of the forest for the trees when it later gets into coding.</p><h2><strong>2. Structure the spec like a professional PRD (or SRS)</strong></h2><p><strong>Treat your AI spec as a structured document (PRD) with clear sections, not a loose pile of notes.</strong></p><p>Many developers treat specs for agents much like traditional Product Requirement Documents (PRDs) or System Design docs - comprehensive, well-organized, and easy for a &#8220;literal-minded&#8221; AI to parse. This formal approach gives the agent a blueprint to follow and reduces ambiguity.</p><p><strong>The six core areas:</strong> GitHub&#8217;s analysis of <a href="https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/">over 2,500 agent configuration files</a> revealed a clear pattern: the most effective specs cover six areas. Use this as a checklist for completeness:</p><p><strong>1. Commands:</strong> Put executable commands early - not just tool names, but full commands with flags: <code>npm test</code>, <code>pytest -v</code>, <code>npm run build</code>. The agent will reference these constantly.</p><p><strong>2. Testing:</strong> How to run tests, what framework you use, where test files live, and what coverage expectations exist.</p><p><strong>3. Project structure:</strong> Where source code lives, where tests go, where docs belong. Be explicit: &#8220;<code>src/</code> for application code, <code>tests/</code> for unit tests, <code>docs/</code> for documentation.&#8221;</p><p><strong>4. Code style:</strong> One real code snippet showing your style beats three paragraphs describing it. Include naming conventions, formatting rules, and examples of good output.</p><p><strong>5. Git workflow:</strong> Branch naming, commit message format, PR requirements. The agent can follow these if you spell them out.</p><p><strong>6. Boundaries:</strong> What the agent should never touch - secrets, vendor directories, production configs, specific folders. &#8220;Never commit secrets&#8221; was the single most common helpful constraint in the GitHub study.</p><p><strong>Be specific about your stack:</strong> Say &#8220;React 18 with TypeScript, Vite, and Tailwind CSS&#8221; not &#8220;React project.&#8221; Include versions and key dependencies. Vague specs produce vague code.</p><p><strong>Use a consistent format:</strong> Clarity is king. Many devs use Markdown headings or even XML-like tags in the spec to delineate sections, because AI models handle well-structured text better than free-form prose. For example, you might structure the spec as:</p><pre><code><code># Project Spec: My team's tasks app

## Objective
- Build a web app for small teams to manage tasks...

## Tech Stack
- React 18+, TypeScript, Vite, Tailwind CSS
- Node.js/Express backend, PostgreSQL, Prisma ORM

## Commands
- Build: `npm run build` (compiles TypeScript, outputs to dist/)
- Test: `npm test` (runs Jest, must pass before commits)
- Lint: `npm run lint --fix` (auto-fixes ESLint errors)

## Project Structure
- `src/` &#8211; Application source code
- `tests/` &#8211; Unit and integration tests
- `docs/` &#8211; Documentation

## Boundaries
- &#9989; Always: Run tests before commits, follow naming conventions
- &#9888;&#65039; Ask first: Database schema changes, adding dependencies
- &#128683; Never: Commit secrets, edit node_modules/, modify CI config
</code></code></pre><p>This level of organization not only helps you think clearly, it helps the AI find information. Anthropic engineers recommend <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">organizing prompts into distinct sections</a> (like &lt;background&gt;, &lt;instructions&gt;, &lt;tools&gt;, &lt;output_format&gt; etc.) for exactly this reason - it gives the model strong cues about which info is which. And remember, &#8220;minimal does not necessarily mean short&#8221; - don&#8217;t shy away from detail in the spec if it matters, but keep it focused.</p><p><strong>Integrate specs into your toolchain:</strong> Treat specs as &#8220;executable artifacts&#8221; tied to version control and CI/CD. The <a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/">GitHub Spec Kit</a> uses a four-phase, gated workflow that makes your specification the center of your engineering process. Instead of writing a spec and setting it aside, the spec drives the implementation, checklists, and task breakdowns. Your primary role is to steer; the coding agent does the bulk of the writing. Each phase has a specific job, and you don&#8217;t move to the next one until the current task is fully validated:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z2M7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z2M7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z2M7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Spec Driven Development Workflow&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Spec Driven Development Workflow" title="Spec Driven Development Workflow" srcset="https://substackcdn.com/image/fetch/$s_!Z2M7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z2M7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49888e6f-2aaf-4689-aeab-22957a766bf9_2784x1536.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>1. Specify:</strong> You provide a high-level description of what you&#8217;re building and why, and the coding agent generates a detailed specification. This isn&#8217;t about technical stacks or app design - it&#8217;s about user journeys, experiences, and what success looks like. Who will use this? What problem does it solve? How will they interact with it? Think of it as mapping the user experience you want to create, and letting the coding agent flesh out the details. This becomes a living artifact that evolves as you learn more.</p><p><strong>2. Plan:</strong> Now you get technical. You provide your desired stack, architecture, and constraints, and the coding agent generates a comprehensive technical plan. If your company standardizes on certain technologies, this is where you say so. If you&#8217;re integrating with legacy systems or have compliance requirements, all of that goes here. You can ask for multiple plan variations to compare approaches. If you make internal docs available, the agent can integrate your architectural patterns directly into the plan.</p><p><strong>3. Tasks:</strong> The coding agent takes the spec and plan and breaks them into actual work - small, reviewable chunks that each solve a specific piece of the puzzle. Each task should be something you can implement and test in isolation, almost like test-driven development for your AI agent. Instead of &#8220;build authentication,&#8221; you get concrete tasks like &#8220;create a user registration endpoint that validates email format.&#8221;</p><p><strong>4. Implement:</strong> Your coding agent tackles tasks one by one (or in parallel). Instead of reviewing thousand-line code dumps, you review focused changes that solve specific problems. The agent knows what to build (specification), how to build it (plan), and what to work on (task). Crucially, your role is to verify at each phase: Does the spec capture what you want? Does the plan account for constraints? Are there edge cases the AI missed? The process builds in checkpoints for you to critique, spot gaps, and course-correct before moving forward.</p><p>This gated workflow prevents what Willison calls &#8220;house of cards code&#8221; - fragile AI outputs that collapse under scrutiny. Anthropic&#8217;s Skills system offers a similar pattern, letting you define reusable Markdown-based behaviors that agents invoke. By embedding your spec in these workflows, you ensure the agent can&#8217;t proceed until the spec is validated, and changes propagate automatically to task breakdowns and tests.</p><p><strong>Consider agents.md for specialized personas:</strong> For tools like GitHub Copilot, you can create <a href="https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/">agents.md files</a> that define specialized agent personas - a @docs-agent for technical writing, a @test-agent for QA, a @security-agent for code review. Each file acts as a focused spec for that persona&#8217;s behavior, commands, and boundaries. This is particularly useful when you want different agents for different tasks rather than one general-purpose assistant.</p><p><strong>Design for Agent Experience (AX):</strong> Just as we design APIs for developer experience (DX), consider designing specs for &#8220;Agent Experience.&#8221; This means clean, parseable formats: OpenAPI schemas for any APIs the agent will consume, llms.txt files that summarize documentation for LLM consumption, and explicit type definitions. The Agentic AI Foundation (AAIF) is standardizing protocols like MCP (Model Context Protocol) for tool integration - specs that follow these patterns are easier for agents to consume and act on reliably.</p><p><strong>PRD vs SRS mindset:</strong> It helps to borrow from established documentation practices. For AI agent specs, you&#8217;ll often blend these into one document (as illustrated above), but covering both angles serves you well. Writing it like a PRD ensures you include user-centric context (&#8220;the why behind each feature&#8221;) so the AI doesn&#8217;t optimize for the wrong thing. Expanding it like an SRS ensures you nail down the specifics the AI will need to actually generate correct code (like what database or API to use). Developers have found that this extra upfront effort pays off by drastically reducing miscommunications with the agent later.</p><p><strong>Make the spec a &#8220;living document&#8221;:</strong> Don&#8217;t write it and forget it. Update the spec as you and the agent make decisions or discover new info. If the AI had to change the data model or you decided to cut a feature, reflect that in the spec so it remains the ground truth. Think of it as version-controlled documentation. In <a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/">spec-driven workflows</a>, the spec drives implementation, tests, and task breakdowns, and you don&#8217;t move to coding until the spec is validated. This habit keeps the project coherent, especially if you or the agent step away and come back later. Remember, the spec isn&#8217;t just for the AI - it helps you as the developer maintain oversight and ensure the AI&#8217;s work meets the real requirements.</p><h2><strong>3. Break tasks into modular prompts and context, not one big prompt</strong></h2><p><strong>Divide and conquer: give the AI one focused task at a time rather than a monolithic prompt with everything at once.</strong></p><p>Experienced AI engineers have learned that trying to stuff the entire project (all requirements, all code, all instructions) into a single prompt or agent message is a recipe for confusion. Not only do you risk hitting token limits, you also risk the model losing focus due to the &#8220;<a href="https://maxpool.dev/research-papers/curse_of_instructions_report.html">curse of instructions</a>&#8221; - too many directives causing it to follow none of them well. The solution is to design your spec and workflow in a modular way, tackling one piece at a time and pulling in only the context needed for that piece.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BNjq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BNjq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BNjq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Modular AI Specs&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Modular AI Specs" title="Modular AI Specs" srcset="https://substackcdn.com/image/fetch/$s_!BNjq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BNjq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f49a9b2-c2fd-4e49-9452-73c9d3f88901_2784x1536.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>The curse of too much context/instructions:</strong> Research has confirmed what many devs anecdotally saw: as you pile on more instructions or data into the prompt, the model&#8217;s performance in adhering to each one <a href="https://openreview.net/pdf/848f1332e941771aa491f036f6350af2effe0513.pdf">drops significantly</a>. One study dubbed this the &#8220;curse of instructions&#8221;, showing that even GPT-4 and Claude struggle when asked to satisfy many requirements simultaneously. In practical terms, if you present 10 bullet points of detailed rules, the AI might obey the first few and start overlooking others. The better strategy is iterative focus. <a href="https://maxpool.dev/research-papers/curse_of_instructions_report.html">Guidelines from industry</a> suggest decomposing complex requirements into sequential, simple instructions as a best practice. Focus the AI on one sub-problem at a time, get that done, then move on. This keeps the quality high and errors manageable.</p><p><strong>Divide the spec into phases or components:</strong> If your spec document is very long or covers a lot of ground, consider splitting it into parts (either physically separate files or clearly separate sections). For example, you might have a section for &#8220;Backend API Spec&#8221; and another for &#8220;Frontend UI Spec.&#8221; You don&#8217;t need to always feed the frontend spec to the AI when it&#8217;s working on the backend, and vice versa. Many devs using multi-agent setups even create separate agents or sub-processes for each part - e.g. one agent works on database/schema, another on API logic, another on frontend - each with the relevant slice of the spec. Even if you use a single agent, you can emulate this by copying only the relevant spec section into the prompt for that task. Avoid context overload: Don&#8217;t mix authentication tasks with database schema changes in one go, as the <a href="https://docs.digitalocean.com/products/gradient-ai-platform/concepts/context-management/">DigitalOcean AI guide</a> warns. Keep each prompt tightly scoped to the current goal.</p><p><strong>Extended TOC / Summaries for large specs:</strong> One clever technique is to have the agent build an extended Table of Contents with summaries for the spec. This is essentially a &#8220;spec summary&#8221; that condenses each section into a few key points or keywords, and references where details can be found. For example, if your full spec has a section on &#8220;Security Requirements&#8221; spanning 500 words, you might have the agent summarize it to: &#8220;Security: use HTTPS, protect API keys, implement input validation (see full spec &#167;4.2)&#8221;. By creating a hierarchical summary in the planning phase, you get a bird&#8217;s-eye view that can stay in the prompt, while the fine details remain offloaded unless needed. This extended TOC acts as an index: the agent can consult it and say &#8220;aha, there&#8217;s a security section I should look at&#8221;, and you can then provide that section on demand. It&#8217;s similar to how a human developer skims an outline and then flips to the relevant page of a spec document when working on a specific part.</p><p>To implement this, you can prompt the agent after writing the spec: &#8220;Summarize the spec above into a very concise outline with each section&#8217;s key points and a reference tag.&#8221; The result might be a list of sections with one or two sentence summaries. That summary can be kept in the system or assistant message to guide the agent&#8217;s focus without eating up too many tokens. This <a href="https://addyo.substack.com/p/context-engineering-bringing-engineering">hierarchical summarization approach</a> is known to help LLMs maintain long-term context by focusing on the high-level structure. The agent carries a &#8220;mental map&#8221; of the spec.</p><p><strong>Utilize sub-agents or &#8220;skills&#8221; for different spec parts:</strong> Another advanced approach is using multiple specialized agents (what Anthropic calls subagents or what you might call &#8220;skills&#8221;). Each subagent is configured for a specific area of expertise and given the portion of the spec relevant to that area. For instance, you might have a Database Designer subagent that only knows about the data model section of the spec, and an API Coder subagent that knows the API endpoints spec. The main agent (or an orchestrator) can route tasks to the appropriate subagent automatically. The benefit is each agent has a smaller context window to deal with and a more focused role, which can <a href="https://10xdevelopers.dev/structured/claude-code-with-subagents/">boost accuracy and allow parallel work</a> on independent tasks. Anthropic&#8217;s Claude Code supports this by letting you define subagents with their own system prompts and tools. &#8220;Each subagent has a specific purpose and expertise area, uses its own context window separate from the main conversation, and has a custom system prompt guiding its behavior,&#8221; as their docs describe. When a task comes up that matches a subagent&#8217;s domain, Claude can delegate that task to it, with the subagent returning results independently.</p><p><strong>Parallel agents for throughput:</strong> Running multiple agents simultaneously is emerging as &#8220;the next big thing&#8221; for developer productivity. Rather than waiting for one agent to finish before starting another task, you can spin up parallel agents for non-overlapping work. Willison describes this as &#8220;<a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">embracing parallel coding agents</a>&#8221; and notes it&#8217;s &#8220;surprisingly effective, if mentally exhausting&#8221;. The key is scoping tasks so agents don&#8217;t step on each other - one agent codes a feature while another writes tests, or separate components get built concurrently. Orchestration frameworks like LangGraph or OpenAI Swarm can help coordinate these agents, and shared memory via vector databases (like Chroma) lets them access common context without redundant prompting.</p><p><strong>Single vs. multi-agent: when to use each</strong></p><p><strong>AspectSingle AgentParallel/Multi-AgentStrengths</strong>Simpler setup; lower overhead; easier to debug and followHigher throughput; handles complex interdependencies; specialists per domain<strong>Challenges</strong>Context overload on big projects; slower iteration; single point of failureCoordination overhead; potential conflicts; needs shared memory (e.g., vector DBs)<strong>Best For</strong>Isolated modules; small-to-medium projects; early prototypingLarge codebases; one codes + one tests + one reviews; independent features<strong>Tips</strong>Use spec summaries; refresh context per task; start fresh sessions oftenLimit to 2-3 agents initially; use MCP for tool sharing; define clear boundaries</p><p>In practice, using subagents or skill-specific prompts might look like: you maintain multiple spec files (or prompt templates) - e.g. SPEC_backend.md, SPEC_frontend.md - and you tell the AI, &#8220;For backend tasks, refer to SPEC_backend; for frontend tasks refer to SPEC_frontend.&#8221; Or in a tool like Cursor/Claude, you actually spin up a subagent for each. This is certainly more complex to set up than a single-agent loop, but it mimics what human developers do - we mentally compartmentalize a large spec into relevant chunks (you don&#8217;t keep the whole 50-page spec in your head at once; you recall the part you need for the task at hand, and have a general sense of the overall architecture). The challenge, as noted, is managing interdependencies: the subagents must still coordinate (the frontend needs to know the API contract from the backend spec, etc.). A central overview (or an &#8220;architect&#8221; agent) can help by referencing the sub-specs and ensuring consistency.</p><p><strong>Focus each prompt on one task/section:</strong> Even without fancy multi-agent setups, you can manually enforce modularity. For example, after the spec is written, your next move might be: &#8220;Step 1: Implement the database schema.&#8221; You feed the agent the Database section of the spec only, plus any global constraints from the spec (like tech stack). The agent works on that. Then for Step 2, &#8220;Now implement the authentication feature&#8221;, you provide the Auth section of the spec and maybe the relevant parts of the schema if needed. By refreshing the context for each major task, you ensure the model isn&#8217;t carrying a lot of stale or irrelevant information that could distract it. As one guide suggests: &#8220;<a href="https://docs.digitalocean.com/products/gradient-ai-platform/concepts/context-management/">Start fresh: begin new sessions</a> to clear context when switching between major features&#8221;. You can always remind the agent of critical global rules (from the spec&#8217;s Constraints section) each time, but don&#8217;t shove the entire spec in if it&#8217;s not all needed.</p><p><strong>Use in-line directives and code TODOs:</strong> Another modularity trick is to use your code or spec as an active part of the conversation. For instance, scaffold your code with // TODO comments that describe what needs to be done, and have the agent fill them one by one. Each TODO essentially acts as a mini-spec for a small task. This keeps the AI laser-focused (&#8220;implement this specific function according to this spec snippet&#8221;) and you can iterate in a tight loop. It&#8217;s similar to giving the AI a checklist item to complete rather than the whole checklist at once.</p><p>The bottom line: small, focused context beats one giant prompt. This improves quality and keeps the AI from getting &#8220;overwhelmed&#8221; by too much at once. As one set of best practices sums up, provide &#8220;One Task Focus&#8221; and &#8220;Relevant info only&#8221; to the model, and avoid dumping everything everywhere. By structuring the work into modules - and using strategies like spec summaries or sub-spec agents - you&#8217;ll navigate around context size limits and the AI&#8217;s short-term memory cap. Remember, a well-fed AI is like a well-fed function: give it only the <a href="https://addyo.substack.com/p/context-engineering-bringing-engineering">inputs it needs for the job at hand</a>.</p><h2><strong>4. Build in self-checks, constraints, and human expertise</strong></h2><p><strong>Make your spec not just a to-do list for the agent, but also a guide for quality control - and don&#8217;t be afraid to inject your own expertise.</strong></p><p>A good spec for an AI agent anticipates where the AI might go wrong and sets up guardrails. It also takes advantage of what you know (domain knowledge, edge cases, &#8220;gotchas&#8221;) so the AI doesn&#8217;t operate in a vacuum. Think of the spec as both coach and referee for the AI: it should encourage the right approach and call out fouls.</p><p><strong>Use three-tier boundaries:</strong> The <a href="https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/">GitHub analysis of 2,500+ agent files</a> found that the most effective specs use a three-tier boundary system rather than a simple list of don&#8217;ts. This gives the agent clearer guidance on when to proceed, when to pause, and when to stop:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7iHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7iHk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7iHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Three tier boundaries for AI agent specs&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Three tier boundaries for AI agent specs" title="Three tier boundaries for AI agent specs" srcset="https://substackcdn.com/image/fetch/$s_!7iHk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7iHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789bc70-7a7d-498b-b2c8-8e003e43682a_2784x1536.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>&#9989; Always do:</strong> Actions the agent should take without asking. &#8220;Always run tests before commits.&#8221; &#8220;Always follow the naming conventions in the style guide.&#8221; &#8220;Always log errors to the monitoring service.&#8221;</p><p><strong>&#9888;&#65039; Ask first:</strong> Actions that require human approval. &#8220;Ask before modifying database schemas.&#8221; &#8220;Ask before adding new dependencies.&#8221; &#8220;Ask before changing CI/CD configuration.&#8221; This tier catches high-impact changes that might be fine but warrant a human check.</p><p><strong>&#128683; Never do:</strong> Hard stops. &#8220;Never commit secrets or API keys.&#8221; &#8220;Never edit node_modules/ or vendor/.&#8221; &#8220;Never remove a failing test without explicit approval.&#8221; &#8220;Never commit secrets&#8221; was the single most common helpful constraint in the study.</p><p>This three-tier approach is more nuanced than a flat list of rules. It acknowledges that some actions are always safe, some need oversight, and some are categorically off-limits. The agent can proceed confidently on &#8220;Always&#8221; items, flag &#8220;Ask first&#8221; items for review, and hard-stop on &#8220;Never&#8221; items.</p><p><strong>Encourage self-verification:</strong> One powerful pattern is to have the agent verify its work against the spec automatically. If your tooling allows, you can integrate checks like unit tests or linting that the AI can run after generating code. But even at the spec/prompt level, you can instruct the AI to double-check: e.g. &#8220;After implementing, compare the result with the spec and confirm all requirements are met. List any spec items that are not addressed.&#8221; This pushes the LLM to reflect on its output relative to the spec, catching omissions. It&#8217;s a form of self-audit built into the process.</p><p>For instance, you might append to a prompt: &#8220;(After writing the function, review the above requirements list and ensure each is satisfied, marking any missing ones).&#8221; The model will then (ideally) output the code followed by a short checklist indicating if it met each requirement. This reduces the chance it forgets something before you even run tests. It&#8217;s not foolproof, but it helps.</p><p><strong>LLM-as-a-Judge for subjective checks:</strong> For criteria that are hard to test automatically - code style, readability, adherence to architectural patterns - consider using &#8220;LLM-as-a-Judge.&#8221; This means having a second agent (or a separate prompt) review the first agent&#8217;s output against your spec&#8217;s quality guidelines. Anthropic and others have found this effective for subjective evaluation. You might prompt: &#8220;Review this code for adherence to our style guide. Flag any violations.&#8221; The judge agent returns feedback that either gets incorporated or triggers a revision. This adds a layer of semantic evaluation beyond syntax checks.</p><p><strong>Conformance testing:</strong> Willison advocates building conformance suites - language-independent tests (often YAML-based) that any implementation must pass. These act as a contract: if you&#8217;re building an API, the conformance suite specifies expected inputs/outputs, and the agent&#8217;s code must satisfy all cases. This is more rigorous than ad-hoc unit tests because it&#8217;s derived directly from the spec and can be reused across implementations. Include conformance criteria in your spec&#8217;s Success section (e.g., &#8220;Must pass all cases in conformance/api-tests.yaml&#8221;).</p><p><strong>Leverage testing in the spec:</strong> If possible, incorporate a test plan or even actual tests in your spec and prompt flow. In traditional development, we use TDD or write test cases to clarify requirements - you can do the same with AI. For example, in the spec&#8217;s Success Criteria, you might say &#8220;These sample inputs should produce these outputs&#8230;&#8221; or &#8220;the following unit tests should pass.&#8221; The agent can be prompted to run through those cases in its head or actually execute them if it has that capability. Simon Willison noted that having a <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">robust test suite</a> is like giving the agents superpowers - they can validate and iterate quickly when tests fail. In an AI coding context, writing a bit of pseudocode for tests or expected outcomes in the spec can guide the agent&#8217;s implementation. Additionally, you can use a dedicated &#8220;<a href="https://10xdevelopers.dev/structured/claude-code-with-subagents/">test agent</a>&#8221; in a subagent setup that takes the spec&#8217;s criteria and continuously verifies the &#8220;code agent&#8217;s&#8221; output.</p><p><strong>Bring your domain knowledge:</strong> Your spec should reflect insights that only an experienced developer or someone with context would know. For example, if you&#8217;re building an e-commerce agent and you know that &#8220;products&#8221; and &#8220;categories&#8221; have a many-to-many relationship, state that clearly (don&#8217;t assume the AI will infer it - it might not). If a certain library is notoriously tricky, mention pitfalls to avoid. Essentially, pour your mentorship into the spec. The spec can contain advice like &#8220;If using library X, watch out for memory leak issue in version Y (apply workaround Z).&#8221; This level of detail is what turns an average AI output into a truly robust solution, because you&#8217;ve steered the AI away from common traps.</p><p>Also, if you have preferences or style guidelines (say, &#8220;use functional components over class components in React&#8221;), encode that in the spec. The AI will then emulate your style. Many engineers even include small examples in the spec, e.g., &#8220;All API responses should be JSON. E.g. {&#8220;error&#8221;: &#8220;message&#8221;} for errors.&#8221; By giving a quick example, you anchor the AI to the exact format you want.</p><p><strong>Minimalism for simple tasks:</strong> While we advocate thorough specs, part of expertise is knowing when to keep it simple. For relatively simple, isolated tasks, an overbearing spec can actually confuse more than help. If you&#8217;re asking the agent to do something straightforward (like &#8220;center a div on the page&#8221;), you might just say, &#8220;Make sure to keep the solution concise and do not add extraneous markup or styles.&#8221; No need for a full PRD there. Conversely, for complex tasks (like &#8220;implement an OAuth flow with token refresh and error handling&#8221;), that&#8217;s when you break out the detailed spec. A good rule of thumb: adjust spec detail to task complexity. Don&#8217;t under-spec a hard problem (the agent will flail or go off-track), but don&#8217;t over-spec a trivial one (the agent might get tangled or use up context on unnecessary instructions).</p><p><strong>Maintain the AI&#8217;s &#8220;persona&#8221; if needed:</strong> Sometimes, part of your spec is defining how the agent should behave or respond, especially if the agent interacts with users. For example, if building a customer support agent, your spec might include guidelines like &#8220;Use a friendly and professional tone,&#8221; &#8220;If you don&#8217;t know the answer, ask for clarification or offer to follow up, rather than guessing.&#8221; These kind of rules (often included in system prompts) help keep the AI&#8217;s outputs aligned with expectations. They are essentially spec items for AI behavior. Keep them consistent and remind the model of them if needed in long sessions (LLMs can &#8220;drift&#8221; in style over time if not kept on a leash).</p><p><strong>You remain the exec in the loop:</strong> The spec empowers the agent, but you remain the ultimate quality filter. If the agent produces something that technically meets the spec but doesn&#8217;t feel right, trust your judgement. Either refine the spec or directly adjust the output. The great thing about AI agents is they don&#8217;t get offended - if they deliver a design that&#8217;s off, you can say, &#8220;Actually, that&#8217;s not what I intended, let&#8217;s clarify the spec and redo it.&#8221; The spec is a living artifact in collaboration with the AI, not a one-time contract you can&#8217;t change.</p><p>Simon Willison humorously likened working with AI agents to &#8220;a very weird form of management&#8221; and even &#8220;getting good results out of a coding agent feels <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">uncomfortably close to managing a human intern</a>&#8221;. You need to provide clear instructions (the spec), ensure they have the necessary context (the spec and relevant data), and give actionable feedback. The spec sets the stage, but monitoring and feedback during execution are key. If an AI was a &#8220;weird digital intern who will absolutely cheat if you give them a chance&#8221;, the spec and constraints you write are how you prevent that cheating and keep them on task.</p><p>Here&#8217;s the payoff: a good spec doesn&#8217;t just tell the AI what to build, it also helps it self-correct and stay within safe boundaries. By baking in verification steps, constraints, and your hard-earned knowledge, you drastically increase the odds that the agent&#8217;s output is correct on the first try (or at least much closer to correct). This reduces iterations and those &#8220;why on Earth did it do that?&#8221; moments.</p><h2><strong>5. Test, iterate, and evolve the spec (and use the right tools)</strong></h2><p><strong>Think of spec-writing and agent-building as an iterative loop: test early, gather feedback, refine the spec, and leverage tools to automate checks.</strong></p><p>The initial spec is not the end - it&#8217;s the beginning of a cycle. The best outcomes come when you continually verify the agent&#8217;s work against the spec and adjust accordingly. Also, modern AI devs use various tools to support this process (from CI pipelines to context management utilities).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nsmd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nsmd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nsmd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg" width="1024" height="459" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:459,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Spec iteration loop: Test, Feedback, Refine, Tools&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Spec iteration loop: Test, Feedback, Refine, Tools" title="Spec iteration loop: Test, Feedback, Refine, Tools" srcset="https://substackcdn.com/image/fetch/$s_!nsmd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nsmd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2a7534e-6004-4a41-b28e-c3e437c692af_1024x459.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Continuous testing:</strong> Don&#8217;t wait until the end to see if the agent met the spec. After each major milestone or even each function, run tests or at least do quick manual checks. If something fails, update the spec or prompt before proceeding. For example, if the spec said &#8220;passwords must be hashed with bcrypt&#8221; and you see the agent&#8217;s code storing plain text - stop and correct it (and remind the spec or prompt about the rule). Automated tests shine here: if you provided tests (or write them as you go), let the agent run them. In many coding agent setups, you can have an agent run npm test or similar after finishing a task. The results (failures) can then feed back into the next prompt, effectively telling the agent &#8220;your output didn&#8217;t meet spec on X, Y, Z - fix it.&#8221; This kind of agentic loop (code -&gt; test -&gt; fix -&gt; repeat) is extremely powerful and is how tools like Claude Code or Copilot Labs are evolving to handle larger tasks. Always define what &#8220;done&#8221; means (via tests or criteria) and check for it.</p><p><strong>Iterate on the spec itself:</strong> If you discover that the spec was incomplete or unclear (maybe the agent misunderstood something or you realized you missed a requirement), update the spec document. Then explicitly re-sync the agent with the new spec: &#8220;I have updated the spec as follows&#8230; Given the updated spec, adjust the plan or refactor the code accordingly.&#8221; This way the spec remains the single source of truth. It&#8217;s similar to how we handle changing requirements in normal dev - but in this case you&#8217;re also the product manager for your AI agent. Keep version history if possible (even just via commit messages or notes), so you know what changed and why.</p><p><strong>Utilize context-management and memory tools:</strong> There&#8217;s a growing ecosystem of tools to help manage AI agent context and knowledge. For instance, retrieval-augmented generation (RAG) is a pattern where the agent can pull in relevant chunks of data from a knowledge base (like a vector database) on the fly. If your spec is huge, you could embed sections of it and let the agent retrieve the most relevant parts when needed, instead of always providing the whole thing. There are also frameworks implementing the Model Context Protocol (MCP), which automates feeding the right context to the model based on the current task. One example is <a href="https://docs.digitalocean.com/products/gradient-ai-platform/concepts/context-management/">Context7</a> (context7.com), which can auto-fetch relevant context snippets from docs based on what you&#8217;re working on. In practice, this might mean the agent notices you&#8217;re working on &#8220;payment processing&#8221; and it pulls the &#8220;Payments&#8221; section of your spec or documentation into the prompt. Consider leveraging such tools or setting up a rudimentary version (even a simple search in your spec document).</p><p><strong>Parallelize carefully:</strong> Some developers run multiple agent instances in parallel on different tasks (as mentioned earlier with subagents). This can speed up development - e.g., one agent generates code while another simultaneously writes tests, or two features are built concurrently. If you go this route, ensure the tasks are truly independent or clearly separated to avoid conflicts (the spec should note any dependencies). For example, don&#8217;t have two agents writing to the same file at once. One workflow is to have an agent generate code and another review it in parallel, or to have separate components built that integrate later. This is advanced usage and can be mentally taxing to manage (as Willison admitted, running multiple agents is <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">surprisingly effective, if mentally exhausting</a>!). Start with at most 2-3 agents to keep things manageable.</p><p><strong>Version control and spec locks:</strong> Use Git or your version control of choice to track what the agent does. <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">Good version control habits</a> matter even more with AI assistance. Commit the spec file itself to the repo. This not only preserves history, but the agent can even use git diff or blame to understand changes (LLMs are quite capable of reading diffs). Some advanced agent setups let the agent query the VCS history to see when something was introduced - surprisingly, models can be &#8220;fiercely competent at Git&#8221;. By keeping your spec in the repo, you allow both you and the AI to track evolution. There are tools (like GitHub Spec Kit mentioned earlier) that integrate spec-driven development into the git workflow - for instance, gating merges on updated specs or generating checklists from spec items. While you don&#8217;t need those tools to succeed, the takeaway is to treat the spec like code - maintain it diligently.</p><p><strong>Cost and speed considerations:</strong> Working with large models and long contexts can be slow and expensive. A practical tip is to use model selection and batching smartly. Perhaps use a cheaper/faster model for initial drafts or repetitions, and reserve the most capable (and expensive) model for final outputs or complex reasoning. Some developers use GPT-4 or Claude for planning and critical steps, but offload simpler expansions or refactors to a local model or a smaller API model. If using multiple agents, maybe not all need to be top-tier; a test-running agent or a linter agent could be a smaller model. Also consider throttling context size: don&#8217;t feed 20k tokens if 5k will do. As we discussed, <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">more tokens can mean diminishing returns</a>.</p><p><strong>Monitor and log everything:</strong> In complex agent workflows, logging the agent&#8217;s actions and outputs is essential. Check the logs to see if the agent is deviating or encountering errors. Many frameworks provide trace logs or allow printing the agent&#8217;s chain-of-thought (especially if you prompt it to think step-by-step). Reviewing these logs can highlight where the spec or instructions might have been misinterpreted. It&#8217;s not unlike debugging a program - except the &#8220;program&#8221; is the conversation/prompt chain. If something weird happens, go back to the spec/instructions to see if there was ambiguity.</p><p><strong>Learn and improve:</strong> Finally, treat each project as a learning opportunity to refine your spec-writing skill. Maybe you&#8217;ll discover that a certain phrasing consistently confuses the AI, or that organizing spec sections in a certain way yields better adherence. Incorporate those lessons into the next spec. The field of AI agents is rapidly evolving, so new best practices (and tools) emerge constantly. Stay updated via blogs (like the ones by Simon Willison, Andrej Karpathy, etc.), and don&#8217;t hesitate to experiment.</p><p>A spec for an AI agent isn&#8217;t &#8220;write once, done.&#8221; It&#8217;s part of a continuous cycle of instructing, verifying, and refining. The payoff for this diligence is substantial: by catching issues early and keeping the agent aligned, you avoid costly rewrites or failures later. As one AI engineer quipped, using these practices can feel like having &#8220;an army of interns&#8221; working for you, but you have to manage them well. A good spec, continuously maintained, is your management tool.</p><h2><strong>Avoid common pitfalls</strong></h2><p>Before wrapping up, it&#8217;s worth calling out anti-patterns that can derail even well-intentioned spec-driven workflows. The <a href="https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/">GitHub study of 2,500+ agent files</a> revealed a stark divide: &#8220;Most agent files fail because they&#8217;re too vague.&#8221; Here are the mistakes to avoid:</p><p><strong>Vague prompts:</strong> &#8220;Build me something cool&#8221; or &#8220;Make it work better&#8221; gives the agent nothing to anchor on. As Baptiste Studer puts it: &#8220;Vague prompts mean wrong results.&#8221; Be specific about inputs, outputs, and constraints. &#8220;You are a helpful coding assistant&#8221; doesn&#8217;t work. &#8220;You are a test engineer who writes tests for React components, follows these examples, and never modifies source code&#8221; does.</p><p><strong>Overlong contexts without summarization:</strong> Dumping 50 pages of documentation into a prompt and hoping the model figures it out rarely works. Use hierarchical summaries (as discussed in Principle 3) or RAG to surface only what&#8217;s relevant. Context length is not a substitute for context quality.</p><p><strong>Skipping human review:</strong> Willison has a personal rule: &#8220;I won&#8217;t commit code I couldn&#8217;t explain to someone else.&#8221; Just because the agent produced something that passes tests doesn&#8217;t mean it&#8217;s correct, secure, or maintainable. Always review critical code paths. The &#8220;house of cards&#8221; metaphor applies: AI-generated code can look solid but collapse under edge cases you didn&#8217;t test.</p><p><strong>Conflating vibe coding with production engineering:</strong> Rapid prototyping with AI (&#8220;vibe coding&#8221;) is great for exploration and throwaway projects. But shipping that code to production without rigorous specs, tests, and review is asking for trouble. I distinguish &#8220;vibe coding&#8221; from &#8220;AI-assisted engineering&#8221; - the latter requires the discipline this guide describes. Know which mode you&#8217;re in.</p><p><strong>Ignoring the &#8220;lethal trifecta&#8221;:</strong> Willison warns of three properties that make AI agents dangerous: speed (they work faster than you can review), non-determinism (same input, different outputs), and cost (encouraging corner-cutting on verification). Your spec and review process must account for all three. Don&#8217;t let speed outpace your ability to verify.</p><p><strong>Missing the six core areas:</strong> If your spec doesn&#8217;t cover commands, testing, project structure, code style, git workflow, and boundaries, you&#8217;re likely missing something the agent needs. Use the six-area checklist from Section 2 as a sanity check before handing off to the agent.</p><h2><strong>Conclusion</strong></h2><p>Writing an effective spec for AI coding agents requires solid software engineering principles combined with adaptation to LLM quirks. Start with clarity of purpose and let the AI help expand the plan. Structure the spec like a serious design document - covering the six core areas and integrating it into your toolchain so it becomes an executable artifact, not just prose. Keep the agent&#8217;s focus tight by feeding it one piece of the puzzle at a time (and consider clever tactics like summary TOCs, subagents, or parallel orchestration to handle big specs). Anticipate pitfalls by including three-tier boundaries (Always/Ask first/Never), self-checks, and conformance tests - essentially, teach the AI how to not fail. And treat the whole process as iterative: use tests and feedback to refine both the spec and the code continuously.</p><p>Follow these guidelines and your AI agent will be far less likely to &#8220;break down&#8221; under large contexts or wander off into nonsense.</p><p>Happy spec-writing!</p><div><hr></div><p><em>I&#8217;m excited to share I&#8217;ve released a new <a href="https://beyond.addy.ie/">AI-assisted engineering book</a> with O&#8217;Reilly. There are a number of free tips on the book site in case interested.</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_!qALe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qALe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!qALe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!qALe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!qALe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qALe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png&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;:545033,&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://addyo.substack.com/i/184990361?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.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_!qALe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!qALe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!qALe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!qALe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f80e0c9-a1ae-468a-a20b-7bfdd64d1cab_2400x1350.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Code Review in the Age of AI]]></title><description><![CDATA[AI writes faster. Humans still have to prove it works.]]></description><link>https://addyo.substack.com/p/code-review-in-the-age-of-ai</link><guid isPermaLink="false">https://addyo.substack.com/p/code-review-in-the-age-of-ai</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Mon, 05 Jan 2026 15:30:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ggv3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>AI did not kill code review. It made the burden of proof explicit. Ship changes with evidence like manual verification and automated tests, then use review for risk, intent, and accountability. Solo developers lean on automation to keep up with AI speed, while teams use review to build shared context and ownership.</strong></p><p>If your pull request doesn&#8217;t contain evidence that it works, you&#8217;re not shipping faster - you&#8217;re just moving work downstream.</p><p>By early 2026,<a href="https://www.infoworld.com/article/4049949/senior-developers-let-ai-do-more-of-the-coding-survey.html"> over 30% of senior developers</a> report shipping mostly AI-generated code. The challenge? AI excels at drafting features but falters on logic, security, and edge cases - <a href="https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report">making errors 75% more common in logic alone</a>. This splits workflows: solos &#8220;vibe&#8221; at inference speed with test suites as backstops, while teams demand human eyes for context and compliance. Done right, both treat AI as an accelerator, but verification - who, what, and when - defines the difference.</p><p>As I&#8217;ve said before: if you haven&#8217;t seen the code do the right thing yourself, it doesn&#8217;t work. AI amplifies this rule, not excuses it.</p><h2><strong>How developers use AI for review</strong></h2><ul><li><p><strong>Ad-hoc LLM checks</strong>: Paste diffs into Claude, Gemini or GPT for quick bug/style scans before committing.</p></li><li><p><strong>IDE integrations</strong>: Tools like Cursor, Claude Code, or Gemini CLI for inline suggestions and refactors during coding.</p></li><li><p><strong>PR bots and scanners</strong>: GitHub Copilot or custom agents to flag issues in PRs; pair with static/dynamic analysis like Snyk for security.</p></li><li><p><strong>Automated testing loops</strong>: Use AI to generate and run tests, enforcing coverage &gt;70% as a gate.</p></li><li><p><strong>Multi-model reviews</strong>: Run code through different LLMs (e.g., Claude for generation, a security-focused model for audit) to catch biases.</p></li></ul><p>The workflow and mindset differ dramatically depending on whether you&#8217;re solo or working in a team where others maintain your code.</p><h2><strong>Solo vs. Team: A quick comparison</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NNHx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NNHx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 424w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 848w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 1272w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NNHx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png" width="1456" height="516" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247807,&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://addyo.substack.com/i/183169342?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.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_!NNHx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 424w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 848w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.png 1272w, https://substackcdn.com/image/fetch/$s_!NNHx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d29555-37cb-44ed-b012-3fb4d5d73fb6_2528x896.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Solo Devs: Shipping at &#8220;inference speed&#8221;</strong></h2><p><strong>Solo developers increasingly &#8220;trust the vibe&#8221; of AI-generated code - shipping features rapidly by reviewing only the key parts and relying on tests to catch issues.</strong></p><p>This workflow treats coding agents as powerful interns that can handle massive refactors largely on their own. As<a href="https://blog.kilo.ai/p/senior-engineers-use-ai-now"> Peter Steinberger admits</a>: <em>&#8220;I don&#8217;t read much code anymore. I watch the stream and sometimes look at key parts, but most code I don&#8217;t read.&#8221;</em> The bottleneck becomes<a href="https://steipete.me/posts/2025/shipping-at-inference-speed"> inference time</a> - waiting for the AI to generate output - not typing.</p><p><strong>There&#8217;s a catch: perceived speed gains vanish without strong testing practices.</strong> Build those first. If you skip review, you don&#8217;t eliminate work - you defer it. The developers who succeed with AI at high velocity aren&#8217;t the ones who blindly trust it; they&#8217;re the ones who&#8217;ve built verification systems that catch issues before they reach production.</p><p>That isn&#8217;t to say solos throw caution to the wind. The responsible ones employ <strong>extensive automated testing as a safety net</strong> - aiming for high coverage (often &gt;70%) and using AI to generate tests that catch bugs in real-time. Modern coding agents are surprisingly good at designing sophisticated end-to-end tests.</p><p><strong>For solos, the game-changer is language-independent, data-driven tests.</strong> If comprehensive, they let an agent build (or fix) implementations in any language, verifying as it goes. I start projects with a spec.md the AI drafts, approve it, then loop: write &#8594; test &#8594; fix.</p><p>Crucially, solo coders still do <strong>manual testing and critical reasoning</strong> on the final product. Run the application, click through the UI, use the feature yourself. When higher stakes are involved, read more code and add extra checks. And despite moving fast, fix ugly code when you see it rather than letting the mess accumulate.</p><p>Even in this bleeding-edge paradigm:<a href="https://simonwillison.net/2025/Dec/18/code-proven-to-work/"> </a><em><a href="https://simonwillison.net/2025/Dec/18/code-proven-to-work/">your job is to deliver code you have proven to work</a>.</em></p><h2><strong>Teams: AI shifts review bottlenecks</strong></h2><p><strong>In team settings, AI is a powerful assistant for code review, but </strong><em><strong>cannot replace</strong></em><strong> the human judgment needed for quality, security, and maintainability.</strong></p><p>When multiple engineers collaborate, the cost of mistakes and longevity of code are much higher concerns. Teams have started using AI-based review bots for an initial pass on PRs, but they still require a human to sign off. As<a href="https://devclass.com/2025/03/19/graphite-debuts-diamond-ai-code-reviewer-insists-ai-will-never-replace-human-code-review/"> Greg Foster of Graphite</a> puts it: <em>&#8220;I don&#8217;t ever see [AI agents] becoming a stand-in for an actual human engineer signing off on a pull request.&#8221;</em></p><p><strong>The biggest practical problem isn&#8217;t that AI reviewers miss style issues - it&#8217;s that AI increases volume and shifts the burden onto humans.</strong><a href="https://jellyfish.co/blog/ai-assisted-pull-requests-are-18-larger/"> PRs are getting larger</a> (~18% more additions as AI adoption increases),<a href="https://www.cortex.io/post/ai-is-making-engineering-faster-but-not-better-state-of-ai-benchmark-2026"> incidents per PR are up ~24%, and change failure rates up ~30%</a>. When output increases faster than verification capacity, review becomes the rate limiter. As Foster notes: <em>&#8220;If we&#8217;re shipping code that&#8217;s never actually read or understood by a fellow human, we&#8217;re running a huge risk.&#8221;</em></p><p>In teams, AI floods volume, so enforce incrementalism: break agent output into digestible commits. Human sign-off isn&#8217;t going away - it&#8217;s evolving to focus on what AI misses, like roadmap alignment and institutional context that AI can&#8217;t grasp.</p><h3><strong>Security: AI&#8217;s predictable weaknesses</strong></h3><p><strong>One area where human oversight is absolutely non-negotiable is security.</strong><a href="https://www.veracode.com/blog/ai-generated-code-security-risks/"> Approximately 45% of AI-generated code contains security flaws</a>.<a href="https://dl.acm.org/doi/10.1145/3716848"> Logic errors appear at 1.75&#215; the rate of human-written code, and XSS vulnerabilities occur at 2.74&#215; higher frequency</a>.</p><p>Beyond code issues,<a href="https://www.tomshardware.com/tech-industry/cyber-security/researchers-uncover-critical-ai-ide-flaws-exposing-developers-to-data-theft-and-rce"> agentic tooling and AI-integrated IDEs have created new attack paths</a> - prompt injection, data exfiltration, even RCE vulnerabilities. AI expands attack surfaces, so hybrid approaches win: AI flags, humans verify.</p><p><strong>Rule: If code touches auth, payments, secrets, or untrusted input, treat AI as a high-speed intern and require a human threat model review plus a security tool pass before merge.</strong></p><h3><strong>Review as knowledge transfer</strong></h3><p><strong>Code review is also how teams share system context. If AI writes the code and nobody can explain it, on-call becomes expensive.</strong></p><p>When a developer submits AI-generated code they don&#8217;t fully understand, they&#8217;re breaking the knowledge transfer mechanism that makes teams resilient. If the original author can&#8217;t explain why the code works, how will the on-call engineer debug it at 2 AM?</p><p><a href="https://devclass.com/2025/11/27/ocaml-maintainers-reject-massive-ai-generated-pull-request/">The OCaml maintainers&#8217; rejection of a 13,000-line AI-generated PR</a> crystallizes this issue. The code wasn&#8217;t necessarily bad, but no one had bandwidth to review such a huge change, and reviewing AI-generated code is <em>&#8220;more taxing&#8221;</em> than reviewing human code. The lesson: <strong>AI can flood you with code, but teams must manage volume to avoid a review bottleneck.</strong></p><h3><strong>Making AI review tools work</strong></h3><p>User experiences with AI review tools are decidedly mixed. On the positive side, teams report catching 95%+ of bugs in some cases - null pointer exceptions, missing test coverage, anti-patterns. On the negative side, some developers dismiss AI review comments as &#8220;text noise&#8221; - generic observations that add no value.</p><p><strong>The lesson: AI review tools require thoughtful configuration.</strong> Tune sensitivity levels, disable unhelpful comment types, and establish clear opt-in/opt-out policies. Properly configured,<a href="https://graphite.dev/guides/what-is-ai-code-review"> AI reviewers can catch 70-80% of low-hanging fruit</a>, freeing humans to focus on architecture and business logic.</p><p>Many teams encourage <strong>smaller, stackable pull requests</strong> even if AI could do a giant change all at once.<a href="https://medium.com/@addyosmani/my-llm-coding-workflow-going-into-2026-52fe1681325e"> Commit early and often</a> - treat each self-contained change as a separate commit/PR with clear messages.</p><p>Importantly, <strong>teams maintain a hard line of human accountability.</strong> No matter how much AI contributed, a human must take responsibility. As an old IBM training saying goes: <em>&#8220;A computer can never be held accountable. That&#8217;s your job as the human in the loop.&#8221;</em></p><h2><strong>The PR Contract: What authors owe reviewers</strong></h2><p><strong>Whether solo or in a team, the emerging best practice is to<a href="https://addyo.substack.com/p/treat-ai-generated-code-as-a-draft"> treat AI-generated code as a helpful draft</a> that </strong><em><strong>must</strong></em><strong> be verified.</strong></p><p>The most successful teams have converged on a simple framework:</p><h3><strong>PR Contract</strong></h3><ol><li><p><strong>What/why</strong>: Intent in 1-2 sentences.</p></li><li><p><strong>Proof it works</strong>: Tests passed, manual steps (screenshots/logs).</p></li><li><p><strong>Risk + AI role</strong>: Tier and which parts were AI-generated (e.g., high=payments).</p></li><li><p><strong>Review focus</strong>: 1-2 areas for human input (e.g., architecture).</p></li></ol><p>This isn&#8217;t bureaucracy - it&#8217;s respect for reviewer time and a forcing function for author accountability. If you can&#8217;t fill this out, you don&#8217;t understand your own change well enough to ask someone else to approve it.</p><h3><strong>Core Principles</strong></h3><p><strong>Insist on proof, not promises.</strong> Make &#8220;working code&#8221; the baseline. Prompt AI agents to execute code or run unit tests after generation. Demand evidence: logs, screenshots, results. <strong>No PR goes up without either new tests or a demo of the change working.</strong></p><p><strong>Use AI as first-pass reviewer, not final arbiter.</strong> Treat AI review output as advisory - a dialog where one AI writes code, another reviews it, and the human orchestrates fixes. Think of AI reviews as spellcheck, not an editor.</p><p><strong>Focus human review on what AI misses.</strong> Does the change introduce a security hole? Does it duplicate existing code (a common AI flaw)? Is the approach maintainable? <strong>AI triages the easy stuff; humans tackle the hard stuff.</strong></p><p><strong>Enforce incremental development.</strong> Break work into small pieces - easier for AI to produce and for humans to review. Small commits with clear messages serve as checkpoints. <strong>Never commit code you can&#8217;t explain.</strong></p><p><strong>Maintain high testing standards.</strong><a href="https://medium.com/@addyosmani/my-llm-coding-workflow-going-into-2026-52fe1681325e"> Those who get the most out of coding agents</a> have strong testing practices. Ask AI to draft tests - it&#8217;s good at generating edge-case tests you might not think of.</p><h2><strong>Looking Ahead: The bottleneck has moved</strong></h2><p><strong>AI is transforming code review from line-by-line gatekeeping into higher-level quality control - but human judgment remains the safety-critical component.</strong></p><p>What we&#8217;re seeing is workflow evolution, not elimination. Code reviews now involve reviewing a <em>conversation</em> or <em>plan</em> between AI and author as much as the code diff itself. The human reviewer&#8217;s role becomes more like an editor or architect: focusing on what&#8217;s important and trusting automation for mundane checks.</p><p>For solo developers, the path ahead is exhilarating - new tools will further streamline development. Even then, the wise developer will &#8220;trust but verify.&#8221;</p><p>In larger teams, expect growing emphasis on AI governance. Companies will formalize policies about AI contributions, requiring sign-offs that code was reviewed by an employee. Roles like &#8220;AI code auditor&#8221; will emerge. Enterprise platforms will evolve to offer better multi-repository context and custom policy enforcement.</p><p><strong>No matter the advances, the core principle remains</strong>: code review ensures software meets requirements, is secure, robust, and maintainable. AI doesn&#8217;t change those fundamentals - it just changes how we get there.</p><p>The bottleneck moved from writing code to proving it works. The best code reviewers in the age of AI will embrace this shift - letting AI accelerate the mechanical work while holding the line on accountability. They&#8217;ll let AI <strong>accelerate</strong> the process, never <strong>abdicate</strong> it. As engineers are learning, it&#8217;s about<a href="https://blog.kilo.ai/p/senior-engineers-use-ai-now"> </a><em><a href="https://blog.kilo.ai/p/senior-engineers-use-ai-now">&#8220;proof over vibes&#8221;</a></em> in coding.</p><p>Code review isn&#8217;t dead but it&#8217;s becoming more <strong>strategic</strong>. And whether you&#8217;re a solo hacker deploying at 2 AM or a team lead signing off a critical system change, one truth holds: the <em>human</em> is ultimately responsible for what the AI delivers.</p><p>Embrace the AI, but never forget to <strong>double-check the work.</strong></p><div><hr></div><p><em>I&#8217;m excited to share I&#8217;ve released a new<a href="https://beyond.addy.ie/"> AI-assisted engineering book</a> with O&#8217;Reilly. There are a number of free tips on the book site in case interested.</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_!ggv3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ggv3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ggv3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e894c835-4aef-4558-b047-83acb3be2053_7838x7838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12838196,&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://addyo.substack.com/i/183169342?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.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_!ggv3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!ggv3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe894c835-4aef-4558-b047-83acb3be2053_7838x7838.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[How Good Is AI at Coding React (Really)?]]></title><description><![CDATA[A data-driven look at what AI can and can&#8217;t do for React developers - and what you can do about it]]></description><link>https://addyo.substack.com/p/how-good-is-ai-at-coding-react-really</link><guid isPermaLink="false">https://addyo.substack.com/p/how-good-is-ai-at-coding-react-really</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Mon, 29 Dec 2025 15:31:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4Pug!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>tl;dr: AI coding benchmarks show models excel at isolated React tasks like scaffolding components or implementing explicit specs, achieving ~40% success in benchmarks, but drops to ~25% on multi-step integrations due to a &#8220;complexity cliff&#8221; in state management and design taste. The gap between &#8220;AI helped me ship&#8221; and &#8220;AI gave me a mess&#8221; is context engineering and explicit constraints. Deep React and domain knowledge enable you to spot when AI goes off the rails and understand </strong><em><strong>why</strong></em><strong> it repeats mistakes. Guide it without blindly accepting the output.</strong></p><p>This article is based on my closing keynote at React Summit by <a href="https://gitnation.com/contents/how-good-is-ai-at-coding-react-really">GitNation</a> (video).</p><div id="youtube2-jgAqpk3ZI6E" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;jgAqpk3ZI6E&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/jgAqpk3ZI6E?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>The Question everyone&#8217;s asking (but nobody&#8217;s answering well)</strong></h2><p>Let me be direct: most conversations about AI and coding are stuck on vibes. Either AI is magic that will replace us all, or it&#8217;s garbage that can&#8217;t do anything useful, or it&#8217;s perpetually &#8220;one prompt away&#8221; from shipping production code. All three takes miss what&#8217;s actually interesting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Pug!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Pug!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 424w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 848w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Pug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/daf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1438853,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.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_!4Pug!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 424w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 848w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!4Pug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf33944-9ed1-4ea4-9531-0b9d47869b1c_1880x1046.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>After spending a year analyzing benchmarks, building with these tools at Google, and watching React developers struggle (and succeed) with AI assistants, here&#8217;s what I&#8217;ve learned: AI is <em>already</em> useful for React developers, but its usefulness is extremely uneven. The unevenness is predictable if you know what to look for.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9LSy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9LSy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9LSy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:553092,&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;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.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_!9LSy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!9LSy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d19e66-2f44-4dfb-b88c-bec57fb63470_1886x1054.png 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>More importantly - and this is the part most articles skip - you have far more control over outcomes than you think.</p><h2><strong>The Core Thesis: Two sides of the same coin</strong></h2><p>This article covers two critical angles:</p><p><strong>What the data tells us:</strong> Benchmarks like <a href="https://designarena.ai/">Design Arena</a>, <a href="https://lmarena.ai/leaderboard/webdev">Web Dev Arena</a>, <a href="https://openai.com/index/introducing-swe-bench-verified/">SWE-Bench</a>, and <a href="https://huggingface.co/spaces/bytedance-research/Web-Bench-Leaderboard">Web-Bench</a> reveal clear patterns about where AI excels (isolated components, scaffolding, implementing explicit requirements) and where it struggles (multi-step integration, design taste, complex state management). Understanding these patterns means you can predict what will work before you waste time.</p><p><strong>What you can control:</strong> The difference between &#8220;AI helped me ship&#8221; and &#8220;AI gave me a mess to untangle&#8221; almost never comes down to just model selection. It comes down to context engineering, prompt specificity, workflow structure, and guardrails. These are all in your power to fix.</p><p>Let&#8217;s start with the foundation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mv8Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mv8Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 424w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 848w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mv8Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png" width="1456" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:540281,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.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_!mv8Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 424w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 848w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!mv8Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f84c291-2bb3-448e-a0fe-09ca43f307a4_1878x1044.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>90% of developers use AI for coding in some way. In an AI-assisted world, <strong>the value of frameworks like React depends on how effectively AI can use them.</strong> If AI can&#8217;t handle a framework well, that means the <strong>quality of experiences </strong>you can build without a lot of manual work can be limited.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6tIw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6tIw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 424w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 848w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6tIw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:605984,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.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_!6tIw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 424w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 848w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!6tIw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F231f9c94-674d-4c2e-a1b8-d5b8aeeaa4e5_1884x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A lot of AI code quality comes down to context. <strong>You want to squeeze the most value out of the token budget in your context window</strong>. But the model, the tools that sit on top of it all of these layers play an important role.</p><h2><strong>AI Changes what is easy, not what is true</strong></h2><p>AI is a force multiplier. It amplifies everything: good requirements, good architecture, good taste. It also amplifies the bad: vague specs, messy state, and the temptation to ship something you haven&#8217;t really understood. Give it a weak brief, and it will happily hand you a 10,000-line maze you&#8217;ll later delete.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!--eg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!--eg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 424w, https://substackcdn.com/image/fetch/$s_!--eg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 848w, https://substackcdn.com/image/fetch/$s_!--eg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!--eg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!--eg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1151719,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.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_!--eg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 424w, https://substackcdn.com/image/fetch/$s_!--eg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 848w, https://substackcdn.com/image/fetch/$s_!--eg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!--eg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c5eb255-4302-4d6c-8c2b-6090cb07cc6d_1878x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 draw a hard line between <strong><a href="https://addyo.substack.com/p/vibe-coding-is-not-the-same-as-ai">AI-assisted vibe coding</a></strong><a href="https://addyo.substack.com/p/vibe-coding-is-not-the-same-as-ai"> and </a><strong><a href="https://addyo.substack.com/p/vibe-coding-is-not-the-same-as-ai">AI-assisted engineering</a></strong>. Vibe coding is trusting high-level prompts and prioritizing speed over review. AI-assisted engineering is integrating AI inside a structured process where the human stays in control and accountable for the output.</p><p>Why does this distinction matter for React?</p><p>Because React apps aren&#8217;t just code. They&#8217;re product behavior, user experience, reliability, security, performance, accessibility, and long-term maintenance. AI can help with all of that - but only if you treat it like a teammate you&#8217;re pairing with and have <strong>oversight over</strong>, not a vending machine dispensing code.</p><h2><strong>The Monoculture problem (and opportunity)</strong></h2><p>One of the most under-discussed parts of the AI coding story: &#8220;how well AI codes&#8221; is not a universal property. It depends on what the model has seen in training, what tools it has access to, and what the ecosystem has standardized on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d39I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d39I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 424w, https://substackcdn.com/image/fetch/$s_!d39I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 848w, https://substackcdn.com/image/fetch/$s_!d39I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!d39I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d39I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1100840,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.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_!d39I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 424w, https://substackcdn.com/image/fetch/$s_!d39I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 848w, https://substackcdn.com/image/fetch/$s_!d39I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!d39I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae9dce94-8531-47b8-9cef-6171c199a55f_1878x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Large language models effectively set the ceiling for how much leverage you get out of a framework in an AI-assisted workflow. If AI struggles with a framework, you feel that as friction and quality limits.</p><p>Most AI tools converge on a stack that looks like: React, TypeScript, Tailwind, shadcn/ui. That stack dominates training data and tool optimization, so models are competent there and noticeably shakier off the beaten path.</p><p><strong>This has two implications for practicing React developers:</strong></p><ol><li><p><strong>If you&#8217;re on the mainstream stack, your &#8220;AI assistance ceiling&#8221; is higher.</strong> You&#8217;ll get better scaffolds, better component generation, and fewer hallucinated APIs.</p></li><li><p><strong>If you&#8217;re not, you need to compensate</strong> with better context, doc retrieval, and stricter constraints - or you&#8217;ll watch the model confidently build an alternate universe version of your app.</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_!Iedm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Iedm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 424w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 848w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Iedm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1124916,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.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_!Iedm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 424w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 848w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!Iedm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87c6d29-4dea-4be6-923b-f10ab41afee5_1880x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>There&#8217;s also a second-order effect: monoculture can slow innovation. React skills are likely to stay very relevant (comforting), but it also means newer frameworks or alternative patterns can face headwinds until models and tools catch up.</p><p>The good news? If a framework gains traction, AI makers will fine-tune models on it. Docs MCPs can bridge gaps in the interim. But short-term, React&#8217;s position is extremely strong because AI &#8220;knows&#8221; it best.</p><div><hr></div><h2><strong>The Big reality check: The complexity cliff</strong></h2><p>If you remember nothing else from this article, remember this: <strong>AI handles simple tasks well and then falls off a cliff as complexity rises.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OchZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OchZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 424w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 848w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OchZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:513018,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.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_!OchZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 424w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 848w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!OchZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c900599-9f98-4fed-836c-bdadea0d05e3_1872x1056.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A form component, a utility function, a small isolated widget: great. Multi-step work across a real codebase: much less reliable.</p><p>I used a mix of <strong>objective</strong> and <strong>human-rated benchmarks</strong> to show this pattern. We need both, because pass/fail benchmarks tell you &#8220;can it solve the issue,&#8221; while human-rated arenas tell you something equally important for frontend work: &#8220;do humans actually want to use what it builds.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gofe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gofe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 424w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 848w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gofe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:841476,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.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_!Gofe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 424w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 848w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!Gofe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3c45e-20ec-4b3f-abc4-3ba98b9941a5_1882x1056.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>What The Numbers Show</strong></h3><p><strong>On objective benchmarks, the complexity cliff is visible:</strong></p><ul><li><p><strong>Next.js eval tasks:</strong> Best models around 42% success - roughly 21 of 50 tasks completed. Even on framework-specific challenges, failures are common.</p></li><li><p><strong>Web-Bench multi-step full-stack tasks:</strong> Around 25% tasks solved. Many failures as steps chain together.</p></li><li><p><strong>SWE-Bench Pro:</strong> Around 20-43% on the Pro public set, versus jumping to over 70% on SWE-Bench Verified. Increasing complexity collapses performance.</p></li></ul><p>The gap between benchmark performance and your real codebase is the important thing to calibrate to.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!31x7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!31x7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 424w, https://substackcdn.com/image/fetch/$s_!31x7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 848w, https://substackcdn.com/image/fetch/$s_!31x7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!31x7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!31x7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:358686,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.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_!31x7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 424w, https://substackcdn.com/image/fetch/$s_!31x7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 848w, https://substackcdn.com/image/fetch/$s_!31x7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!31x7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1842ca46-0566-4117-9ae4-8dbd7e30071c_1888x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uI5j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uI5j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 424w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 848w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uI5j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:405164,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.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_!uI5j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 424w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 848w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!uI5j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0098d15d-8b6a-43ea-a42c-87d6e25d8119_1880x1056.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>My practical translation of the complexity cliff for React developers:</strong></p><ul><li><p>AI is <strong>great</strong> at first drafts</p></li><li><p>AI is <strong>mediocre</strong> at integration</p></li><li><p>AI is <strong>unreliable</strong> at long multi-step changes unless you give it strong tooling and context</p></li><li><p>AI gets you to &#8220;it works&#8221; faster than it gets you to &#8220;it&#8217;s a codebase I want to own&#8221;</p></li></ul><div><hr></div><h2><strong>Design Arena and Web Dev Arena: Where React developers should pay attention</strong></h2><p>React developers spend a lot of time in the space between &#8220;the code runs&#8221; and &#8220;this is good.&#8221; That space includes UI quality, hierarchy, spacing, accessibility, and whether the end result feels intentional.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dCGE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dCGE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 424w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 848w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dCGE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:337700,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.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_!dCGE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 424w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 848w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.png 1272w, https://substackcdn.com/image/fetch/$s_!dCGE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dfa85d9-93db-47ee-9ef5-cec9d0f1d6a9_2294x1482.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Design Arena is interesting because it&#8217;s explicitly human preference&#8211;driven. Here&#8217;s how it works:</p><ul><li><p>Users come to the platform to explore and use the best AI-powered tools, like website generation and game generation</p></li><li><p>Design Arena presents multiple versions of the same experience (a website, agent, or builder), and users can save their favorite</p></li><li><p>Rankings emerge from these aggregated choices across categories like website generation, agents, and builders, reflecting real usage preferences rather than curated rubrics</p></li><li><p>Elo-style scores are calculated using a Bradley&#8211;Terry model, with models below a minimum comparison threshold filtered out.</p></li><li><p>The leaderboard updates live (every three hours, per their methodology), powered by interactions from over 850,000 users across 145 countries.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qEMX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qEMX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 424w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 848w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qEMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png&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;:884780,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.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_!qEMX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 424w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 848w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!qEMX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8de171-6e05-437b-b8ff-eedd03ea2b15_1882x1058.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><em>By using a pairwise comparison system, DesignArena generates leaderboards that rank AI models based on human preferences, helping to measure and drive improvements in design quality, usability, and aesthetics.</em></p><p>Similarly, <a href="http://Design Arena">Web Dev Arena</a> is an open-source benchmarking platform from LMArena designed to evaluate LLMs based on their capability to build functional, interactive web applications. Users submit a prompt and compare anonymous AI models generating code side-by-side, contributing to a community-driven Elo leaderboard that ranks top models for complex web development tasks. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oS8c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oS8c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 424w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 848w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oS8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:480229,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.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_!oS8c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 424w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 848w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.png 1272w, https://substackcdn.com/image/fetch/$s_!oS8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb5604d-1a65-4da2-8988-5739c3953e23_3012x1504.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 what do React developers learn from such arenas?</p><h3><strong>The Core Finding: AI has mastered logic, but not taste</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SbhK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SbhK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 424w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 848w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SbhK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:611725,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.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_!SbhK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 424w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 848w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!SbhK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db0f7bd-5c10-44f6-9b76-93bae9c1e1e1_1882x1056.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 slide is the thesis of the whole talk. Models can solve hard reasoning problems and still produce UIs with basic design failures: off color choices, inconsistent spacing, weak hierarchy.</p><p>I call this the <strong>capability divide:</strong></p><ul><li><p>AI is <strong>strong</strong> at logic, data flow, and implementing explicit requirements</p></li><li><p>AI is <strong>weak</strong> at taste, usability awareness, and aesthetic judgment</p></li></ul><p><strong>If you&#8217;re a React developer, this should change how you delegate:</strong></p><ul><li><p>Delegate boilerplate and mechanical implementation</p></li><li><p>Keep design intent, API design, and architecture decisions human-led</p></li><li><p>Treat &#8220;pretty&#8221; as an explicit requirement, not a default outcome</p></li></ul><h3><strong>The Surprise: Tools and scaffolding matter more than you think</strong></h3><p>Design Arena also found something counterintuitive: <strong>general agents are more variable than specialists</strong>, and the scaffolding and workflow around the base model drives a lot of the performance spread.</p><p>Put differently: two products can wrap the same base model and feel wildly different because of tooling, retrieval, iteration loops, and guardrails.</p><p>This is great news, because it means <strong>you have leverage even when you don&#8217;t control the base model.</strong></p><div><hr></div><h2><strong>Arena by Arena: What React developers should steal from the data</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4uWz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4uWz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 424w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 848w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4uWz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:358564,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.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_!4uWz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 424w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 848w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!4uWz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc722a14-d454-4ea6-b7cb-44a71435f883_1874x1048.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Let me walk through five arenas and extract the practical lessons for each one.</p><h3><strong>1. Website Arena: Prompt to website (and why Purple keeps happening)</strong></h3><p>The Website Arena measures how well models generate complete single-page sites from a prompt, with instructions to add modern UI/UX practices, accessibility, and responsive design.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oRLU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oRLU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 424w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 848w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 1272w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oRLU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png" width="1456" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:439242,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.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_!oRLU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 424w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 848w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.png 1272w, https://substackcdn.com/image/fetch/$s_!oRLU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7854a835-eee7-4830-ad6a-a4fa28576d26_1882x1064.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 important nuance is how winners tend to win: it&#8217;s not always the flashiest layout, it&#8217;s often <strong>the most coherent and complete page.</strong></p><p>If your goal is something shippable, bias your prompts toward coherence and structure, not 'make it look cool.</p><h4><strong>Why is there so much purple?</strong></h4><p>I joked about this in the talk because once you see it, you can&#8217;t unsee it: models converge on safe, generic design patterns, and &#8220;purple gradient plus glassmorphism&#8221; is one of those defaults.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7cgp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7cgp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 424w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 848w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7cgp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:340995,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.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_!7cgp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 424w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 848w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!7cgp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7036a6ef-4aa0-4f8e-a63d-9cd7e33f0cd2_1874x1046.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>That&#8217;s not just a meme. It&#8217;s <strong>distributional convergence</strong>: under uncertainty, models gravitate toward common patterns in the data.</p><h4><strong>How do you fix it?</strong></h4><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vuc-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vuc-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 424w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 848w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 1272w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vuc-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:846531,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.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_!vuc-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 424w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 848w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.png 1272w, https://substackcdn.com/image/fetch/$s_!vuc-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69b8dcfd-e8a0-4293-afef-771b1a00755c_1886x1060.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>One approach is tooling rather than &#8220;better prompts forever.&#8221; Anthropic pushed some of this into Skills (markdown files that Claude reads on demand) instead of trying to brute force it through training. Their <a href="https://github.com/anthropics/claude-code/blob/main/plugins/frontend-design/skills/frontend-design/SKILL.md">frontend-design skill</a> is worth checking out.</p><p>Even if you never use Claude Skills specifically, the lesson is broader:</p><ul><li><p>Some failures are better solved by scaffolding and constraints than by model selection</p></li><li><p>You want repeatable, shareable &#8220;taste primitives&#8221; that don&#8217;t require rewriting your entire prompt every time</p></li></ul><h4><strong>My website generation checklist for React teams</strong></h4><p><strong>What I ask for up front:</strong></p><ul><li><p><strong>Anchor the layout first:</strong> Specify the page sections you want before code</p></li><li><p><strong>Specify stack and routing:</strong> Call out Next App Router, file names, and RSC vs client components so it doesn&#8217;t invent structure</p></li><li><p><strong>Describe content density:</strong> Minimal landing page vs long-form so spacing doesn&#8217;t default to sludge</p></li><li><p><strong>Ask for responsive constraints:</strong> Breakpoints and collapse behavior</p></li><li><p><strong>Bake in accessibility:</strong> Semantic landmarks, skip links, labels, safe contrast</p></li><li><p><strong>Convert HTML to real React files:</strong> Map sections to components and wire them up in page.tsx</p></li></ul><p><strong>What I do after generation, before trusting it:</strong></p><ul><li><p><strong>Strip inline scripts</strong> and move DOM logic into client components with hooks and typed props</p></li><li><p><strong>Normalize layout primitives</strong> and refactor div soup into your real Shell, Container, Stack components</p></li><li><p><strong>Run a11y and perf checks:</strong> Lint, Lighthouse, and add tests for critical flows</p></li><li><p><strong>Freeze the visual system:</strong> Snap palette, spacing, typography into Tailwind config or tokens</p></li><li><p><strong>Keep the model on a leash:</strong> Use it for slices and variants, not wholesale rewrites of a tuned page</p></li></ul><p><strong>Single sentence summary:</strong> Be radically explicit in your instructions, and enforce your design system and coding standards so the model can&#8217;t drift.</p><p><strong>Poor prompt:</strong></p><pre><code><code>Make a landing page for a SaaS product</code></code></pre><p><strong>Strong prompt:</strong></p><pre><code><code>Create a Next.js App Router landing page (app/page.tsx) for a developer tools SaaS:

Layout sections:
1. Hero with headline, subheadline, CTA
2. Features (3 columns, icon + title + description each)
3. Social proof (logos grid)
4. CTA

Stack: Next.js 15, TypeScript, Tailwind
Density: Spacious landing page (not cramped)
Colors: Avoid purple/pink gradients - use neutral gray with blue accent
Responsive: Stack features vertically below 768px

Accessibility:
- Semantic HTML (header, main, section)
- Alt text for all images
- Sufficient color contrast (WCAG AA)</code></code></pre><div><hr></div><h3><strong>2. Agent Arena: Most failures are context failures now</strong></h3><p>The Agent Arena is a step up: multi-step tasks like writing code, fixing bugs, running tests, running browsers, debugging. This is where &#8220;agent loops&#8221; show up.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-pUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-pUd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 424w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 848w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-pUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:374430,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.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_!-pUd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 424w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 848w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!-pUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87110bdc-9ffa-4bba-aa17-4dd41f10d7ee_1884x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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&#8217;s the biggest trap: when agents fail, it often looks like &#8220;the model is dumb.&#8221; Increasingly, that&#8217;s not true.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a_vj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a_vj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 424w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 848w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a_vj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:372295,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.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_!a_vj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 424w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 848w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!a_vj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f3b6d65-19dc-4171-a84d-e27daa2bfcfd_1872x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Most agent failures are context failures.</strong> If the agent doesn&#8217;t see the right logs, tests, or constraints, it makes confident but wrong changes. Fixing context is often higher leverage than switching models.</p><p>I also called out something that will resonate if you&#8217;ve ever spent time tweaking prompts: <strong>prompt engineering failures often come from context mismanagement</strong>, not &#8220;the wrong magic words.&#8221;</p><h4><strong>How I run agents like a React team lead</strong></h4><p><strong>Treat agents like a junior hire:</strong></p><ul><li><p>Give a written task brief, acceptance criteria, and constraints</p></li><li><p>Declare the sandbox: disposable branch, test DB, temporary env vars</p></li><li><p>Ask for a plan first: files it will touch, tools it will call, risks it sees</p></li><li><p>Cap blast radius: constrain write access to app, src, config</p></li><li><p>Require tests as part of fixes: reproduce bug first, then patch</p></li><li><p>Force small PRs: reviewable commits, not a mega diff</p></li></ul><p><strong>Then add operational guardrails:</strong></p><ul><li><p>Point them at logs and monitors: build logs, Sentry traces, Playwright failures</p></li><li><p>Snap to house style: ESLint config, prettier rules, naming conventions</p></li><li><p>Disable auto-merge and require human approval for agent changes</p></li></ul><p>That&#8217;s the difference between &#8220;agentic coding&#8221; and &#8220;outsourcing your codebase to a stochastic parrot.&#8221;</p><p><strong>Poor prompt:</strong></p><pre><code><code>Fix the bug in the checkout flow</code></code></pre><p><strong>Strong prompt:</strong></p><pre><code><code>Task: Fix abandoned cart bug in checkout

Context:
- File: app/checkout/page.tsx
- Error: Cart resets on page refresh
- Expected: Cart persists via localStorage
- Test: Run `npm test checkout.test.tsx` to verify

Plan required before implementation:
1. Identify where cart state is managed
2. Add localStorage persistence
3. Add hydration logic
4. Update tests
5. Verify in Playwright

Constraints:
- Only modify app/checkout/* and lib/cart.ts
- Maintain existing TypeScript types
- Follow our ESLint rules</code></code></pre><div><hr></div><h3><strong>3. Context Engineering: The highest leverage skill for agentic React</strong></h3><p>If context is the bottleneck, then <strong>context engineering</strong> is the discipline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GJFk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GJFk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GJFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:450343,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.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_!GJFk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!GJFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3af5800-ea23-4d90-8117-3d88e3f6142c_1886x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 talk I described context engineering as the art and science of filling the context window with just the right information to guide the agent&#8217;s performance. It&#8217;s more than clever prompting.</p><p><strong>Two specific tips I want most React developers to internalize:</strong></p><ol><li><p><strong>Visual context is powerful.</strong> Screenshots can enable one-shot solutions for UI bugs or design tasks.</p></li><li><p><strong>Structure beats volume.</strong> Unstructured dumps confuse the model, competing information distracts it, and overload overwhelms it.</p></li></ol><p>Under the hood, this ties back to a core principle: <strong>&#8220;Find the smallest possible set of high-signal tokens that maximize the likelihood of your desired outcome.&#8221;</strong></p><p>Every token you waste is context you cannot spend on:</p><ul><li><p>The actual API surface you need</p></li><li><p>The architectural constraints you care about</p></li><li><p>The failing test output that would prevent a bad patch</p></li></ul><div><hr></div><h3><strong>4. Tooling: If you can&#8217;t control the base model, control the layer around It</strong></h3><p>As I said in the &#8220;mastering the tools&#8221; section: you probably don&#8217;t control the base model, but you can absolutely steer the tooling around it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jWTi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jWTi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 424w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 848w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jWTi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png" width="1456" height="807" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:807,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:365503,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.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_!jWTi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 424w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 848w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!jWTi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed042fe-f7de-4dee-b591-b75ef2509300_1872x1038.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A concrete example is doc and state retrieval. Let me show you two tools that demonstrate this pattern:</p><h4><strong>Context7 MCP</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FkZp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FkZp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FkZp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:304211,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.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_!FkZp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 424w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 848w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!FkZp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8dc6d9b-6818-4e43-946c-3ecdf64773ad_1886x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><a href="https://context7.com/">Context7</a></strong> pulls fresh, version-specific docs and examples from source sites and injects them into the model&#8217;s working set, reducing guessing and stale snippets. You can nudge it toward topics like routing or hooks and cap how much to bring in.</p><h4><strong>Next.js DevTools MCP</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hEVK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hEVK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 424w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 848w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hEVK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png&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;:298030,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.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_!hEVK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 424w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 848w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!hEVK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d50070d-ffb6-4bf8-838b-dd65d93c4f16_1882x1058.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 modern Next dev server exposes a built-in MCP endpoint. The <strong><a href="https://nextjs.org/docs/app/guides/mcp">Next.js DevTools MCP server</a></strong> connects to it so an agent can ask for real data about your running app:</p><ul><li><p>Current build or runtime errors</p></li><li><p>Routes and layouts</p></li><li><p>Component metadata</p></li><li><p>Server actions and dev logs</p></li><li><p>Playwright paths for simple browser checks</p></li></ul><p>It also ships with a Next-specific knowledge base and helpers for common tasks like upgrades.</p><h4><strong>Chrome DevTools MCP</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hkSK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hkSK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 424w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 848w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hkSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:457097,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.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_!hkSK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 424w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 848w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!hkSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f4afb67-0ecf-4177-9330-664d2be8a881_1882x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><strong><a href="https://github.com/ChromeDevTools/chrome-devtools-mcp">Chrome DevTools MCP</a></strong> gives the agent eyes and hands in a real browser. It can open pages, click through flows, read console and network logs, take screenshots, and record performance traces to investigate things like high LCP or blocking time. Under the hood it rides on Chrome DevTools and Puppeteer, so you get reliable automation instead of brittle scripts. Because it can see page content, you still want sensible flags and isolation from personal browsing, but treated as scoped tooling it is very powerful.</p><h4><strong>How MCPs fit together</strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r5oN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r5oN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 424w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 848w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r5oN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png" width="1456" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:330312,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.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_!r5oN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 424w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 848w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!r5oN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf2b9db-998e-41c8-9803-c7445bdade06_1860x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Context7 gives your assistant the right external knowledge. Next DevTools MCP gives it your app&#8217;s truth. Chrome DevTools MCP proves the result in a real browser. Used together, you turn a guessing assistant into a closed&#8209;loop coder and debugger that cites sources, places changes correctly, and verifies outcomes before you hit commit.</p><p>This is the pattern I expect more React teams to adopt: rather than hoping the model remembers today&#8217;s Next.js behavior, wire it to an always-correct source of truth.</p><div><hr></div><h3><strong>5. Builder Arena: Vibe Coding tools used responsibly</strong></h3><p>Builder tools are designed for rapid prompt-driven product creation, not just &#8220;write me a component.&#8221; They optimize for cohesion and perceived completeness.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BEzj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BEzj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 424w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 848w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BEzj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png" width="1456" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:369968,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.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_!BEzj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 424w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 848w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.png 1272w, https://substackcdn.com/image/fetch/$s_!BEzj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9ec6cea-d6ff-411a-9102-de485745452e_1882x1046.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Design Arena&#8217;s builder results were surprising precisely because builders are not just base models. They&#8217;re base models plus scaffolding plus UX and post-processing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!khIi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!khIi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 424w, https://substackcdn.com/image/fetch/$s_!khIi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 848w, https://substackcdn.com/image/fetch/$s_!khIi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!khIi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!khIi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:406806,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.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_!khIi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 424w, https://substackcdn.com/image/fetch/$s_!khIi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 848w, https://substackcdn.com/image/fetch/$s_!khIi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!khIi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d42ef91-5ccb-4fbe-9f54-0b1c963cdb42_1878x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>My guidance for React developers:</strong></p><ul><li><p><strong>Use builders as idea generators.</strong> Harvest layout, copy, micro-interactions, then rebuild cleanly in your codebase</p></li><li><p><strong>Normalize APIs.</strong> Refactor generated fetch calls, hooks, stores to your patterns</p></li><li><p><strong>Consolidate CSS.</strong> Pull scattered styles into tokens and your component library to avoid spawning a second design system</p></li><li><p><strong>Archive failure cases.</strong> Save screenshots and diffs to refine prompts and tool settings over time</p></li></ul><p><strong>And if you want the &#8220;before you even start&#8221; checklist:</strong></p><ul><li><p>Start with a written product spec: features, user types, flows</p></li><li><p>Lock your design system: your existing shadcn, Radix, or in-house primitives</p></li><li><p>Describe the vibe in concrete terms: reference sites, adjectives, motion levels</p></li><li><p>Limit surface area: use builders for a single flow rather than your entire shell</p></li></ul><p>If you treat builder output as production code by default, you&#8217;ll end up maintaining a foreign codebase you never chose.</p><div><hr></div><h3><strong>6. UI Components Arena: where React developers win</strong></h3><p>The UI Components Arena is the most directly applicable to most React teams: generate isolated reusable components. Scope is focused, success rate is high, and output can be close to production-ready.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kUQw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kUQw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 424w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 848w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 1272w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kUQw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:472086,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.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_!kUQw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 424w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 848w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.png 1272w, https://substackcdn.com/image/fetch/$s_!kUQw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcda54739-ee8a-4dbc-b532-73d77639d270_1890x1060.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nNLz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nNLz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 424w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 848w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nNLz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png" width="1456" height="811" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:811,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:679071,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.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_!nNLz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 424w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 848w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!nNLz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd207b9b-7778-4047-befc-ee4a91ed9617_1888x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>It&#8217;s also where the &#8220;logic not taste&#8221; lesson shows up cleanly: models can wire up props and state and still make ugly, inconsistent decisions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6zux!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6zux!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 424w, https://substackcdn.com/image/fetch/$s_!6zux!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 848w, https://substackcdn.com/image/fetch/$s_!6zux!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!6zux!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6zux!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:557841,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.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_!6zux!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 424w, https://substackcdn.com/image/fetch/$s_!6zux!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 848w, https://substackcdn.com/image/fetch/$s_!6zux!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!6zux!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32f037f5-be58-4556-86c3-a0d2c1dbe3ac_1888x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 use AI here heavily, but with a specific protocol.</p><h4><strong>Start by forcing a Component contract</strong></h4><p>These are the things I want in the prompt before the model writes JSX:</p><ul><li><p>Define prop names, types, variants, and states</p></li><li><p>Provide examples and edge cases, including weird inputs</p></li><li><p>Demand accessibility by default: keyboard nav, ARIA, focus management, error messaging</p></li><li><p>Avoid anonymous div wrappers; use semantic structure where it matters</p></li><li><p>Separate styling concerns: Tailwind classes or your utility system, not inline styles</p></li><li><p>Request story files: Storybook or MDX usage examples</p></li></ul><h4><strong>Then do the React integration work AI is usually bad at</strong></h4><p>Once you have a plausible component, integrate it like a senior engineer:</p><ul><li><p><strong>Convert state to idiomatic React:</strong> Replace query selectors and global variables with hooks and props</p></li><li><p><strong>Make behavior composable:</strong> Refactor complex pieces into hooks you own</p></li><li><p><strong>Test the contract, not the implementation:</strong> Focus tests on props and events so internals can evolve</p></li><li><p><strong>Snap components into your design system</strong> before exposing them broadly</p></li></ul><p>This is the pattern I recommend to teams: let AI get you 70% of the way on structure, then deliberately take ownership of API shape, composition, and design tokens.</p><p><strong>Poor prompt:</strong></p><pre><code><code>Create a sign-up button component with different variants</code></code></pre><p><strong>Strong prompt:</strong></p><pre><code><code>Create a sign-up Button component with:

Props:
- variant: 'primary' | 'secondary' | 'ghost'
- size: 'sm' | 'md' | 'lg'
- disabled: boolean
- loading: boolean

Requirements:
- Use Tailwind classes
- Show loading spinner when loading=true
- Disable pointer events when disabled
- Support keyboard navigation (Enter/Space)
- Include focus-visible ring
- ARIA: use aria-disabled, aria-busy

Example usage:
&lt;Button variant="primary" size="md" loading={isSubmitting}&gt;
  Submit
&lt;/Button&gt;</code></code></pre><p>Then show a side-by-side of what each produces - the poor one generates inconsistent spacing, misses accessibility, uses inline styles. The strong one hits all requirements.</p><div><hr></div><h3><strong>7. 3D and Data Viz: Let AI generate assets and data, not your entire integration</strong></h3><p>The 3D and Data Viz arenas stress more structured generation tasks, relevant for interactive dashboards, WebGL, and data-heavy apps.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XKdS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XKdS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 424w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 848w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XKdS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:438825,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.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_!XKdS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 424w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 848w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!XKdS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae074fe-d108-4a11-a586-158cec594707_1890x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2dCT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2dCT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 424w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 848w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2dCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:471845,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.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_!2dCT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 424w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 848w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.png 1272w, https://substackcdn.com/image/fetch/$s_!2dCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82714f0f-f3ac-4226-a70e-cbe700f5593c_1884x1056.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 lesson from these arenas is not &#8220;AI writes your Three.js app.&#8221; It&#8217;s:</p><ul><li><p><strong>Decide what AI should generate:</strong> Ask for geometries, datasets, configuration, not full integration code</p></li><li><p><strong>Specify the target library:</strong> React Three Fiber, Drei, Recharts, Victory, Visx</p></li><li><p><strong>Request low poly first</strong> and iterate toward fidelity once performance is proven</p></li><li><p><strong>Keep performance under control:</strong> Lazy load heavy assets, guard frame rate, keep fallbacks</p></li></ul><p>In practice, this is how you avoid an &#8220;AI demo&#8221; becoming a performance incident.</p><div><hr></div><h2><strong>React-Specific tips I want more teams to operationalize</strong></h2><p>The talk includes a slide of &#8220;React AI coding tips&#8221; that I keep coming back to because it captures what actually works in practice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0aF5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0aF5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 424w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 848w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0aF5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png" width="1456" height="811" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:811,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:629248,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.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_!0aF5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 424w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 848w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!0aF5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0eda09af-dbe7-40a3-91d9-243c1ecbd735_1884x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 are the ones I see paying off immediately on real teams:</p><ul><li><p><strong>Start prompts with the component API:</strong> Declare props, variants, states, and then tell the model to implement exactly that</p></li><li><p><strong>Name interactive states explicitly:</strong> hover, focus, loading, disabled</p></li><li><p><strong>Ask for a plan, then generate in steps:</strong> Small increments beat one big shot, and help avoid the complexity cliff</p></li><li><p><strong>Codify taste so AI can follow it:</strong> Lock spacing, colors, components in Tailwind config and your design system</p></li><li><p><strong>Be explicit about routes, layouts, server actions, loading and error boundaries</strong></p></li><li><p><strong>Bake conventions into the repo:</strong> Document App Router defaults, Server Components, Suspense so assistants align automatically</p></li><li><p><strong>Run checks only on what changed:</strong> Husky with lint-staged to run typecheck, lint, tests on staged files</p></li><li><p><strong>Control cache behavior explicitly:</strong> Fetch cache options and revalidation windows as part of the prompt, so the model doesn&#8217;t guess your policy</p></li></ul><p><strong>The meta-message is the same:</strong> The difference between &#8220;AI helped me ship&#8221; and &#8220;AI gave me a mess&#8221; is almost always the level of specificity and the strength of your guardrails.</p><div><hr></div><h2><strong>How I debug AI coding failures: it&#8217;s a pipeline, not a model</strong></h2><p>Once you accept the complexity cliff, the question becomes: how do you consistently get good outcomes?</p><p>I use a mental model I showed near the end of the talk: <strong>when AI code works or fails, it&#8217;s rarely &#8220;just the model.&#8221; It&#8217;s the whole pipeline.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!na-W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!na-W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 424w, https://substackcdn.com/image/fetch/$s_!na-W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 848w, https://substackcdn.com/image/fetch/$s_!na-W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!na-W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!na-W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png&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;:332597,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.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_!na-W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 424w, https://substackcdn.com/image/fetch/$s_!na-W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 848w, https://substackcdn.com/image/fetch/$s_!na-W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!na-W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b51dd38-b014-4122-bc97-32ece34d1cb1_1870x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 pipeline:</p><ol><li><p>Base model</p></li><li><p>System prompt and instructions</p></li><li><p>Your user prompt</p></li><li><p>Fine-tuning and code training</p></li><li><p>Tools and retrieval (RAG)</p></li><li><p>Agent loops (iteration)</p></li><li><p>Post-processing</p></li></ol><p>If you&#8217;re disappointed, you can almost always point to a weak link: wrong model for task, vague prompt, missing context, no iteration.</p><p>When things work, it&#8217;s usually because multiple layers aligned well: strong model, good prompt, necessary context, and iteration to iron out kinks.</p><p><strong>This is actionable, because most of those layers are under your control as a user</strong>, even if you don&#8217;t own the base model.</p><div><hr></div><h2><strong>The workflow I recommend for agentic React coding</strong></h2><p>I summarized it in the deck as the <strong>&#8220;new flow state&#8221;:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uQ4k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uQ4k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 424w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 848w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uQ4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png&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;:576421,&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://addyo.substack.com/i/180999655?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.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_!uQ4k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 424w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 848w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!uQ4k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd674a8c-c225-46c6-b653-77a4ee119ea3_1864x1048.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><ol><li><p>Define clear requirements (maybe write tests)</p></li><li><p>Prompt with context (stack, docs, examples)</p></li><li><p>Ask for plan, review</p></li><li><p>Generate code in small steps</p></li><li><p>Run, test, refine</p></li><li><p>Iterate until production-ready</p></li></ol><p>This sounds like &#8220;normal engineering,&#8221; and <strong>that&#8217;s the point.</strong> The best teams I see using AI are not doing anything mystical. They&#8217;re turning implicit engineering discipline into explicit instructions and then using AI to accelerate the boring parts.</p><p><strong>If you want one sentence:</strong> You&#8217;re not just typing code anymore, you&#8217;re orchestrating code creation.</p><div><hr></div><h2><strong>So, how good is AI at coding React, really?</strong></h2><p>Where I land after looking at these benchmarks and using these tools day to day:</p><p>&#9989; <strong>AI is genuinely strong at:</strong></p><ul><li><p>Isolated React components</p></li><li><p>Scaffolding</p></li><li><p>Converting clearly specified requirements into working code</p></li></ul><p>&#9888;&#65039; <strong>AI is still unreliable at:</strong></p><ul><li><p>Multi-step integration tasks without strong tooling, strong context, and iteration loops</p></li></ul><p>&#10060; <strong>AI is consistently weaker at:</strong></p><ul><li><p>Taste, hierarchy, and nuanced UX decisions than it is at &#8220;code that runs&#8221;</p></li><li><p>The aesthetic gap is real</p></li></ul><p>&#128161; <strong>The highest leverage strategy is not &#8220;pick the best model.&#8221;</strong> It&#8217;s:</p><ul><li><p>Reduce context failures</p></li><li><p>Codify your conventions</p></li><li><p>Force stepwise work</p></li></ul><p><strong>And the part I find most exciting:</strong> The opportunity keeps expanding. Models and tools change fast, but the underlying skills that make you effective don&#8217;t. <strong>You are still the architect.</strong></p><div><hr></div><h2><strong>Learn More</strong></h2><p>If you want to keep exploring this space:</p><ul><li><p><strong>Talk video:</strong> <a href="https://gitnation.com/contents/how-good-is-ai-at-coding-react-really">https://gitnation.com/contents/how-good-is-ai-at-coding-react-really</a></p></li><li><p><strong>Design Arena leaderboard:</strong> <a href="https://www.designarena.ai/leaderboard">https://www.designarena.ai/leaderboard</a></p></li><li><p><strong>Design Arena methodology:</strong> <a href="https://notes.designarena.ai/in-pursuit-of-a-benchmark-for-human-taste/">https://notes.designarena.ai/in-pursuit-of-a-benchmark-for-human-taste/</a></p></li></ul><p><em>And if you want to dive deeper into related topics, I&#8217;ve written two books on the topic: &#8220;<a href="https://beyond.addy.ie">Beyond Vibe Coding</a>&#8221; and &#8220;<a href="https://largeapps.dev/">Building large-scale web apps with React</a>&#8221;</em></p><p></p><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[My LLM coding workflow going into 2026]]></title><description><![CDATA[Best practices for staying in control while coding with AI]]></description><link>https://addyo.substack.com/p/my-llm-coding-workflow-going-into</link><guid isPermaLink="false">https://addyo.substack.com/p/my-llm-coding-workflow-going-into</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Thu, 18 Dec 2025 15:30:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ukkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>AI coding assistants became game-changers this year, but harnessing them effectively takes skill and structure.</strong> These tools dramatically increased what LLMs can do for real-world coding, and many developers (myself included) embraced them.</p><p>At Anthropic, for example, engineers adopted Claude Code so heavily that <strong><a href="https://newsletter.pragmaticengineer.com/p/software-engineering-with-llms-in-2025#:~:text=,%E2%80%9D">today</a> ~90% of the code for Claude Code is written by Claude Code itself</strong>. Yet, using LLMs for programming is <em>not</em> a push-button magic experience - it&#8217;s &#8220;difficult and unintuitive&#8221; and getting great results requires learning new patterns. <a href="https://addyo.substack.com/p/critical-thinking-during-the-age">Critical thinking</a> remains key. Over a year of projects, I&#8217;ve converged on a workflow similar to what many experienced devs are discovering: treat the LLM as a powerful pair programmer that <strong>requires clear direction, context and oversight</strong> rather than autonomous judgment.</p><p>In this article, I&#8217;ll share how I plan, code, and collaborate with AI going into 2026, distilling tips and best practices from my experience and the community&#8217;s collective learning. It&#8217;s a more disciplined <strong>&#8220;AI-assisted engineering&#8221;</strong> approach - leveraging AI aggressively while <strong>staying proudly accountable for the software produced</strong>.</p><div id="youtube2-FoXHScf1mjA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;FoXHScf1mjA&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/FoXHScf1mjA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>If you&#8217;re interested in more on my workflow, see &#8220;The AI-Native Software Engineer&#8221;, otherwise let&#8217;s dive straight into some of the lessons I learned.</p><h2>Start with a clear plan (specs before code)</h2><p><strong>Don&#8217;t just throw wishes at the LLM - begin by defining the problem and planning a solution.</strong> </p><p>One common mistake is diving straight into code generation with a vague prompt. In my workflow, and in many others&#8217;, the first step is <strong>brainstorming a detailed specification</strong> <em>with</em> the AI, then outlining a step-by-step plan, <em>before</em> writing any actual code. For a new project, I&#8217;ll describe the idea and ask the LLM to <strong>iteratively ask me questions</strong> until we&#8217;ve fleshed out requirements and edge cases. By the end, we compile this into a comprehensive <strong>spec.md</strong> - containing requirements, architecture decisions, data models, and even a testing strategy. This spec forms the foundation for development.</p><p>Next, I feed the spec into a reasoning-capable model and prompt it to <strong>generate a project plan</strong>: break the implementation into logical, bite-sized tasks or milestones. The AI essentially helps me do a mini &#8220;design doc&#8221; or project plan. I often iterate on this plan - editing and asking the AI to critique or refine it - until it&#8217;s coherent and complete. <em>Only then</em> do I proceed to coding. This upfront investment might feel slow, but it pays off enormously. As Les Orchard <a href="https://blog.lmorchard.com/2025/06/07/semi-automatic-coding/#:~:text=Accidental%20waterfall%20">put it</a>, it&#8217;s like doing a <strong>&#8220;waterfall in 15 minutes&#8221;</strong> - a rapid structured planning phase that makes the subsequent coding much smoother. </p><p>Having a clear spec and plan means when we unleash the codegen, both the human and the LLM know exactly what we&#8217;re building and why. In short, <strong>planning first</strong> forces you and the AI onto the same page and prevents wasted cycles. It&#8217;s a step many people are tempted to skip, but experienced LLM developers now treat a robust spec/plan as the cornerstone of the workflow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xGPR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xGPR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 424w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 848w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xGPR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png" width="1456" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1468306,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.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_!xGPR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 424w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 848w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!xGPR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F279d764d-c05b-4b6e-848e-4b481a8c0eeb_1894x1052.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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><h2>Break work into small, iterative chunks</h2><p><strong>Scope management is everything - feed the LLM manageable tasks, not the whole codebase at once.</strong> </p><p>A crucial lesson I&#8217;ve learned is to avoid asking the AI for large, monolithic outputs. Instead, we <strong>break the project into iterative steps or tickets</strong> and tackle them <a href="https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/#:~:text=please%20write%20out%20this%20plan%2C,in%20full%20detail%2C%20into%20docs%2Fplans">one by one</a>. This mirrors good software engineering practice, but it&#8217;s even more important with AI in the loop. LLMs do best when given focused prompts: implement one function, fix one bug, add one feature at a time. For example, after planning, I will prompt the codegen model: <em>&#8220;Okay, let&#8217;s implement Step 1 from the plan&#8221;</em>. We code that, test it, then move to Step 2, and so on. Each chunk is small enough that the AI can handle it within context and you can understand the code it produces.</p><p>This approach guards against the model going off the rails. If you ask for too much in one go, it&#8217;s likely to get confused or produce a <strong>&#8220;jumbled mess&#8221;</strong> that&#8217;s hard to untangle. Developers <a href="https://albertofortin.com/writing/coding-with-ai#:~:text=No%20consistency%2C%20no%20overarching%20plan,the%20other%209%20were%20doing">report</a> that when they tried to have an LLM generate huge swaths of an app, they ended up with inconsistency and duplication - &#8220;like 10 devs worked on it without talking to each other,&#8221; one said. I&#8217;ve felt that pain; the fix is to <strong>stop, back up, and split the problem into smaller pieces</strong>. Each iteration, we carry forward the context of what&#8217;s been built and incrementally add to it. This also fits nicely with a <strong>test-driven development (TDD)</strong> approach - we can write or generate tests for each piece as we go (more on testing soon).</p><p>Several coding-agent tools now explicitly support this chunked workflow. For instance, I often generate a structured <strong>&#8220;prompt plan&#8221;</strong> file that contains a sequence of prompts for each task, so that tools like Cursor can execute them one by one. The key point is to <strong>avoid huge leaps</strong>. By iterating in small loops, we greatly reduce the chance of catastrophic errors and we can course-correct quickly. LLMs excel at quick, contained tasks - use that to your advantage.</p><h2>Provide extensive context and guidance</h2><p><strong>LLMs are only as good as the context you provide - </strong><em><strong>show them</strong></em><strong> the relevant code, docs, and constraints.</strong> </p><p>When working on a codebase, I make sure to <strong>feed the AI all the information it needs</strong> to perform well. That includes the code it should modify or refer to, the project&#8217;s technical constraints, and any known pitfalls or preferred approaches. Modern tools help with this: for example, Anthropic&#8217;s Claude can import an entire GitHub repo into its context in &#8220;Projects&#8221; mode, and IDE assistants like Cursor or Copilot auto-include open files in the prompt. But I often go further - I will either use an MCP like <a href="https://context7.com/">Context7</a> or manually copy important pieces of the codebase or API docs into the conversation if I suspect the model doesn&#8217;t have them.</p><p>Expert LLM users emphasize this &#8220;context packing&#8221; step. For example, doing a <strong>&#8220;brain dump&#8221;</strong> of everything the model should know before coding, including: high-level goals and invariants, examples of good solutions, and warnings about approaches to avoid. If I&#8217;m asking an AI to implement a tricky solution, I might tell it which naive solutions are too slow, or provide a reference implementation from elsewhere. If I&#8217;m using a niche library or a brand-new API, I&#8217;ll paste in the official docs or README so the AI isn&#8217;t flying blind. All of this upfront context dramatically improves the quality of its output, because the model isn&#8217;t guessing - it has the facts and constraints in front of it.</p><p>There are now utilities to automate context packaging. I&#8217;ve experimented with tools like <strong><a href="https://gitingest.com/">gitingest</a></strong> or <strong><a href="https://github.com/abinthomasonline/repo2txt">repo2txt</a></strong>, which essentially <strong>&#8220;dump&#8221; the relevant parts of your codebase into a text file for the LLM to read</strong>. These can be a lifesaver when dealing with a large project - you generate an output.txt bundle of key source files and let the model ingest that. The principle is: <strong>don&#8217;t make the AI operate on partial information</strong>. If a bug fix requires understanding four different modules, show it those four modules. Yes, we must watch token limits, but current frontier models have pretty huge context windows (tens of thousands of tokens). Use them wisely. I often selectively include just the portions of code relevant to the task at hand, and explicitly tell the AI what <em>not</em> to focus on if something is out of scope (to save tokens).</p><p>I think <strong><a href="https://github.com/anthropics/skills">Claude Skills</a></strong> have potential because they turn what used to be fragile repeated prompting into something <strong>durable and reusable</strong> by packaging instructions, scripts, and domain specific expertise into modular capabilities that tools can automatically apply when a request matches the Skill. This means you get more reliable and context aware results than a generic prompt ever could and you move away from one off interactions toward workflows that encode repeatable procedures and team knowledge for tasks in a consistent way. A number of community-curated <a href="https://www.x-cmd.com/skill/">Skills collections</a> exist, but one of my favorite examples is the <a href="https://x.com/trq212/status/1989061937590837678">frontend-design</a> skill which can &#8220;end&#8221; the purple design aesthetic prevalent in LLM generated UIs. Until more tools support Skills officially, <a href="https://github.com/intellectronica/skillz">workarounds</a> exist.</p><p>Finally, <strong>guide the AI with comments and rules inside the prompt</strong>. I might precede a code snippet with: &#8220;Here is the current implementation of X. We need to extend it to do Y, but be careful not to break Z.&#8221; These little hints go a long way. LLMs are <strong>literalists</strong> - they&#8217;ll follow instructions, so give them detailed, contextual instructions. By proactively providing context and guidance, we minimize hallucinations and off-base suggestions and get code that fits our project&#8217;s needs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gnQO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gnQO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 424w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 848w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gnQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png" width="1456" height="811" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:811,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:752827,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.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_!gnQO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 424w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 848w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.png 1272w, https://substackcdn.com/image/fetch/$s_!gnQO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff92ab8a8-fa3b-49cb-ad4c-7e3059a8e2de_1884x1050.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Choose the right model (and use multiple when needed)</h2><p><strong>Not all coding LLMs are equal - pick your tool with intention, and don&#8217;t be afraid to swap models mid-stream.</strong> </p><p>In 2025 we&#8217;ve been spoiled with a variety of capable code-focused LLMs. Part of my workflow is <strong>choosing the model or service best suited to each task</strong>. Sometimes it can be valuable to even try two or more LLMs in parallel to cross-check how they might approach the same problem differently.</p><p>Each model has its own &#8220;personality&#8221;. The key is: <strong>if one model gets stuck or gives mediocre outputs, try another.</strong> I&#8217;ve literally copied the same prompt from one chat into another service to see if it can handle it better. This &#8220;<a href="https://blog.lmorchard.com/2025/06/07/semi-automatic-coding/#:~:text=I%20bounced%20between%20Claude%20Sonnet,Each%20had%20its%20own%20personality">model musical chairs</a>&#8221; can rescue you when you hit a model&#8217;s blind spot.</p><p>Also, make sure you&#8217;re using <em>the best version</em> available. If you can, use the newest &#8220;pro&#8221; tier models - because quality matters. And yes, it often means paying for access, but the productivity gains can justify it. Ultimately, pick the AI pair programmer whose <strong>&#8220;vibe&#8221; meshes with you</strong>. I know folks who prefer one model simply because they like how its responses <em>feel</em>. That&#8217;s valid - when you&#8217;re essentially in a constant dialogue with an AI, the UX and tone make a difference. </p><p>Personally I gravitate towards Gemini for a lot of coding work these days because the interaction feels more natural and it often understands my requests on the first try. But I will not hesitate to switch to another model if needed; sometimes a second opinion helps the solution emerge. In summary: <strong>use the best tool for the job, and remember you have an arsenal of AIs at your disposal.</strong></p><h2>Leverage AI coding across the lifecycle</h2><p><strong>Supercharge your workflow with coding-specific AI help across the SDLC.</strong> </p><p>On the command-line, new AI agents emerged. <strong>Claude Code, OpenAI&#8217;s Codex CLI</strong> and <strong>Google&#8217;s Gemini CLI</strong> are CLI tools where you can chat with them directly in your project directory - they can read files, run tests, and even multi-step fix issues. I&#8217;ve used Google&#8217;s <strong>Jules </strong>and GitHub&#8217;s <strong>Copilot Agent</strong> as well - these are <strong>asynchronous coding agents</strong> that actually clone your repo into a cloud VM and work on tasks in the background (writing tests, fixing bugs, then opening a PR for you). It&#8217;s a bit eerie to witness: you issue a command like &#8220;refactor the payment module for X&#8221; and a little while later you get a pull request with code changes and passing tests. We are truly living in the future. You can read more about this in <a href="https://addyo.substack.com/p/conductors-to-orchestrators-the-future">conductors to orchestrators</a>.</p><p>That said, <strong>these tools are not infallible, and you must understand their limits</strong>. They accelerate the mechanical parts of coding - generating boilerplate, applying repetitive changes, running tests automatically - but they still benefit greatly from your guidance. For instance, when I use an agent like Claude or Copilot to implement something, I often supply it with the plan or to-do list from earlier steps so it knows the exact sequence of tasks. If the agent supports it, I&#8217;ll load up my spec.md or plan.md in the context before telling it to execute. This keeps it on track.</p><p><strong>We&#8217;re not at the stage of letting an AI agent code an entire feature unattended</strong> and expecting perfect results. Instead, I use these tools in a supervised way: I&#8217;ll let them generate and even run code, but I keep an eye on each step, ready to step in when something looks off. There are also orchestration tools like <strong>Conductor</strong> that let you run multiple agents in parallel on different tasks (essentially a way to scale up AI help) - some engineers are experimenting with running 3-4 agents at once on separate features. I&#8217;ve dabbled in this &#8220;massively parallel&#8221; approach; it&#8217;s surprisingly effective at getting a lot done quickly, but it&#8217;s also mentally taxing to monitor multiple AI threads! For most cases, I stick to one main agent at a time and maybe a secondary one for reviews (discussed below).</p><p>Just remember these are power tools - you still control the trigger and guide the outcome.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F31O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F31O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 424w, https://substackcdn.com/image/fetch/$s_!F31O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 848w, https://substackcdn.com/image/fetch/$s_!F31O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!F31O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F31O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:388469,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.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_!F31O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 424w, https://substackcdn.com/image/fetch/$s_!F31O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 848w, https://substackcdn.com/image/fetch/$s_!F31O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!F31O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e8398cc-f2c9-4c04-b3a1-37437dd3d82a_1888x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>A full overview of where AI can improve the developer experience. This spans design, inner, submit, and outer loops - highlighting every point where AI can meaningfully reduce toil.</em></p><h2>Keep a human in the loop - verify, test, and review everything</h2><p><strong>AI will happily produce plausible-looking code, but </strong><em><strong>you</strong></em><strong> are responsible for quality - always review and test thoroughly.</strong> One of my cardinal rules is never to blindly trust an LLM&#8217;s output. As Simon Willison aptly <a href="https://simonwillison.net/2025/Mar/11/using-llms-for-code/#:~:text=Instead%2C%20use%20them%20to%20augment,on%20tedious%20tasks%20without%20complaint">says</a>, think of an LLM pair programmer as <strong>&#8220;over-confident and prone to mistakes&#8221;</strong>. It writes code with complete conviction - including bugs or nonsense - and won&#8217;t tell you something is wrong unless you catch it. So I treat every AI-generated snippet as if it came from a junior developer: I read through the code, run it, and test it as needed. <strong>You absolutely have to test what it writes</strong> - run those unit tests, or manually exercise the feature, to ensure it does what it claims. Read more about this in <a href="https://addyo.substack.com/p/vibe-coding-is-not-an-excuse-for">vibe coding is not an excuse for low-quality work</a>.</p><p>In fact, I weave testing into the workflow itself. My earlier planning stage often includes generating a list of tests or a testing plan for each step. If I&#8217;m using a tool like Claude Code, I&#8217;ll instruct it to run the test suite after implementing a task, and have it debug failures if any occur. This kind of tight feedback loop (write code &#8594; run tests &#8594; fix) is something AI excels at <em>as long as the tests exist</em>. It&#8217;s no surprise that those who get the most out of coding agents tend to be those with strong testing practices. An agent like Claude can &#8220;fly&#8221; through a project with a good test suite as safety net. Without tests, the agent might blithely assume everything is fine (&#8220;sure, all good!&#8221;) when in reality it&#8217;s broken several things. So, <strong>invest in tests</strong> - it amplifies the AI&#8217;s usefulness and confidence in the result.</p><p>Even beyond automated tests, <strong>do code reviews - both manual and AI-assisted</strong>. I routinely pause and review the code that&#8217;s been generated so far, line by line. Sometimes I&#8217;ll spawn a second AI session (or a different model) and ask <em>it</em> to critique or review code produced by the first. For example, I might have Claude write the code and then ask Gemini, &#8220;Can you review this function for any errors or improvements?&#8221; This can catch subtle issues. The key is to <em>not</em> skip the review just because an AI wrote the code. If anything, AI-written code needs <strong>extra scrutiny</strong>, because it can sometimes be superficially convincing while hiding flaws that a human might not immediately notice.</p><p>I also use <a href="https://github.com/chromeDevTools/chrome-devtools-mcp/">Chrome DevTools MCP</a>, built with my last team, for my <strong>debugging and quality loop</strong> to bridge the gap between static code analysis and live browser execution. It &#8220;gives your agent eyes&#8221;. It lets me grant my AI tools direct access to see what the browser can, inspect the DOM, get rich performance traces, console logs or network traces. This integration eliminates the friction of manual context switching, allowing for automated UI testing directly through the LLM. It means bugs can be diagnosed and fixed with high precision based on actual runtime data. </p><p>The dire consequences of skipping human oversight have been documented. One developer who leaned heavily on AI generation for a rush project <a href="https://albertofortin.com/writing/coding-with-ai#:~:text=No%20consistency%2C%20no%20overarching%20plan,the%20other%209%20were%20doing">described</a> the result as an inconsistent mess - duplicate logic, mismatched method names, no coherent architecture. He realized he&#8217;d been &#8220;building, building, building&#8221; without stepping back to really see what the AI had woven together. The fix was a painful refactor and a vow to never let things get that far out of hand again. I&#8217;ve taken that to heart. <strong>No matter how much AI I use, I remain the accountable engineer</strong>.</p><p>In practical terms, that means I only merge or ship code after I&#8217;ve understood it. If the AI generates something convoluted, I&#8217;ll ask it to add comments explaining it, or I&#8217;ll rewrite it in simpler terms. If something doesn&#8217;t feel right, I dig in - just as I would if a human colleague contributed code that raised red flags.</p><p>It&#8217;s all about mindset: <strong>the LLM is an assistant, not an autonomously reliable coder</strong>. I am the senior dev; the LLM is there to accelerate me, not replace my judgment. Maintaining this stance not only results in better code, it also protects your own growth as a developer. (I&#8217;ve heard some express concern that relying too much on AI might dull their skills - I think as long as you stay in the loop, actively reviewing and understanding everything, you&#8217;re still sharpening your instincts, just at a higher velocity.) In short: <strong>stay alert, test often, review always.</strong> It&#8217;s still your codebase at the end of the day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-yfn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-yfn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 424w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 848w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 1272w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-yfn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png" width="1456" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259438,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.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_!-yfn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 424w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 848w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.png 1272w, https://substackcdn.com/image/fetch/$s_!-yfn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd35bc06-47df-4660-9f2f-d0beaa489165_1858x974.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Commit often and use version control as a safety net. Never commit code you can&#8217;t explain.</h2><p><strong>Frequent commits are your save points - they let you undo AI missteps and understand changes.</strong> </p><p>When working with an AI that can generate a lot of code quickly, it&#8217;s easy for things to veer off course. I mitigate this by adopting ultra-granular version control habits. I commit early and often, even more than I would in normal hand-coding. After each small task or each successful automated edit, I&#8217;ll make a git commit with a clear message. This way, if the AI&#8217;s next suggestion introduces a bug or a messy change, I have a recent checkpoint to revert to (or cherry-pick from) without losing hours of work. One practitioner likened it to treating commits as <strong>&#8220;save points in a game&#8221;</strong> - if an LLM session goes sideways, you can always roll back to the last stable commit. I&#8217;ve found that advice incredibly useful. It&#8217;s much less stressful to experiment with a bold AI refactor when you know you can undo it with a git reset if needed.</p><p>Proper version control also helps when collaborating with the AI. Since I can&#8217;t rely on the AI to remember everything it&#8217;s done (context window limitations, etc.), the git history becomes a valuable log. I often scan my recent commits to brief the AI (or myself) on what changed. In fact, LLMs themselves can leverage your commit history if you provide it - I&#8217;ve pasted git diffs or commit logs into the prompt so the AI knows what code is new or what the previous state was. Amusingly, LLMs are <em>really</em> good at parsing diffs and using tools like git bisect to find where a bug was introduced. They have infinite patience to traverse commit histories, which can augment your debugging. But this only works if you have a tidy commit history to begin with.</p><p>Another benefit: small commits with good messages essentially document the development process, which helps when doing code review (AI or human). If an AI agent made five changes in one go and something broke, having those changes in separate commits makes it easier to pinpoint which commit caused the issue. If everything is in one giant commit titled &#8220;AI changes&#8221;, good luck! So I discipline myself: <em>finish task, run tests, commit.</em> This also meshes well with the earlier tip about breaking work into small chunks - each chunk ends up as its own commit or PR.</p><p>Finally, don&#8217;t be afraid to <strong>use branches or worktrees</strong> to isolate AI experiments. One advanced workflow I&#8217;ve adopted (inspired by folks like Jesse Vincent) is to spin up a fresh git worktree for a new feature or sub-project. This lets me run multiple AI coding sessions in parallel on the same repo without them interfering, and I can later merge the changes. It&#8217;s a bit like having each AI task in its own sandbox branch. If one experiment fails, I throw away that worktree and nothing is lost in main. If it succeeds, I merge it in. This approach has been crucial when I&#8217;m, say, letting an AI implement Feature A while I (or another AI) work on Feature B simultaneously. Version control is what makes this coordination possible. In short: <strong>commit often, organize your work with branches, and embrace git</strong> as the control mechanism to keep AI-generated changes manageable and reversible.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OfO1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OfO1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 424w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 848w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OfO1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png" width="1456" height="804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:804,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1039878,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.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_!OfO1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 424w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 848w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!OfO1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2702481a-ef4d-4dc7-9247-0b331eb70568_1886x1042.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Customize the AI&#8217;s behavior with rules and examples</h2><p><strong>Steer your AI assistant by providing style guides, examples, and even &#8220;rules files&#8221; - a little upfront tuning yields much better outputs.</strong></p><p>One thing I learned is that you don&#8217;t have to accept the AI&#8217;s default style or approach - you can influence it heavily by giving it guidelines. For instance, I have a <strong>CLAUDE.md</strong> file that I update periodically, which contains process rules and preferences for Claude (Anthropic&#8217;s model) to follow (and similarly a GEMINI.md when using Gemini CLI). This includes things like &#8220;write code in our project&#8217;s style, follow our lint rules, don&#8217;t use certain functions, prefer functional style over OOP,&#8221; etc. When I start a session, I feed this file to Claude to align it with our conventions. It&#8217;s surprising how well this works to keep the model &#8220;on track&#8221; as Jesse Vincent <a href="https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/#:~:text=I%27m%20still%20primarily%20using%20Claude,Code">noted</a> - it reduces the tendency of the AI to go off-script or introduce patterns we don&#8217;t want.</p><p>Even without a fancy rules file, you can <strong>set the tone with custom instructions or system prompts</strong>. GitHub Copilot and Cursor both introduced features to let you configure the AI&#8217;s behavior <a href="https://benjamincongdon.me/blog/2025/02/02/How-I-Use-AI-Early-2025/#:~:text=stuck,my%20company%E2%80%99s%20%2F%20team%E2%80%99s%20codebase">globally</a> for your project. I&#8217;ve taken advantage of that by writing a short paragraph about our coding style, e.g. &#8220;Use 4 spaces indent, avoid arrow functions in React, prefer descriptive variable names, code should pass ESLint.&#8221; With those instructions in place, the AI&#8217;s suggestions adhere much more closely to what a human teammate might write. Ben Congdon <a href="https://benjamincongdon.me/blog/2025/02/02/How-I-Use-AI-Early-2025/#:~:text=roughly%20on%20par,get%20past%20a%20logical%20impasse">mentioned</a> how shocked he was that few people use <strong>Copilot&#8217;s custom instructions</strong>, given how effective they are - he could guide the AI to output code matching his team&#8217;s idioms by providing some examples and preferences upfront. I echo that: take the time to teach the AI your expectations.</p><p>Another powerful technique is providing <strong>in-line examples</strong> of the output format or approach you want. If I want the AI to write a function in a very specific way, I might first show it a similar function already in the codebase: &#8220;Here&#8217;s how we implemented X, use a similar approach for Y.&#8221; If I want a certain commenting style, I might write a comment myself and ask the AI to continue in that style. Essentially, <em>prime</em> the model with the pattern to follow. LLMs are great at mimicry - show them one or two examples and they&#8217;ll continue in that vein.</p><p>The community has also come up with creative &#8220;rulesets&#8221; to tame LLM behavior. You might have heard of the <a href="https://harper.blog/2025/04/17/an-llm-codegen-heros-journey/#:~:text=repository,it%20in%20a%20few%20steps">&#8220;Big Daddy&#8221; rule</a> or adding a &#8220;no hallucination/no deception&#8221; clause to prompts. These are basically tricks to remind the AI to be truthful and not overly fabricate code that doesn&#8217;t exist. For example, I sometimes prepend a prompt with: &#8220;If you are unsure about something or the codebase context is missing, ask for clarification rather than making up an answer.&#8221; This reduces hallucinations. Another rule I use is: &#8220;Always explain your reasoning briefly in comments when fixing a bug.&#8221; This way, when the AI generates a fix, it will also leave a comment like &#8220;// Fixed: Changed X to Y to prevent Z (as per spec).&#8221; That&#8217;s super useful for later review.</p><p>In summary, <strong>don&#8217;t treat the AI as a black box - tune it</strong>. By configuring system instructions, sharing project docs, or writing down explicit rules, you turn the AI into a more specialized developer on your team. It&#8217;s akin to onboarding a new hire: you&#8217;d give them the style guide and some starter tips, right? Do the same for your AI pair programmer. The return on investment is huge: you get outputs that need less tweaking and integrate more smoothly with your codebase.</p><h2>Embrace testing and automation as force multipliers</h2><p><strong>Use your CI/CD, linters, and code review bots - AI will work best in an environment that catches mistakes automatically.</strong> </p><p>This is a corollary to staying in the loop and providing context: a well-oiled development pipeline enhances AI productivity. I ensure that any repository where I use heavy AI coding has a robust <strong>continuous integration setup</strong>. That means automated tests run on every commit or PR, code style checks (like ESLint, Prettier, etc.) are enforced, and ideally a staging deployment is available for any new branch. Why? Because I can let the AI trigger these and evaluate the results. For instance, if the AI opens a pull request via a tool like Jules or GitHub Copilot Agent, our CI will run tests and report failures. I can feed those failure logs back to the AI: &#8220;The integration tests failed with XYZ, let&#8217;s debug this.&#8221; It turns bug-fixing into a collaborative loop with quick feedback, which AIs handle quite well (they&#8217;ll suggest a fix, we run CI again, and iterate).</p><p>Automated code quality checks (linters, type checkers) also guide the AI. I actually include linter output in the prompt sometimes. If the AI writes code that doesn&#8217;t pass our linter, I&#8217;ll copy the linter errors into the chat and say &#8220;please address these issues.&#8221; The model then knows exactly what to do. It&#8217;s like having a strict teacher looking over the AI&#8217;s shoulder. In my experience, once the AI is aware of a tool&#8217;s output (like a failing test or a lint warning), it will try very hard to correct it - after all, it &#8220;wants&#8221; to produce the right answer. This ties back to providing context: give the AI the results of its actions in the environment (test failures, etc.) and it will learn from them.</p><p>AI coding agents themselves are increasingly incorporating automation hooks. Some agents will refuse to say a code task is &#8220;done&#8221; until all tests pass, which is exactly the diligence you want. Code review bots (AI or otherwise) act as another filter - I treat their feedback as additional prompts for improvement. For example, if CodeRabbit or another reviewer comments &#8220;This function is doing X which is not ideal&#8221; I will ask the AI, &#8220;Can you refactor based on this feedback?&#8221;</p><p>By combining AI with automation, you start to get a virtuous cycle. The AI writes code, the automated tools catch issues, the AI fixes them, and so forth, with you overseeing the high-level direction. It feels like having an extremely fast junior dev whose work is instantly checked by a tireless QA engineer. But remember, <em>you</em> set up that environment. If your project lacks tests or any automated checks, the AI&#8217;s work may slip through with subtle bugs or poor quality until much later. </p><p>So as we head into 2026, one of my goals is to bolster the quality gates around AI code contribution: more tests, more monitoring, perhaps even AI-on-AI code reviews. It might sound paradoxical (AIs reviewing AIs), but I&#8217;ve seen it catch things one model missed. Bottom line: <strong>an AI-friendly workflow is one with strong automation - use those tools to keep the AI honest</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T25F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T25F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 424w, https://substackcdn.com/image/fetch/$s_!T25F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 848w, https://substackcdn.com/image/fetch/$s_!T25F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!T25F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T25F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png" width="1456" height="811" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:811,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2234413,&quot;alt&quot;:&quot;&quot;,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.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_!T25F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 424w, https://substackcdn.com/image/fetch/$s_!T25F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 848w, https://substackcdn.com/image/fetch/$s_!T25F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!T25F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01a7a816-646f-4723-a44e-7177e2dbc2ae_1882x1048.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Continuously learn and adapt (AI amplifies your skills)</h2><p><strong>Treat every AI coding session as a learning opportunity - the more you know, the more the AI can help you, creating a virtuous cycle.</strong></p><p>One of the most exciting aspects of using LLMs in development is how much <em>I</em> have learned in the process. Rather than replacing my need to know things, AIs have actually exposed me to new languages, frameworks, and techniques I might not have tried on my own.</p><p>This pattern holds generally: if you come to the table with solid software engineering fundamentals, the AI will <strong>amplify</strong> your productivity multifold. If you lack that foundation, the AI might just amplify confusion. Seasoned devs have observed that LLMs &#8220;reward existing best practices&#8221; - things like writing clear specs, having good tests, doing code reviews, etc., all become even more powerful when an AI is involved. In my experience, the AI lets me operate at a higher level of abstraction (focusing on design, interface, architecture) while it churns out the boilerplate, but I need to <em>have</em> those high-level skills first. As Simon Willison notes, almost everything that makes someone a <strong>senior engineer</strong> (designing systems, managing complexity, knowing what to automate vs hand-code) is what now yields the best outcomes with AI. So using AIs has actually pushed me to <strong>up my engineering game</strong> - I&#8217;m more rigorous about planning and more conscious of architecture, because I&#8217;m effectively &#8220;managing&#8221; a very fast but somewhat na&#239;ve coder (the AI).</p><p>For those worried that using AI might degrade their abilities: I&#8217;d argue the opposite, if done right. By reviewing AI code, I&#8217;ve been exposed to new idioms and solutions. By debugging AI mistakes, I&#8217;ve deepened my understanding of the language and problem domain. I often ask the AI to explain its code or the rationale behind a fix - kind of like constantly interviewing a candidate about their code - and I pick up insights from its answers. I also use AI as a research assistant: if I&#8217;m not sure about a library or approach, I&#8217;ll ask it to enumerate options or compare trade-offs. It&#8217;s like having an encyclopedic mentor on call. All of this has made me a more knowledgeable programmer.</p><p>The big picture is that <strong>AI tools amplify your expertise</strong>. Going into 2026, I&#8217;m not afraid of them &#8220;taking my job&#8221; - I&#8217;m excited that they free me from drudgery and allow me to spend more time on creative and complex aspects of software engineering. But I&#8217;m also aware that for those without a solid base, AI can lead to Dunning-Kruger on steroids (it may <em>seem</em> like you built something great, until it falls apart). So my advice: continue honing your craft, and use the AI to accelerate that process. Be intentional about periodically coding without AI too, to keep your raw skills sharp. In the end, the developer + AI duo is far more powerful than either alone, and the <em>developer</em> half of that duo has to hold up their end.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1K_1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1K_1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 424w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 848w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1K_1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:427794,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.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_!1K_1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 424w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 848w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!1K_1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6831a588-c75e-4992-9813-84dee28de46d_1876x1054.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>Conclusion</h2><p>As we enter 2026, I&#8217;ve fully embraced AI in my development workflow - but in a considered, expert-driven way. My approach is essentially <strong>&#8220;AI-augmented software engineering&#8221;</strong> rather than AI-automated software engineering.</p><p>I&#8217;ve learned: <strong>the best results come when you apply classic software engineering discipline to your AI collaborations</strong>. It turns out all our hard-earned practices - design before coding, write tests, use version control, maintain standards - not only still apply, but are even more important when an AI is writing half your code.</p><p>I&#8217;m excited for what&#8217;s next. The tools keep improving and my workflow will surely evolve alongside them. Perhaps fully autonomous &#8220;AI dev interns&#8221; will tackle more grunt work while we focus on higher-level tasks. Perhaps new paradigms of debugging and code exploration will emerge. No matter what, I plan to stay <em>in the loop</em> - guiding the AIs, learning from them, and amplifying my productivity responsibly.</p><p>The bottom line for me: <strong>AI coding assistants are incredible force multipliers, but the human engineer remains the director of the show.</strong></p><p>With that&#8230;happy building in 2026! &#128640;</p><p><em>I&#8217;m excited to share I&#8217;ve released a new <a href="https://beyond.addy.ie/">AI-assisted engineering book</a> with O&#8217;Reilly. There are a number of free tips on the book site in case interested.</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_!ukkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ukkU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ukkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2203490,&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://addyo.substack.com/i/181957927?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.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_!ukkU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!ukkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc5ca0ef-614c-42e0-85f3-3663e9871580_7838x7838.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></p>]]></content:encoded></item><item><title><![CDATA[21 Lessons from 14 Years at Google]]></title><description><![CDATA[On code, careers, and the human side of engineering]]></description><link>https://addyo.substack.com/p/21-lessons-from-14-years-at-google</link><guid isPermaLink="false">https://addyo.substack.com/p/21-lessons-from-14-years-at-google</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Thu, 04 Dec 2025 15:30:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-kh4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I joined Google ~14 years ago, I thought the job was about writing great code. I was partly right. But the longer I&#8217;ve stayed, the more I&#8217;ve realized that the engineers who thrive aren&#8217;t necessarily the best programmers - they&#8217;re the ones who&#8217;ve figured out how to navigate everything around the code: the people, the politics, the alignment, the ambiguity.</p><p>These lessons are what I wish I&#8217;d known earlier. Some would have saved me months of frustration. Others took years to fully understand. None of them are about specific technologies - those change too fast to matter. They&#8217;re about the patterns that keep showing up, project after project, team after team.</p><p>I&#8217;m sharing them because I&#8217;ve benefited enormously from engineers who did the same for me. Consider this my attempt to pay it forward.</p><h2>1. The best engineers are obsessed with solving user problems.</h2><p>It&#8217;s seductive to fall in love with a technology and go looking for places to apply it. I&#8217;ve done it. Everyone has. But the engineers who create the most value work backwards: they become obsessed with understanding user problems deeply, and let solutions emerge from that understanding.</p><p>User obsession means spending time in support tickets, talking to users, watching users struggle, asking &#8220;why&#8221; until you hit bedrock. The engineer who truly understands the problem often finds that the elegant solution is simpler than anyone expected.</p><p>The engineer who starts with a solution tends to build complexity in search of a justification.</p><h2>2. Being right is cheap. Getting to right together is the real work.</h2><p>You can win every technical argument and lose the project. I&#8217;ve watched brilliant engineers accrue silent resentment by always being the smartest person in the room. The cost shows up later as &#8220;mysterious execution issues&#8221; and &#8220;strange resistance.&#8221;</p><p>The skill isn&#8217;t being right. It&#8217;s entering discussions to align on the problem, creating space for others, and remaining skeptical of your own certainty.</p><p>Strong opinions, weakly held - not because you lack conviction, but because decisions made under uncertainty shouldn&#8217;t be welded to identity.</p><h2>3. Bias towards action. Ship. You can edit a bad page, but you can&#8217;t edit a blank one.</h2><p>The quest for perfection is paralyzing. I&#8217;ve watched engineers spend weeks debating the ideal architecture for something they&#8217;ve never built. The perfect solution rarely emerges from thought alone - it emerges from contact with reality. AI can in many ways help here.</p><p>First do it, then do it right, then do it better. Get the ugly prototype in front of users. Write the messy first draft of the design doc. Ship the MVP that embarrasses you slightly. You&#8217;ll learn more from one week of real feedback than a month of theoretical debate.</p><p>Momentum creates clarity. Analysis paralysis creates nothing.</p><h2>4. Clarity is seniority. Cleverness is overhead.</h2><p>The instinct to write clever code is almost universal among engineers. It feels like proof of competence. </p><p>But software engineering is what happens when you add time and other programmers. In that environment, clarity isn&#8217;t a style preference - it&#8217;s operational risk reduction.</p><p>Your code is a strategy memo to strangers who will maintain it at 2am during an outage. Optimize for their comprehension, not your elegance. The senior engineers I respect most have learned to trade cleverness for clarity, every time.</p><h2>5. Novelty is a loan you repay in outages, hiring, and cognitive overhead.</h2><p>Treat your technology choices like an organization with a small &#8220;innovation token&#8221; budget. Spend one each time you adopt something materially non-standard. You can&#8217;t afford many.</p><p>The punchline isn&#8217;t &#8220;never innovate.&#8221; It&#8217;s &#8220;innovate only where you&#8217;re uniquely paid to innovate.&#8221; Everything else should default to boring, because boring has known failure modes. </p><p>The &#8220;best tool for the job&#8221; is often the &#8220;least-worst tool across many jobs&#8221;-because operating a zoo becomes the real tax.</p><div><hr></div><h2>6. Your code doesn&#8217;t advocate for you. People do.</h2><p>Early in my career, I believed great work would speak for itself. I was wrong. Code sits silently in a repository. Your manager mentions you in a meeting, or they don&#8217;t. A peer recommends you for a project, or someone else.</p><p>In large organizations, decisions get made in meetings you&#8217;re not invited to, using summaries you didn&#8217;t write, by people who have five minutes and twelve priorities. If no one can articulate your impact when you&#8217;re not in the room, your impact is effectively optional.</p><p>This isn&#8217;t strictly about self-promotion. It&#8217;s about making the value chain legible to everyone- including yourself.</p><h2>7. The best code is the code you never had to write.</h2><p>We celebrate creation in engineering culture. Nobody gets promoted for deleting code, even though deletion often improves a system more than addition. Every line of code you don&#8217;t write is a line you never have to debug, maintain, or explain.</p><p>Before you build, exhaust the question: &#8220;What would happen if we just&#8230; didn&#8217;t?&#8221; Sometimes the answer is &#8220;nothing bad,&#8221; and that&#8217;s your solution. </p><p>The problem isn&#8217;t that engineers can&#8217;t write code or use AI to do so. It&#8217;s that we&#8217;re so good at writing it that we forget to ask whether we should.</p><div><hr></div><h2>8. At scale, even your bugs have users.</h2><p>With enough users, every observable behavior becomes a dependency - regardless of what you promised. Someone is scraping your API, automating your quirks, caching your bugs.</p><p>This creates a career-level insight: you can&#8217;t treat compatibility work as &#8220;maintenance&#8221; and new features as &#8220;real work.&#8221; Compatibility is product. </p><p>Design your deprecations as migrations with time, tooling, and empathy. Most &#8220;API design&#8221; is actually &#8220;API retirement.&#8221;</p><h2>9. Most &#8220;slow&#8221; teams are actually misaligned teams.</h2><p>When a project drags, the instinct is to blame execution: people aren&#8217;t working hard enough, the technology is wrong, there aren&#8217;t enough engineers. Usually none of that is the real problem.</p><p>In large companies, teams are your unit of concurrency, but coordination costs grow geometrically as teams multiply. Most slowness is actually alignment failure - people building the wrong things, or the right things in incompatible ways. </p><p>Senior engineers spend more time clarifying direction, interfaces, and priorities than &#8220;writing code faster&#8221; because that&#8217;s where the actual bottleneck lives.</p><h2>10. Focus on what you can control. Ignore what you can&#8217;t.</h2><p>In a large company, countless variables are outside your control - organizational changes, management decisions, market shifts, product pivots. Dwelling on these creates anxiety without agency.</p><p>The engineers who stay sane and effective zero in on their sphere of influence. You can&#8217;t control whether a reorg happens. You can control the quality of your work, how you respond, and what you learn. When faced with uncertainty, break problems into pieces and identify the specific actions available to you. </p><p>This isn&#8217;t passive acceptance but it is strategic focus. Energy spent on what you can&#8217;t change is energy stolen from what you can.</p><h2>11. Abstractions don&#8217;t remove complexity. They move it to the day you&#8217;re on call.</h2><p>Every abstraction is a bet that you won&#8217;t need to understand what&#8217;s underneath. Sometimes you win that bet. But something always leaks, and when it does, you need to know what you&#8217;re standing on.</p><p>Senior engineers keep learning &#8220;lower level&#8221; things even as stacks get higher. Not out of nostalgia, but out of respect for the moment when the abstraction fails and you&#8217;re alone with the system at 3am. Use your stack. </p><p>But keep a working model of its underlying failure modes.</p><h2>12. Writing forces clarity. The fastest way to learn something better is to try teaching it.</h2><p>Writing forces clarity. When I explain a concept to others - in a doc, a talk, a code review comment, even just chatting with AI - I discover the gaps in my own understanding. The act of making something legible to someone else makes it more legible to me.</p><p>This doesn&#8217;t mean that you&#8217;re going to learn how to be a surgeon by teaching it, but the premise still holds largely true in the software engineering domain.</p><p>This isn&#8217;t just about being generous with knowledge. It&#8217;s a selfish learning hack. If you think you understand something, try to explain it simply. The places where you stumble are the places where your understanding is shallow. </p><p>Teaching is debugging your own mental models.</p><h2>13. The work that makes other work possible is priceless - and invisible.</h2><p>Glue work - documentation, onboarding, cross-team coordination, process improvement - is vital. But if you do it unconsciously, it can stall your technical trajectory and burn you out. The trap is doing it as &#8220;helpfulness&#8221; rather than treating it as deliberate, bounded, visible impact.</p><p>Timebox it. Rotate it. Turn it into artifacts: docs, templates, automation. And make it legible as impact, not as personality trait. </p><p>Priceless and invisible is a dangerous combination for your career.</p><h2>14. If you win every debate, you&#8217;re probably accumulating silent resistance.</h2><p>I&#8217;ve learned to be suspicious of my own certainty. When I &#8220;win&#8221; too easily, something is usually wrong. People stop fighting you not because you&#8217;ve convinced them, but because they&#8217;ve given up trying - and they&#8217;ll express that disagreement in execution, not meetings.</p><p>Real alignment takes longer. You have to actually understand other perspectives, incorporate feedback, and sometimes change your mind publicly. </p><p>The short-term feeling of being right is worth much less than the long-term reality of building things with willing collaborators.</p><h2>15. When a measure becomes a target, it stops measuring.</h2><p>Every metric you expose to management will eventually be gamed. Not through malice, but because humans optimize for what&#8217;s measured. </p><p>If you track lines of code, you&#8217;ll get more lines. If you track velocity, you&#8217;ll get inflated estimates.  </p><p>The senior move: respond to every metric request with a pair. One for speed. One for quality or risk. Then insist on interpreting trends, not worshiping thresholds. The goal is insight, not surveillance.</p><h2>16. Admitting what you don&#8217;t know creates more safety than pretending you do.</h2><p>Senior engineers who say &#8220;I don&#8217;t know&#8221; aren&#8217;t showing weakness - they&#8217;re creating permission. When a leader admits uncertainty, it signals that the room is safe for others to do the same. The alternative is a culture where everyone pretends to understand and problems stay hidden until they explode.</p><p>I&#8217;ve seen teams where the most senior person never admitted confusion, and I&#8217;ve seen the damage. Questions don&#8217;t get asked. Assumptions don&#8217;t get challenged. Junior engineers stay silent because they assume everyone else gets it. </p><p>Model curiosity, and you get a team that actually learns.</p><h2>17. Your network outlasts every job you&#8217;ll ever have.</h2><p>Early in my career, I focused on the work and neglected networking. In hindsight, this was a mistake. Colleagues who invested in relationships - inside and outside the company - reaped benefits for decades. </p><p>They heard about opportunities first, could build bridges faster, got recommended for roles, and co-founded ventures with people they&#8217;d built trust with over years.</p><p>Your job isn&#8217;t forever, but your network is. Approach it with curiosity and generosity, not transactional hustle. </p><p>When the time comes to move on, it&#8217;s often relationships that open the door.</p><h2>18. Most performance wins come from removing work, not adding cleverness.</h2><p>When systems get slow, the instinct is to add: caching layers, parallel processing, smarter algorithms. Sometimes that&#8217;s right. But I&#8217;ve seen more performance wins from asking &#8220;what are we computing that we don&#8217;t need?&#8221;</p><p>Deleting unnecessary work is almost always more impactful than doing necessary work faster. The fastest code is code that never runs. </p><p>Before you optimize, question whether the work should exist at all.</p><h2>19. Process exists to reduce uncertainty, not to create paper trails.</h2><p>The best process makes coordination easier and failures cheaper. The worst process is bureaucratic theater - it exists not to help but to assign blame when things go wrong.</p><p>If you can&#8217;t explain how a process reduces risk or increases clarity, it&#8217;s probably just overhead. </p><p>And if people are spending more time documenting their work than doing it, something has gone deeply wrong.</p><h2>20. Eventually, time becomes worth more than money. Act accordingly.</h2><p>Early in your career, you trade time for money - and that&#8217;s fine. But at some point, the calculus inverts. You start to realize that time is the non-renewable resource.</p><p>I&#8217;ve watched senior engineers burn out chasing the next promo level, optimizing for a few more percentage points of compensation. Some of them got it. Most of them wondered, afterward, if it was worth what they gave up.</p><p>The answer isn&#8217;t &#8220;don&#8217;t work hard.&#8221; It&#8217;s &#8220;know what you&#8217;re trading, and make the trade deliberately.&#8221;</p><h2>21. There are no shortcuts, but there is compounding.</h2><p>Expertise comes from deliberate practice - pushing slightly beyond your current skill, reflecting, repeating. For years. There&#8217;s no condensed version.</p><p>But here&#8217;s the hopeful part: learning compounds when it creates new options, not just new trivia. Write - not for engagement, but for clarity. Build reusable primitives. Collect scar tissue into playbooks.</p><p>The engineer who treats their career as compound interest, not lottery tickets, tends to end up much further ahead.</p><h2>A final thought</h2><p>Twenty-one lessons sounds like a lot, but they really come down to a few core ideas: stay curious, stay humble, and remember that the work is always about people - the users you&#8217;re building for and the teammates you&#8217;re building with.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-JAK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-JAK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-JAK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg" width="360" height="360.24725274725273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:360,&quot;bytes&quot;:4066966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/180675155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-JAK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-JAK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ff24d22-2b08-4900-b733-bb857e7e4459_2736x2737.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A career in engineering is long enough to make plenty of mistakes and still come out ahead. The engineers I admire most aren&#8217;t the ones who got everything right - they&#8217;re the ones who learned from what went wrong, shared what they discovered, and kept showing up.</p><p>If you&#8217;re early in your journey, know that it gets richer with time. If you&#8217;re deep into it, I hope some of these resonate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-kh4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-kh4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-kh4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1216515,&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://addyo.substack.com/i/180675155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.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_!-kh4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 424w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 848w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.png 1272w, https://substackcdn.com/image/fetch/$s_!-kh4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746cd1ff-8111-4f8f-b7f9-84db223f998f_7838x7838.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Treat AI-Generated code as a draft]]></title><description><![CDATA[Keep human eyes, judgment, and ownership at the center of AI written code]]></description><link>https://addyo.substack.com/p/treat-ai-generated-code-as-a-draft</link><guid isPermaLink="false">https://addyo.substack.com/p/treat-ai-generated-code-as-a-draft</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Tue, 25 Nov 2025 16:43:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!esjQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>tl;dr:</strong> <strong>Treat AI-generated code as a draft. It can write the first version, but never outsource the reading.</strong> No human review means no reliable trace from behavior back to intent. When you stop reviewing AI drafts, you stop knowing why the code works at all. Practically, hold AI-written code to the same standards as human team mates.</p><h2><strong>Never outsource the reading - always review AI&#8217;s first draft</strong></h2><p><strong>AI can write a first version of code, but </strong><em><strong>humans must do the reading and reviewing</strong></em><strong> to ensure intent and quality.</strong> </p><p>If you stop reviewing AI-generated drafts, you stop knowing why the code works (or if it truly does) &#8211; there&#8217;s no reliable trace from behavior back to intent. In other words, <em>LLMs don&#8217;t ship bad code, teams do</em>. When no one takes responsibility for checking AI-written code, bad code slips through not because the model failed, but because the workflow failed to demand a higher standard <a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=LLMs%20Don%E2%80%99t%20Ship%20Bad%20Code%2C,Teams%20Do">[1]</a>. </p><p>Treat the AI&#8217;s output as <strong>untrusted input</strong> &#8211; it might be syntactically correct and even pass tests, but it hasn&#8217;t earned your trust until a human verifies it. AI models often produce <em>plausible-looking but subtly flawed code</em>, including hallucinated functions or insecure patterns <a href="https://www.metacto.com/blogs/establishing-code-review-standards-for-ai-generated-code#:~:text=The%20Phantom%20Menace%20of%20%E2%80%9CHallucinated%E2%80%9D,Code">[2]</a>. So never merge code that hasn&#8217;t been read and understood by a human. As one engineer put it, blindly trusting AI output without verification risks immediate bugs <em>and</em> &#8220;systematically degrades our ability to catch these errors&#8221; because the very skills needed to validate code atrophy from disuse <a href="https://codebytom.blog/2025/07/09/the-hidden-cost-of-ai-reliance/comment-page-1/#:~:text=When%20we%20blindly%20trust%20AI,ones%20that%20atrophy%20from%20disuse">[3]</a>. </p><p>In short, always insist on a human-in-the-loop: AI can draft, but only a human can ensure the code&#8217;s behavior matches the intended purpose.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QEAT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QEAT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 424w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 848w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QEAT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:264046,&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://addyo.substack.com/i/179880341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.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_!QEAT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 424w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 848w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!QEAT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf803e1f-1e2a-4e71-b3da-3ee98dc891b6_1892x1058.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://addyo.substack.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">Elevate is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h2><strong>Blind reliance on AI erodes critical thinking and skills</strong></h2><p><strong>Engineering leaders worry that developers who blindly accept AI-generated code will lose their critical thinking abilities.</strong> </p><p>The concern isn&#8217;t hypothetical &#8211; early research bears it out. Studies have found that heavy use of AI assistants correlates with <em>lower brain engagement and reduced critical thinking performance </em><a href="https://codebytom.blog/2025/07/09/the-hidden-cost-of-ai-reliance/comment-page-1/#:~:text=Research%20consistently%20points%20to%20concerning,These">[4]</a>. In practice, developers dependent on AI may skip fundamental tasks like reading documentation or debugging errors themselves. One veteran engineer confessed that using AI&#8217;s instant answers made him &#8220;worse at his own craft.&#8221; </p><p>He stopped reading docs (&#8220;why bother when an LLM can explain it instantly?&#8221;) and even stopped analyzing errors &#8211; instead, he&#8217;d copy-paste stack traces into the AI and paste the AI&#8217;s answers back into the code. &#8220;I&#8217;ve become a human clipboard,&#8221; he lamented <a href="https://codebytom.blog/2025/07/09/the-hidden-cost-of-ai-reliance/comment-page-1/#:~:text=What%20does%20this%20look%20like,and%20solutions%20back%20to%20code">[5]</a>. This kind of cognitive offloading means the developer isn&#8217;t reasoning through problems anymore; the AI is doing the thinking, and the human is just transcribing. The result is not only diminished skill, but also less vigilance &#8211; if developers assume the AI is always right, they may miss subtle bugs or security issues they would have caught before. In fact, the ease and polish of AI output can lull engineers into a false sense of security, lowering their skepticism during reviews <a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=1,Skepticism">[6]</a>. </p><p>The irony is that AI was supposed to boost productivity, but over-reliance can make individuals <em>less</em> capable. &#8220;We&#8217;re not becoming 10&#215; developers with AI, we&#8217;re becoming 10&#215; dependent on AI,&#8221; as one author observed &#8211; trading long-term understanding for short-term speed <a href="https://codebytom.blog/2025/07/09/the-hidden-cost-of-ai-reliance/comment-page-1/#:~:text=When%20we%20consistently%20choose%20the,that%20leads%20to%20breakthrough%20innovations">[7]</a>. The takeaway: to maintain your engineering sharpness, you must stay intellectually engaged with the code. Use AI as a tool, not a crutch &#8211; always challenge and verify its solutions rather than accepting them blindly.</p><h2><strong>Skipping the learning process in favor of speed hurts growth</strong></h2><p><strong>Many teams have leapt straight into using AI for speed, bypassing the learning and understanding that should accompany its use.</strong> </p><p>The promise of AI coding tools is high velocity &#8211; <em>generate, generate, generate</em> &#8211; but this often comes at the expense of developers truly grasping what they&#8217;re building. When you rely on AI to write code you don&#8217;t fully understand, you are <em>skipping the essential learning process</em> that makes you a better engineer <a href="https://matthewmartin.dev/posts/20250202-dont-outsource-what-you-dont-understand/#:~:text=Worse%20still%2C%20is%20that%20this,because%20you%20use%20AI%20without">[8]</a>. </p><p>The mistakes, trial-and-error, and research that traditionally accompany coding aren&#8217;t just hurdles &#8211; they are the training ground where critical skills develop. By outsourcing the heavy lifting to AI, junior devs in particular may never acquire the depth of knowledge to assess or improve the code being produced. </p><p>This creates a vicious cycle: <em>you produce poor code because you use AI without experience, and you never gain experience because you keep using AI</em><a href="https://matthewmartin.dev/posts/20250202-dont-outsource-what-you-dont-understand/#:~:text=Worse%20still%2C%20is%20that%20this,because%20you%20use%20AI%20without">[8]</a>. As one commentator bluntly asked, <em>if your role is reduced to just prompting AI for code you don&#8217;t understand, what value are you adding?</em><a href="https://matthewmartin.dev/posts/20250202-dont-outsource-what-you-dont-understand/#:~:text=The%20mistakes%2C%20the%20trial%20and,value%20are%20you%20really%20adding">[9]</a>.</p><p>We&#8217;ve largely skipped the phase where AI could be used as a learning aid or tutor, and jumped straight to using it as an auto-coder for output. Ideally, developers would use AI to <strong>improve understanding</strong> &#8211; for example, asking an AI to explain a tricky piece of code, or to suggest why a solution works &#8211; and even do a local &#8220;self review&#8221; with the AI before handing code to others. But in practice, many are just hitting &#8220;accept&#8221; on suggestions and moving on. This means they might deliver a feature faster, but with only shallow knowledge of how it works or why certain patterns were used. </p><p>Over time, that lack of understanding accumulates into a serious skill gap. Senior engineers worry about newcomers who can pump out code with AI assistance yet struggle to debug or extend it, because they never <em>learned</em> the underlying concepts. Indeed, engineering leaders report that while juniors now ship features faster than ever, when something breaks &#8220;they struggle to debug code they don&#8217;t understand&#8221; <a href="https://www.softwareseni.com/why-ai-coding-speed-gains-disappear-in-code-reviews/#:~:text=AI,debug%20code%20they%20don%E2%80%99t%20understand">[10]</a>. </p><p>The craft of software engineering is about far more than producing code that <em>runs</em> &#8211; it&#8217;s about knowing <em>why</em> the code is written that way, and how to evolve it. If we sidestep that journey, we risk creating a generation of programmers who can only operate with an AI on autopilot. To counteract this, treat AI output as an opportunity to learn: don&#8217;t just copy-paste answers, <strong>read them, question them, and ensure you could explain them</strong> to a colleague. Use AI to accelerate your work, not bypass your growth as an engineer <a href="https://matthewmartin.dev/posts/20250202-dont-outsource-what-you-dont-understand/#:~:text=Worse%20still%2C%20is%20that%20this,because%20you%20use%20AI%20without">[11]</a><a href="https://matthewmartin.dev/posts/20250202-dont-outsource-what-you-dont-understand/#:~:text=The%20mistakes%2C%20the%20trial%20and,AI%20for%20code%20you%20don%E2%80%99t">[12]</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z54T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z54T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 424w, https://substackcdn.com/image/fetch/$s_!z54T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 848w, https://substackcdn.com/image/fetch/$s_!z54T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!z54T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z54T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:779761,&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://addyo.substack.com/i/179880341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.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_!z54T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 424w, https://substackcdn.com/image/fetch/$s_!z54T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 848w, https://substackcdn.com/image/fetch/$s_!z54T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!z54T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb041a203-0570-4199-b680-9d464a63ab3f_1824x1020.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>I&#8217;ve heard of seniors sending back PRs where its clear AI was used but the person didn&#8217;t understand what they were doing. When a junior submits an AI-generated PR, the review becomes the primary venue for mentorship. Ask Socratic questions that force them to explain the AI&#8217;s output. This ensures understanding, not just functionality. Reviews become about comprehension, not just correctness.</em></p><h2><strong>Code reviews are straining under AI-generated code</strong></h2><p><strong>Traditional code review practices are struggling to cope with AI-generated code, leaving teams unsure how to maintain quality.</strong> </p><p>Code reviews have always been the safety net for catching errors and ensuring code quality. But AI assistance changes the game: AI can produce <em>much larger diffs</em> in an instant, often touching many lines or files, which means reviewers face more volume and potentially more complexity in each pull request. In fact, studies found that pull requests heavy with Copilot-generated code take about <strong>26% longer to review on average</strong>, because reviewers must untangle unfamiliar patterns and double-check for AI-specific mistakes <a href="https://thenewstack.io/how-to-measure-the-roi-of-ai-coding-assistants/">[13]</a>. </p><p>Reviewers also report a psychological effect: when examining code they didn&#8217;t write, especially if it&#8217;s syntactically polished, their confidence drops &#8211; they take longer to validate logic and may second-guess their understanding <a href="https://www.softwareseni.com/why-ai-coding-speed-gains-disappear-in-code-reviews/#:~:text=requests%2C%20unfamiliar%20code%20patterns%2C%20and,take%20longer%20to%20validate%20logic">[14]</a>. AI can churn out code that <em>looks</em> clean and modern (consistent naming, proper formatting) which can lower reviewers&#8217; skepticism <a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=1,Skepticism">[6]</a>. It&#8217;s easy to assume the code is sound if it &#8220;looks professional,&#8221; making it more likely that subtle bugs or design flaws slip through.</p><p>Another complication is <strong>lost intent</strong>. In a traditional review, the reviewer can discuss &#8220;what the author meant to do&#8221; &#8211; there&#8217;s a human intention to compare against the implementation. With AI-generated code, the code&#8217;s author might not fully grasp the intent behind every line, because they didn&#8217;t <em>write</em> it in the conventional sense. The original prompt given to the AI is essentially the spec, but reviewers often don&#8217;t see that prompt <a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=2,the%20Prompt%20Asked%20For">[15]</a>. This means a reviewer is left guessing at the requirements and whether the AI&#8217;s solution actually meets them, rather than just reviewing whether the code works. </p><p>As one report noted, <em>reviewers are no longer assessing what the developer meant to do, but rather what the model actually did </em><a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=functionally%20equivalent%20to%20writing%20a,inputs%2C%20implicit%20assumptions%2C%20or%20insecure">[16]</a>. Traditional code review checklists (focused on style, obvious logic errors, etc.) aren&#8217;t enough, because AI code can fail in non-traditional ways &#8211; e.g. using an outdated algorithm that a junior dev wouldn&#8217;t know, or introducing an edge-case bug that isn&#8217;t immediately obvious.</p><p>Teams are also encountering <strong>review overload</strong>. An AI pair programmer can generate code faster than a human, which means a single developer can open very large pull requests or many pull requests in short time. This &#8220;velocity&#8221; can overwhelm the team&#8217;s capacity to give thorough reviews. It&#8217;s akin to slop in code form &#8211; flooding the reviewer with so much output that it&#8217;s hard to pinpoint the issues <a href="https://www.reddit.com/r/SoftwareEngineering/comments/1kjwiso/maintaining_code_quality_with_widespread_ai/#:~:text=The%20code%20lacks%20clear%20architecture%3F,Suggest%20refactoring">[17]</a>. In such cases, some organizations have instituted new policies: for example, if a PR is more than 30% AI-generated (by lines or content), it might trigger a required extra level of review or a more senior reviewer <a href="https://www.softwareseni.com/why-ai-coding-speed-gains-disappear-in-code-reviews/#:~:text=Harness%E2%80%99s%20engineering%20teams%20report%20that,pattern%20usage%20and%20architectural%20misalignment">[18]</a>. </p><p>The idea is to acknowledge that AI-heavy code needs <em>different</em> scrutiny levels, not business-as-usual. Another emerging practice is labeling AI contributions: explicitly marking in the pull request or commit message that &#8220;this code was assisted by AI.&#8221; This can cue reviewers to be extra vigilant. Indeed, experts recommend <strong>tagging and tracking AI-generated code</strong> for accountability &#8211; it helps reviewers know what to look for and helps teams trace bugs later (&#8220;was this bug from AI-written code?&#8221;)<a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=4,Contributions">[19]</a>.</p><p>However, openly tagging AI involvement comes with a cultural challenge: developers must feel <strong>psychologically safe</strong> to disclose AI usage. If people fear judgment for using AI (&#8220;will my team think I&#8217;m lazy or less competent?&#8221;), they may hide it &#8211; and that&#8217;s worse for the team. Hidden AI usage means the team doesn&#8217;t know where potential risk lies and can&#8217;t adjust their reviews accordingly <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=">[20]</a>. To counter this, forward-thinking teams encourage transparency without stigma. </p><p>Using AI should be treated like using any tool &#8211; it&#8217;s fine to use it, but you must own the output. As one guide put it, <em>never blame the AI for bugs</em> or quality issues; the engineer who committed the code owns it, period <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=What%20developers%20must%20do%3A">[21]</a>. If everyone embraces that mindset, then saying &#8220;I used Cursor to help with this module&#8221; is simply a factual statement, not an admission of guilt. It allows the team to collectively ensure the AI-generated sections get proper attention. </p><p>Right now, our code review tools and norms are still catching up to these needs. We don&#8217;t yet have widespread automated detectors for AI code in PRs, and most diff viewers don&#8217;t show the AI&#8217;s prompt or reasoning. So, we need to rely on process and team agreements to fill the gap &#8211; explicitly calling out AI-written code, reviewing tests more rigorously, and possibly setting size limits to what we&#8217;ll accept from an AI without breakpoints for human review. </p><p><strong>If questionable code is making it past PR unchallenged, the issue is not just AI &#8211; it&#8217;s that the review process isn&#8217;t robust enough</strong> to catch these problems <a href="https://www.reddit.com/r/SoftwareEngineering/comments/1kjwiso/maintaining_code_quality_with_widespread_ai/#:~:text=darknessgp">[22]</a>. It&#8217;s a call to action that code review practices must evolve alongside AI adoption.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7oR8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7oR8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 424w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 848w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7oR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png&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;:460018,&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://addyo.substack.com/i/179880341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.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_!7oR8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 424w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 848w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.png 1272w, https://substackcdn.com/image/fetch/$s_!7oR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd72ae4b8-4580-4898-98c4-a9ba25b5d2a0_1824x1026.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>66% of developers in a <a href="https://survey.stackoverflow.co/2025">Stack Overflow survey</a> said the most common frustration with AI assistants is that the code is &#8220;almost right, but not quite. 45% of developers in the Stack Overflow survey reported that time spent debugging AI-generated code was their biggest time sink. Quality gates and validation are now the critical path</em></p><h2><strong>Best practices: treating AI-generated code as a draft</strong></h2><p>To use AI coding tools effectively, we must adjust our habits and processes. Think of AI output as a <em>first draft from a junior developer</em> &#8211; valuable, but in need of careful review and refinement. Here are some pragmatic best practices to ensure that AI-generated code boosts productivity <em>without</em> sacrificing quality or understanding:</p><ul><li><p><strong>Never merge code you don&#8217;t understand.</strong> If an AI helped produce some code, the onus is on <em>you</em> (the developer) to read every line and make sure you get it. You should be able to explain what the code does and why. If there&#8217;s any part of the AI-generated snippet that you can&#8217;t follow, treat that as a red flag &#8211; either refine the prompt, have the AI explain it, or rewrite that part yourself. Some open-source projects explicitly require that contributors <em>certify they understand the code they submit</em>, even if AI wrote it. In professional settings, the same principle applies: take full ownership of any code you commit, regardless of who (or what) authored it<a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=What%20developers%20must%20do%3A">[21]</a>. In practice, this means <strong>running the code, writing or reviewing tests for it, and stepping through its logic</strong> before it ever hits your team&#8217;s repository.</p></li><li><p><strong>Treat AI code like an intern&#8217;s code &#8211; don&#8217;t trust, verify.</strong> AI doesn&#8217;t possess context or wisdom; it&#8217;s more like a very fast, eager junior developer. It will confidently produce a solution, but that solution might be overly simplistic, miss edge cases, or use patterns that are out of place for your codebase. As a best practice, approach AI contributions with healthy skepticism. Check boundary conditions, look for off-by-one errors, thread safety issues, or other corner cases that a less-experienced coder might overlook <a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=AI,It%20may%20work%2C%20but">[23]</a><a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=,that%20can%20not%20be%20tested">[24]</a>. Often, AI will do exactly what you asked, <em>not necessarily what you truly need</em>. So cross-verify the output against the requirements. If it&#8217;s a complex or critical piece of code, consider manually reimplementing it after seeing the AI&#8217;s draft &#8211; you might catch nuances the AI missed. Remember the mantra for AI output: <strong>&#8220;Don&#8217;t trust. Verify.&#8221; </strong><a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=Best%20practice%3A%20Don%E2%80%99t%20trust">[25]</a></p></li><li><p><strong>Use AI as a coding assistant, not an author &#8211; incorporate it into your own thinking.</strong> Instead of just asking AI to spit out code and blindly pasting it, use it in a conversational, explanatory way. For example, you can ask the AI to <em>explain</em> the code it just suggested, or to generate comments for it. You can have it suggest test cases for the code, which you then run to see if the code truly works. AI can also help by summarizing a large diff or identifying potential problem areas in a PR (some advanced code review tools now offer AI-generated summaries). All these uses keep you, the human, in the driver&#8217;s seat. You&#8217;re leveraging AI to augment your understanding, not replace it. One recommended practice is to <strong>review tests first</strong> for AI-generated changes <a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=1,Mindset%3A%20Review%20Tests%20First">[26]</a> &#8211; ensure there&#8217;s a solid test suite covering the new code. If tests are weak or missing, that&#8217;s your cue to write more before trusting the code. Also, use strict linting and static analysis on AI code: AI might not follow your team&#8217;s idioms out-of-the-box, so enforce style and architecture rules with automated tools <a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=2,Enhanced%20Linting%20Rules">[27]</a><a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=,rules%20to%20reflect%20your%20norms">[28]</a>. If the AI suggests something that doesn&#8217;t fit your usual patterns, don&#8217;t hesitate to refactor it. Essentially, make AI your <em>pair programmer</em> who writes draft code and gives ideas, but <em>you</em> still make all final edits and decisions.</p></li><li><p><strong>Thoroughly test and secure AI-generated code.</strong> It&#8217;s crucial to apply the same (or higher) level of testing to AI-written code as you would to handmade code. Write unit tests and integration tests to cover the functionality. Specifically look for edge cases and potential failure modes &#8211; AI is notorious for handling the &#8220;happy path&#8221; but ignoring unusual inputs or error handling. Also consider security: common vulnerabilities like SQL injection, XSS, insecure deserialization, etc., might slip in if the AI drew from a code example with a flaw <a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=4">[29]</a><a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=,functions">[30]</a>. Use security linters or scanners (tools like Semgrep or Bandit can catch obvious issues <a href="https://blog.bonfy.ai/code-review-in-the-age-of-ai-best-practices-for-reviewing-ai-generated-code#:~:text=">[31]</a>). If the AI generated any dependency or configuration, ensure you review those for secrets or insecure defaults. Treat the AI&#8217;s code as if you hired a contractor whose work you don&#8217;t fully trust &#8211; double-check everything, because ultimately <strong>your team is accountable for any bugs or security holes</strong>, no matter who wrote the code.</p></li><li><p><strong>Leverage AI for self-review before seeking peer review.</strong> One productive pattern is to ask the AI to critique its own output <em>before</em> you open a pull request. For example, after getting a code suggestion, you might prompt, &#8220;What potential issues do you see in this code? Any edge cases or improvements?&#8221; The AI might point out a condition you didn&#8217;t consider or a more idiomatic approach. It&#8217;s like a spell-check for logic &#8211; not infallible, but it can catch low-hanging fruit. This doesn&#8217;t replace a human review, but it can help you <strong>clean up the draft</strong> so that your peers aren&#8217;t distracted by obvious problems. Think of it as you collaborating with the AI to polish the code, then handing it to your team. This also helps you learn, as the AI&#8217;s review comments can highlight areas you need to think about. Just remember to verify any AI feedback; sometimes it might &#8220;hallucinate&#8221; problems that aren&#8217;t real, so use your judgment.</p></li><li><p><strong>If an AI-generated change is too large or confusing, break it down.</strong> Don&#8217;t let the AI&#8217;s speed force you into merging giant, monolithic changes. If Cursor spews out 500 lines of mixed modifications, it might be better to treat that as a prototype. Perhaps run the code to see if the approach works, then <em>reimplement the solution in smaller, comprehensible pieces</em>. One developer likened an initial AI-generated draft to a <strong>spike solution</strong> &#8211; a quick and dirty implementation to prove a concept<a href="https://www.reddit.com/r/SoftwareEngineering/comments/1kjwiso/maintaining_code_quality_with_widespread_ai/#:~:text=In%20my%20experience%2C%20it%20tends,as%20a%20kind%20of%20spike">[32]</a>. You wouldn&#8217;t merge a spike into production; you&#8217;d refine it. Similarly, take the AI draft and iteratively improve it: maybe split that big PR into multiple commits or pull requests that are easier to review. Often the second draft (written with the insight gained from the first) is much cleaner and more maintainable<a href="https://www.reddit.com/r/SoftwareEngineering/comments/1kjwiso/maintaining_code_quality_with_widespread_ai/#:~:text=In%20my%20experience%2C%20it%20tends,as%20a%20kind%20of%20spike">[32]</a>. This disciplined approach prevents the &#8220;gish gallop&#8221; effect where the AI dumps so much code that reviewers can&#8217;t effectively review it. By breaking it down, you ensure that each piece gets adequate human attention.</p></li><li><p><strong>Document and label AI contributions when sharing with the team.</strong> In your pull request description or code comments, it can be helpful to note which parts were generated by AI or if you relied heavily on an AI for a solution. For example: &#8220;Used Gemini/Opus/GPT to generate the initial implementation of this sorting algorithm; reviewed and modified the result.&#8221; This kind of transparency helps reviewers know where to focus. It&#8217;s not about blaming the AI or you but about <em>context</em>. In fact, marking AI-generated code with clear comments or annotations is encouraged as a way to create accountability and traceability<a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=The%20problem%3A%20When%20developers%20hide,which%20AI%20tool%20generated%20it">[33]</a>. If an odd bug appears later, the team can trace it back and see, &#8220;Oh, this chunk was AI-written based on prompt X&#8221; and that might make debugging easier. Of course, do this in a supportive culture (see next section) &#8211; the goal is to collectively safeguard quality, not to call someone out. Some teams even keep a log of AI-assisted changes for auditing purposes <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=The%20problem%3A%20When%20developers%20hide,which%20AI%20tool%20generated%20it">[33]</a>. At the very least, consider sharing the prompt you used with your reviewers, e.g. in a PR comment. That way the reviewer understands <em>what you asked for</em> and can judge if the AI&#8217;s code actually matches the intent<a href="https://asymm.com/the-new-rules-of-ai-generated-code-accountability/#:~:text=2,the%20Prompt%20Asked%20For">[15]</a>. This prompt-as-spec technique can bridge the gap between intention and implementation.</p></li></ul><p>In summary, treating AI code as a draft means <em>applying all the same rigor you would to a human novice&#8217;s code</em>: you review it deeply, test it thoroughly, and don&#8217;t assume anything is correct until proven. The AI can drastically speed up writing boilerplate and even suggest solutions, but <strong>you are the engineer</strong> &#8211; you must integrate those suggestions into the codebase responsibly.</p><h2><strong>Establish team agreements for AI-generated code</strong></h2><p><strong>To successfully integrate AI into development, teams should set clear guidelines &#8211; essentially a &#8220;contract&#8221; &#8211; on how to handle AI-generated code.</strong> This is a new frontier, and misalignment can cause friction or quality issues. A team working agreement might include rules, responsibilities, and cultural norms around AI usage. Here are some key elements teams are adopting:</p><ul><li><p><strong>Ensure accountability doesn&#8217;t lapse.</strong> Make it explicit that whoever integrates AI-generated code into the codebase is responsible for it, full stop. No pointing fingers at the AI. If a bug is introduced, it&#8217;s treated like any other bug you&#8217;d introduce. This principle, supported by industry guides, says developers must <em>take full ownership of any code they commit, regardless of who wrote it, and test AI-generated code as thoroughly as their own </em><a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=What%20developers%20must%20do%3A">[21]</a>. Management should reinforce that using AI is not an excuse for lower quality. Code reviewers and approvers also share responsibility &#8211; if you approve a change, you&#8217;re vouching for it as usual. Essentially, AI doesn&#8217;t change the definition of &#8220;code owner.&#8221;</p></li><li><p><strong>Define how and when AI should be used.</strong> As a team, discuss what types of tasks are appropriate for AI assistance. For example, you might agree that AI is great for generating unit tests, boilerplate, scaffolding, or exploring multiple approaches &#8211; but perhaps you&#8217;ll avoid using it for core complex algorithms without additional review. Some teams may forbid AI use for security-sensitive code or critical algorithms, unless a senior engineer supervises closely. Others might say it&#8217;s fine to use AI for anything as long as you follow the other rules (understand it, test it, etc.). The key is to set expectations. This also ties into <strong>ethical and legal considerations</strong> (e.g. ensuring AI output doesn&#8217;t include copied licensed code, or doesn&#8217;t introduce biases), but that&#8217;s another essay in itself. The point is, an agreed policy prevents misunderstandings like one dev merging huge AI-written chunks that others aren&#8217;t comfortable with.</p></li><li><p><strong>Emphasize transparency and psychological safety.</strong> The team contract should encourage developers to be open about AI involvement. For instance, a guideline could be: &#8220;If AI assisted significantly in a change, mention it in the PR.&#8221; Leaders must foster an environment where this admission is seen positively (as due diligence), not negatively. A lack of transparency can lead to &#8220;shadow AI&#8221; in your codebase &#8211; code that is AI-written but nobody realizes it, making debugging and maintenance harder <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=">[20]</a>. To avoid that, make transparency the norm. One practice is adding a simple comment in the code like // Code generated with AI assistance or using a tag in PRs. The team might also agree on documenting prompts in the project wiki or in the code review for future reference <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=The%20problem%3A%20When%20developers%20hide,which%20AI%20tool%20generated%20it">[33]</a>. If someone feels they don&#8217;t fully understand an AI-generated section, they should feel safe to say so and ask for help or extra review <a href="https://jellyfish.co/library/ai-in-software-development/responsibility-of-developers-generative-ai/#:~:text=The%20problem%3A%20When%20developers%20hide,which%20AI%20tool%20generated%20it">[33]</a>. It&#8217;s far better to admit &#8220;I&#8217;m not 100% confident in what Copilot produced here&#8221; than to pretend everything is fine. Psychological safety ensures people speak up, which ultimately protects the code quality and the developers&#8217; growth.</p></li><li><p><strong>Integrate AI-awareness into the review process.</strong> Teams should update their code review checklists or definitions-of-done to account for AI. For example, a review checklist might add items like &#8220;If code was AI-generated, has the author provided the prompt or described the intent?&#8221; or &#8220;For AI-generated code, double-check for common issues (edge cases, security, style consistency).&#8221; Some organizations formalize this by requiring an extra pair of eyes on AI-heavy code, as noted earlier<a href="https://www.softwareseni.com/why-ai-coding-speed-gains-disappear-in-code-reviews/#:~:text=To%20address%20this%20challenge%2C%20some,code%20requires%20different%20scrutiny%20levels">[34]</a>. Training sessions can help too &#8211; a team might do a brownbag meeting on &#8220;typical AI mistakes&#8221; so all reviewers know what to watch for (e.g. unnecessary complexity, missing null checks, etc.). The team could also adopt tools to assist, like AI-powered code analysis that flags likely problematic code patterns. Ultimately, the whole review culture may shift to treat AI contributions with a bit more rigor. As a shared rule, you might say: <em>No AI-generated code gets merged without thorough human review, no exceptions</em>. It seems obvious, but stating it sets the tone that speed will not trump quality.</p></li><li><p><strong>Support continuous learning and skill development.</strong> To address the critical thinking atrophy issue, a team agreement can explicitly encourage practices that keep skills sharp. For instance, pair programming sessions where one person doesn&#8217;t use AI and explains their thought process, or rotations on challenging bug fixes without AI. Or even simply encouraging developers to occasionally implement things &#8220;the hard way&#8221; first, before using AI to optimize. Some companies have gone as far as tracking how AI impacts debugging time and making sure employees still know how to troubleshoot without the tool<a href="https://www.softwareseni.com/why-ai-coding-speed-gains-disappear-in-code-reviews/#:~:text=AI,debug%20code%20they%20don%E2%80%99t%20understand">[10]</a>. An agreement could be: &#8220;We use AI to speed up routine tasks, but we still expect engineers to understand and be able to manually handle the complex parts.&#8221; By acknowledging this in your team principles, you validate the importance of human expertise. Leads and managers in particular should lead by example &#8211; demonstrating in code reviews that they scrutinize AI-generated code just as they would any code, asking thoughtful questions. Junior devs will take cues from that and learn that AI is not a get-out-of-thinking-free card.</p></li></ul><p>In essence, a team&#8217;s AI code agreement is about <strong>maintaining quality, clarity, and trust</strong>. Everyone should know how AI is being used and agree on the standards its output must meet. This &#8220;contract&#8221; might be a living document that evolves as you gain experience. The goal is to prevent the scenario where AI quietly degrades your codebase or your engineers&#8217; skills. Instead, with rules in place, AI can be harnessed as a powerful accelerator <em>with guardrails</em>. It forces conversations now about topics that were previously implicit (like &#8220;do you understand what you committed?&#8221;) &#8211; now we make them explicit.</p><h2><strong>Conclusion: AI is not a replacement for understanding</strong></h2><p>AI coding tools are here to stay, and they <strong>excel at generating drafts</strong> &#8211; the scaffolding, the boilerplate, even complex code that might take a human much longer to write from scratch. Embracing them can lead to huge gains in productivity and free developers from drudgery. But the moment we start treating AI-generated code as &#8220;fire-and-forget,&#8221; we undermine the very benefits we seek. </p><p>The true value of AI in software engineering comes when we pair its speed with our judgment. <strong>That means always reviewing AI output with a critical eye, staying curious about </strong><em><strong>why</strong></em><strong> the code works, and insisting on clarity and correctness.</strong> When you treat AI-generated code as a draft, you acknowledge it&#8217;s a work in progress &#8211; to be massaged and perfected by human insight.</p><p>By maintaining high standards for code quality and developer education, we ensure that AI is a tool that <strong>augments our capabilities rather than atrophying them</strong>. We keep the &#8220;why&#8221; and &#8220;how&#8221; in focus even as the &#8220;what&#8221; is delivered to us on a platter. In practical terms: don&#8217;t stop reading code. </p><p>Whether written by an intern, an AI, or a seasoned colleague, code must be understood to be trusted. If you never outsource the reading and thinking, you retain the ability to connect a code&#8217;s behavior back to the intent behind it &#8211; which is the essence of software engineering. </p><p><strong>Use AI to move faster, by all means, but </strong><em><strong>keep your hands on the wheel</strong></em><strong>.</strong> </p><p>The code that lands in production should always have a human&#8217;s eyes (and heart) behind it. That way, we get the best of both worlds: the efficiency of AI-generated first drafts and the reliability of human-reviewed, well-understood final code.</p><p><em>I&#8217;m excited to share I&#8217;ve released a new <a href="https://beyond.addy.ie/">AI-assisted engineering book</a> with O&#8217;Reilly. There are a number of free tips on the book site in case interested.</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_!esjQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!esjQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!esjQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:353186,&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://addyo.substack.com/i/179880341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.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_!esjQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!esjQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c76c36d-5242-4274-a946-99821cd84da8_1024x1024.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://addyo.substack.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">Elevate is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Critical Thinking during the age of AI]]></title><description><![CDATA[Who, what, where, when, why, how]]></description><link>https://addyo.substack.com/p/critical-thinking-during-the-age</link><guid isPermaLink="false">https://addyo.substack.com/p/critical-thinking-during-the-age</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Fri, 21 Nov 2025 15:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!54oK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In a time where AI can generate code, design ideas, and occasionally plausible answers on demand, the need for <strong>human critical thinking</strong> is greater than ever. Even the smartest automation can&#8217;t replace the ability to ask the right questions, challenge assumptions, and think independently at this time.</p><p>This essay explores the importance of critical thinking skills for software engineers and technical teams using the classic <strong>&#8220;Who, what, where, when, why, how&#8221;</strong> framework to structure pragmatic guidance. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b1bu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b1bu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b1bu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alternative text description for this image&quot;,&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="No alternative text description for this image" title="No alternative text description for this image" srcset="https://substackcdn.com/image/fetch/$s_!b1bu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b1bu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22c3b29f-fdec-4f47-8ab2-ca0804a30ed4_1536x1536.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>tl;dr: Critical thinking checklist for AI-augmented teams</strong></p><ul><li><p><strong>Who:</strong> Don&#8217;t rely on AI as an oracle. Verify its output.</p></li><li><p><strong>What:</strong> Define the <em>real</em> problem before rushing to a solution.</p></li><li><p><strong>Where:</strong> Context is king. A fix that works in a sandbox might break in production.</p></li><li><p><strong>When:</strong> Know when to use a quick heuristic (triage) vs. deep analysis (root cause).</p></li><li><p><strong>Why:</strong> Use the &#8220;5 Whys&#8221; technique to uncover underlying causes.</p></li><li><p><strong>How:</strong> Communicate with evidence and data, not just opinions.</p></li></ul><p>We&#8217;ll dive into how each of these question categories applies to decision-making in an AI-augmented world, with concrete examples and common pitfalls. The goal is to show how humble curiosity and evidence-based reasoning can keep projects on track and avoid downstream issues.</p><h2>Who: Involve the right people and perspectives</h2><p><strong>Who is involved in defining or solving the problem?</strong> In technical projects, critical thinking starts by identifying the <em>who</em>. </p><p>This means knowing who the stakeholders are (e.g. engineers, product managers, users, domain experts) and making sure the right people are engaged in decision-making. Problems in engineering for example are rarely solved in isolation &#8211; they affect users and often span multiple teams. A critical thinker asks: <em>Who should we consult or inform? Who might have relevant expertise or a different perspective?</em> Including diverse viewpoints is essential. </p><p>Otherwise, teams risk falling into <strong>groupthink</strong>, where everyone converges on the same idea and dissenting opinions are silenced. Groupthink can fool a team into validating only their aligned views without questioning if those views rest on good data or sound assumptions. To counter this, effective teams encourage questions from all members and even bring in outsiders for fresh eyes. In short, <em>who</em> is in the room (and <em>who</em> isn&#8217;t) can make or break the objectivity of technical decisions.</p><p><strong>Who should we listen to &#8211; human or AI?</strong> In the age of AI assistants, we must also critically assess <em>who</em> an answer is coming from. Is it the output of a large language model or a seasoned colleague? An AI might confidently provide an answer that sounds authoritative, but remember it&#8217;s a statistical engine. <strong>Who &#8220;said&#8221; it matters.</strong> </p><p>A critical thinker treats an AI&#8217;s output as just another input to examine, not an oracle. If an entity (like an AI) hands us a plausible-sounding answer, our human tendency is to accept it and not dig deeper. This cognitive laziness isn&#8217;t new &#8211; it&#8217;s a general human weakness to take the easy, <em>&#8220;sounds good&#8221;</em> solution and run with it. But in engineering, blindly trusting an answer can be dangerous. If an AI code assistant suggests a code snippet or architecture, ask: <em>Who authored this suggestion? Does the AI actually understand our context?</em> Treat AI outputs as if coming from an inexperienced intern &#8211; verify everything. </p><p>For example, if Cursor provides a code fix for a bug, a critical engineer would review that code thoroughly and test it, just as they would review a junior developer&#8217;s work. The <em>who</em> question reminds us that <strong>accountability and understanding lie with the humans</strong>, regardless of AI involvement.</p><p><strong>Who is responsible and who is affected?</strong> Finally, critical thinking means staying aware of who will be affected by technical decisions. Shipping a quick-and-dirty fix might satisfy a manager in the short term, but who will maintain the code later? If a system fails, who bears the cost &#8211; is it the end-users, the on-call engineers, the company&#8217;s reputation? </p><p>Considering the human impact grounds our problem-solving in reality. It fosters <em>humility</em> &#8211; a recognition that our decisions affect real people and that we ourselves don&#8217;t have all the answers. Great engineers and product people cultivate this humility. They know there&#8217;s always more to learn and that no single person has the complete picture. By adopting a posture of learning and asking colleagues questions, they fill in their knowledge gaps and catch mistakes early.</p><p>In practice, this might mean a backend developer double-checks a feature&#8217;s impact with a frontend teammate (&#8220;Could this API change break the mobile app?&#8221;) or a developer seeking a security review from the infosec team rather than assuming &#8220;it&#8217;s probably fine.&#8221; In short, critical thinking in teams is a social endeavor: it thrives when <em>who</em> is involved includes a mix of people willing to question each other and themselves.</p><h2>What: define the real problem and gather evidence</h2><p><strong>What problem are we actually trying to solve?</strong> This is perhaps the most important question. A classic pitfall in engineering is rushing to solve <em>something</em> without confirming it&#8217;s the <em>right</em> thing. </p><p>In fact, Harvard Business Review has <a href="https://hbr.org/2012/09/the-power-of-defining-the-prob">emphasized</a> that rigorously defining the problem upfront ensures we address the right challenges and avoid wasted effort. In practice, this means taking time to clarify requirements and success criteria. Imagine a scenario: a product manager requests <em>&#8220;an AI feature to summarize user data&#8221;</em>. Jumping straight to coding a summarization algorithm would be premature before asking <em>what</em> the end goal is. Is the goal to help users understand their data trends? If so, maybe the &#8220;right problem&#8221; is actually that users are overwhelmed by raw data, and the solution might involve better visualization rather than just a summary. </p><p>Critical thinking urges us to explicitly articulate the problem and question initial assumptions. Our natural instinct is to go into <strong>&#8220;<a href="https://www.sngular.com/insights/337/are-we-solving-the-right-problems">problem-solving mode</a>&#8221;</strong> immediately, but this <em>tends to lead us to quick, surface-level fixes rather than more strategic and thoughtful solutions.</em> In other words, if we don&#8217;t slow down to define <em>what</em> needs solving, we risk fixing a symptom or a poorly-understood issue. A thoughtful engineer will ask early: <em>&#8220;How do we know we&#8217;re solving the right problem?&#8221;</em> &#8211; a simple question that can save immense time and prevent downstream headaches.</p><p>Concretely, defining <em>what</em> the problem is involves gathering evidence and facts. For example, suppose users are complaining that a system is &#8220;slow.&#8221; Rather than blindly optimizing random code, a critical thinker will ask: <em>What is slow, exactly?</em> Is it page load time, a specific query, or the entire app? <em>What evidence do we have?</em> Maybe logs show one database query is taking 5 seconds. That frames the problem clearly: improving that query&#8217;s performance. Similarly, in debugging scenarios, asking <em>&#8220;What changed?&#8221;</em> when something broke often points to the cause &#8211; a recent deployment or config update. This investigative mindset ensures we tackle the <em>actual</em> cause rather than just the first guess.</p><p><strong>What evidence supports our solution or conclusion?</strong> Critical thinking in engineering is fundamentally about evidence-based decision making. It&#8217;s not enough to have an idea but we need to justify it with data or logical reasoning. Always ask: <em>&#8220;Does the evidence support this conclusion?&#8221;</em> For instance, if an AI model suggests that a bug is due to a null pointer exception, don&#8217;t accept it at face value &#8211; check the logs or write a unit test to confirm. If a performance test indicates improvement, verify the results on multiple runs or environments. In modern AI-assisted development, this is especially vital. </p><p>Large language models (LLMs) often produce answers that <strong>sound</strong> correct. They&#8217;re excellent at sounding confident, which can trick even experienced engineers.</p><blockquote><p>If some entity gives you a good enough result, probably you aren&#8217;t going to spend much time improving it unless there is a good reason to do so. Likewise you probably aren&#8217;t going to spend a lot of time researching something that AI tells you if it sounds plausible. This is certainly a weakness, but it&#8217;s a general weakness in human cognition, and has little to do with AI in and of itself. - <a href="https://news.ycombinator.com/item?id=43057907#:~:text=,sounds%20plausible">Hacker News</a></p></blockquote><p>However, a plausible answer isn&#8217;t necessarily a true one. LLM answers are &#8220;almost always&#8221; <em>plausible-sounding but with no guarantee of being correct &#8211; a tremendous flaw with real consequences</em>. A critical thinker treats any proposed solution (whether from AI or a teammate) as a hypothesis to be tested, not a fact. They gather evidence to confirm or refute it. This might involve running an experiment, collecting metrics, or searching for analogous past incidents.</p><p>Consider the example of evaluating an AI-generated code snippet. Suppose Cursor provides a solution for timezone conversions. Instead of simply copy-pasting and assuming validity, a critical developer tests it against various formats and edge cases. If they discover the code fails on complex offsets, this evidence dictates the next step- perhaps switching to a dedicated library. By asking, &#8220;What data supports this?&#8221;, engineers avoid the trap of confirmation bias.</p><p>Instead, they actively look for <em>falsifying</em> evidence. In technical debates, confirmation bias might lead someone to defend their initial design choice and ignore alternative approaches. The antidote is to seek out data or feedback that challenges your idea: if you believe a new feature improved load time, also look at any cases where it regressed performance. <strong>What</strong> we know (and don&#8217;t know) should drive decisions, not just what we <em>feel</em>. Good critical thinkers are almost like scientists &#8211; they gather facts, run tests, and let evidence rather than ego determine the path forward.</p><h2>Where: consider context and scope</h2><p><strong>Where does this problem occur, and where will a solution apply?</strong> Context is everything in engineering. A fix that works perfectly in one environment might fail in another. Critical thinking means being mindful of <em>where</em> our assumptions hold true. Engineers should ask: <em>Where is the boundary of this issue? Where in the system or workflow are we seeing the effects?</em> </p><p>For example, if an AI ops tool flags an anomaly in system metrics, we should pinpoint where &#8211; which server, which module &#8211; before reacting. A spike in CPU on one microservice doesn&#8217;t mean the whole system is failing. By localizing <em>where</em> the problem lives, we avoid over-generalizing or deploying unnecessary global &#8220;fixes.&#8221; Similarly, consider <em>where</em> a solution will be used. Is the code running on a user&#8217;s low-powered smartphone or on a beefy cloud server? The context might dictate very different approaches. A critical thinker is always aware of the environment: <em>&#8220;Where will this code run? Where are the users encountering difficulties?&#8221;</em></p><p><strong>Where are the gaps in our knowledge?</strong> Asking &#8220;where&#8221; also means identifying where we need more information. If we&#8217;re debugging a distributed system, we might realize we don&#8217;t know where a specific request fails &#8211; is it at the client, the API gateway, or the database? That&#8217;s a cue to gather more data (e.g. add logging at various points) to determine the location of failure. Similarly, if a product idea is being discussed, critical thinking prompts us to ask <em>where in the user journey this idea fits</em>. This prevents solving a non-issue; perhaps the &#8220;cool feature&#8221; is addressing a part of the app that users rarely visit. Knowing <em>where</em> helps allocate effort to where it matters most.</p><p>To illustrate, imagine planning an experiment for a new feature rollout. A critical question is: <em>Where will we test it &#8211; in a staging environment, with internal users, or as a small percentage A/B test in production?</em> Each context has pros and cons. Testing in a realistic environment (like a small percentage of live users) may reveal issues that an isolated lab test won&#8217;t. On the other hand, some experiments should stay in a sandbox to avoid impacting real users. By explicitly considering <em>where</em> an experiment runs, engineers ensure they approach testing with appropriate rigor given the constraints. It&#8217;s easy to get false confidence from a perfect lab result that doesn&#8217;t hold in the messy real world.</p><p>Finally, &#8220;where&#8221; can be metaphorical: <em>Where could this solution cause side effects? Where might this decision have downstream impact?</em> Thinking a few steps ahead is a hallmark of seasoned engineers. For example, when modifying a shared library, ask where else that library is used. This way, you anticipate ripple effects and can check those places or alert those teams before problems occur. In sum, <strong>contextual awareness</strong> &#8211; spatial, environmental, and systemic &#8211; is a key part of critical thinking. It prevents tunnel vision. Great engineers don&#8217;t just solve <em>a</em> problem; they solve the problem <em>in the right place</em> and with full awareness of the setting.</p><h2>When: timing, timelines, and when to dive deep</h2><p><strong>When did or will something happen?</strong> The dimension of time is crucial in technical work. Critical thinking involves asking <em>when</em> both in diagnosing issues and in planning work. In troubleshooting, understanding <em>when</em> a bug first appeared or <em>when</em> a system behaves differently often reveals the cause. (&#8220;The system crashed at 3 AM last night &#8211; what happened around that time?&#8221; Perhaps a nightly job or a deployment coincided with the crash.) Experienced engineers habitually ask: <em>&#8220;When did it last work? What&#8217;s changed since then?&#8221;</em> This line of questioning is often more effective at finding the root cause than blindly guessing. It ties into evidence gathering &#8211; a deploy timeline or version history might show exactly when a faulty piece of code went live.</p><p><strong>When should we apply more rigor, and when is a quick heuristic enough?</strong> Not every decision warrants days of analysis; part of critical thinking is knowing <em>when</em> to go deep. In engineering, we constantly balance thoroughness against time constraints. Project deadlines and on-call incidents can create immense pressure to act quickly. Under stress or tight timelines, humans tend to rely on intuition and mental shortcuts &#8211; what cognitive scientists call <em>heuristics</em>. These are useful, but they also open the door to biases and mistakes. </p><p>Research at NASA has <a href="https://appel.nasa.gov/2018/04/11/mitigating-cognitive-bias-in-engineering-decision-making/#:~:text=Although%20cognitive%20bias%20is%20a,likelihood%20that%20bias%20will%20occur">noted</a> that when engineers are under stress or have limited time, they make faster decisions that are <strong>more prone to error</strong> than those made with time to reflect. This doesn&#8217;t mean we can always avoid urgency, but it means we should <strong>acknowledge the risk</strong>. A critical thinker under time pressure will consciously slow down on the most crucial aspects of the decision. For instance, if you&#8217;re debugging a production outage at 2 AM, you might use a quick fix to get the system running (that&#8217;s a heuristic &#8211; e.g. restart a service). But a critical mindset means you&#8217;ll also note, <em>&#8220;This is a band-aid. I need to investigate the root cause in the morning.&#8221;</em> In other words, know <em>when</em> to apply a temporary fix and <em>when</em> to invest in a permanent solution.</p><p>Approaching rigor with limited time often involves triage: prioritizing which questions need deep answers now and which can be answered later. A useful prompt is, <em>&#8220;How do we approach this with rigor given time constraints?&#8221;</em> For example, in planning a new feature under a tight deadline, critical thinking might lead a team to identify the riskiest assumption and test it early (even in a quick-and-dirty way), rather than trying to perfect every detail. They focus on <em>when</em> each piece of information is needed. Is it okay to decide the UI later, but crucial to validate the algorithm now? If so, time is allocated accordingly.</p><p>Good critical thinkers also develop a sense of timing for interventions. <em>When should we ask for help?</em> If a problem remains unsolved after a certain amount of time, a critical engineer knows it might be time to get a second pair of eyes or escalate to a wider team discussion. <em>When should we pause and reconsider?</em> On teams practicing Agile, this might be at sprint boundaries or before major releases &#8211; essentially built-in &#8220;when&#8221; checkpoints to ask if they&#8217;re on the right track. And <em>when have we done enough analysis?</em> There is a point of diminishing returns. </p><p>Being rigorous doesn&#8217;t mean being paralyzed by analysis. It means doing the <em>right amount</em> of thinking for the decision at hand. As an example, if you have a day to debug an issue, spending the first 4 hours to methodically gather data is wise; spending 23 hours to get a perfect answer might mean missing the deadline. Critical thinking helps balance these through self-awareness: knowing when you&#8217;re falling into analysis paralysis versus when you&#8217;re leaping to conclusions too soon.</p><h2>Why: questioning motives, causes, and rationale</h2><p><strong>Why are we doing this?</strong> The &#8220;why&#8221; questions get to the heart of motivation and causality. In an engineering context, constantly asking <em>why</em> serves two big purposes: (1) ensuring there&#8217;s a sound rationale for actions (so we&#8217;re not just doing things because &#8220;someone said so&#8221;), and (2) drilling down to find root causes of problems rather than treating symptoms. A critical thinker faced with a task &#8211; say, implementing a new AI tool &#8211; will ask: <em>&#8220;Why do we need this tool? What problem will it solve and why is that important?&#8221;</em></p><p>If the best answer the team has is &#8220;because it&#8217;s trendy&#8221; or &#8220;our competitor has it,&#8221; that should spark concern. Chasing buzzwords without a clear <em>why</em> can lead teams to invest in solutions that don&#8217;t actually address their users&#8217; needs. On the other hand, articulating a strong why (e.g. &#8220;to reduce the time users spend analyzing their data by automating summaries&#8221;) aligns the team on the real goal. It fosters independent thinking &#8211; an engineer confident in the <em>why</em> can independently make better decisions during implementation, because they understand the end goal deeply rather than just following orders.</p><p><strong>Why did this happen?</strong> When something goes wrong (or right), asking &#8220;why&#8221; repeatedly is a proven technique to get beyond superficial answers. In fact, the <strong><a href="https://reliability.com/resources/articles/5-whys-technique-root-cause-analysis-example-and-template/#:~:text=The%205%20Whys%20Technique%20is,level%20symptoms">Five Whys</a></strong> technique in root cause analysis is essentially institutionalized critical thinking &#8211; it forces you to peel back causes layer by layer. The idea is to <a href="https://www.qualitygurus.com/five-whys-analysis-how-to-use-it-to-improve-business-performance/">avoid jumping</a> on the first explanation and instead uncover the chain of causality. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ez0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ez0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 424w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 848w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 1272w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ez0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp&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;:56680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/178957072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-ez0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 424w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 848w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 1272w, https://substackcdn.com/image/fetch/$s_!-ez0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18628494-1acb-4eda-bcf0-e4500d5ff54d_1920x1080.webp 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, imagine a machine learning model&#8217;s accuracy suddenly drops. A naive response might be, <em>&#8220;The model is bad, retrain it.&#8221;</em> A critical approach would ask: <em>&#8220;Why did the accuracy drop? Because the input data distribution changed.&#8221;</em> Why did that happen? Perhaps a new data source was added. Why was that not accounted for? Maybe the data pipeline lacked a validation for distribution shifts. By the time you&#8217;ve asked &#8220;why&#8221; five times (or as many times as needed), you likely have a much clearer picture &#8211; maybe the real root cause was a flawed monitoring process that failed to catch the data drift early. </p><p>The difference is huge: a quick fix might just retrain the model (addressing the symptom of low accuracy temporarily), but the Five Whys approach might lead you to improve the monitoring system, preventing the issue from recurring. As one guide on the 5 Whys explains, this method <em>&#8220;aims to get to the heart of the matter rather than just addressing surface-level symptoms,&#8221;</em> encouraging teams to move beyond quick fixes to sustainable solutions.</p><p>However, <em>why</em> can be a double-edged sword if we&#8217;re not careful. Humans are prone to biases when answering why. One common pitfall is <strong>confirmation bias</strong> &#8211; we might latch onto a convenient explanation that fits our preconceptions and <a href="https://www.sngular.com/insights/337/are-we-solving-the-right-problems">stop</a> investigating further. For instance, an engineer might assume <em>&#8220;The server crashed because of a memory leak, which has happened before,&#8221;</em> and not consider other causes like a new configuration change, simply because the memory leak fits their mental model. If they don&#8217;t seek evidence to <em>disconfirm</em> their memory leak hypothesis, they might miss the real cause. </p><p>The earlier-mentioned <em>plunging-in bias</em> is another &#8220;why&#8221; trap: it&#8217;s the tendency to rush into solving a perceived problem without fully understanding it. Studies have found that this bias &#8211; jumping to conclusions and imposing pre-determined solutions &#8211; leads to addressing symptoms rather than root causes in about half of failed decisions studied. In other words, not asking &#8220;why&#8221; enough (or not the right why) can sink projects. The Harley-Davidson company in the 1980s famously misdiagnosed why they were losing market share, blaming external factors and thus implementing wrong solutions, when the real issues were internal practices. It took years for them to correct course, exemplifying how failing to pin down the true &#8220;why&#8221; can prolong pain.</p><p>Good critical thinkers are almost relentlessly curious about <em>why</em>. They maintain a <strong>humble curiosity</strong> &#8211; an openness to finding out that their initial assumption was wrong. They ask questions like: <em>&#8220;Why do we believe this approach will work? Is it because of actual data or just our gut? Why are users asking for this feature &#8211; what&#8217;s the underlying need?&#8221;</em> By drilling into reasons, they often catch logical gaps or uncover hidden requirements. Importantly, they also communicate the <em>why</em> behind decisions to others, which helps teams stay aligned and spot flaws. If you can&#8217;t clearly explain <em>why</em> a particular technical decision was made, that&#8217;s a red flag &#8211; either the decision lacks solid reasoning or that reasoning isn&#8217;t shared (both are dangerous). On the flip side, when everyone understands the rationale (the why), they can independently verify if new developments still support that rationale or if it needs revisiting.</p><h2>How: apply rigor and communicate clearly</h2><p>After exploring &#8220;who, what, where, when, why,&#8221; the final question is <strong>&#8220;How do we actually practice critical thinking day to day?&#8221;</strong> This is about the methods and mindset &#8211; how to approach problems rigorously yet efficiently, and how to carry solutions through with clear communication. Good critical thinkers tend to have a systematic approach. They <strong>formulate questions clearly</strong>, <strong>validate evidence</strong>, and <strong>communicate solutions logically</strong>. Let&#8217;s break this down:</p><ul><li><p><strong>How to approach problems methodically:</strong> Often it starts with asking better questions. Instead of vague queries, they ask specific, open-ended questions that lead to insight. For example, rather than &#8220;Is this design good?&#8221;, a critical thinker might ask &#8220;How does this design address the user&#8217;s primary need and how could it fail?&#8221; It&#8217;s important to avoid loaded or leading questions that just confirm what we already think. Maintaining an open mind and <a href="https://daily.dev/blog/critical-thinking-key-skill-for-software-developers">probing</a> for details yields much more useful information. A practical habit is to enumerate what you know and what you <strong>don&#8217;t</strong> know, then plan how to test or learn the latter. Think like a scientist: if you have a hypothesis (e.g. &#8220;the database is the bottleneck&#8221;), figure out how to prove or disprove it (perhaps by profiling or looking at query times). This structured interrogation of problems is at the core of critical thinking.</p></li><li><p><strong>How to validate evidence and avoid bias:</strong> Once you have data or answers, a critical thinker validates them. Does the data actually support the conclusion, or are there alternative interpretations? This might mean cross-checking metrics from two sources, reproducing a bug in a test environment to ensure it&#8217;s not a fluke, or getting a code review for an assumption you&#8217;ve made. It also means being aware of your own biases. As discussed, if you find yourself gravitating to an explanation too quickly, pause and ask, <em>&#8220;Am I considering all the evidence, or just the bits that confirm my theory?&#8221;</em> One strategy is actively seeking contradictory evidence. If you think a new feature improved retention, look at any cohort where retention didn&#8217;t improve &#8211; what&#8217;s different there? By <strong>welcoming negative data</strong>, you ensure you&#8217;re not kidding yourself. This is essentially a quality assurance mindset but applied to thinking: test the robustness of your ideas like you test your code. Additionally, frameworks and checklists can help maintain rigor. Some teams, for example, use a <strong>premortem</strong> exercise (imagining a future where the project failed and writing down reasons why) to surface potential issues and assumptions that weren&#8217;t initially considered. Such techniques enforce a more critical evaluation of a plan <em>before</em> it&#8217;s executed.</p></li><li><p><strong>How to communicate solutions and reasoning:</strong> A brilliant solution isn&#8217;t worth much if it can&#8217;t be communicated and implemented by the team. Critical thinking shines in how solutions are explained. Good engineers organize their explanation logically: start with the problem definition (the <em>what</em> and <em>why</em>), state the proposed solution (the <em>how</em>), and provide the evidence or reasoning backing it. They make their assumptions explicit and describe the trade-offs considered. This kind of communication not only helps others understand the proposal, it also serves as a final self-check for the thinker: if you can&#8217;t articulate it clearly, maybe your thinking isn&#8217;t clear yet. Importantly, critical thinkers use <strong>facts and data</strong> to bolster their communication, rather than hyperbole or opinion. As one engineering leadership article notes, <em>humble engineers prefer facts instead of opinions</em> &#8211; they will <a href="https://dangoslen.me/blog/a-case-for-being-a-humble-engineer/#:~:text=Lastly%2C%20humble%20engineers%20use%20facts,constant%2C%20and%20lead%20to%20solutions">cite the data</a> (&#8220;this change improved load time by 25% as measured on the dashboard&#8221;) rather than make boastful claims. This approach builds credibility. It shows you&#8217;re guided by evidence, which makes it easier for colleagues and stakeholders to trust the solution. Furthermore, clear communication involves listening and inviting feedback. A critical thinker doesn&#8217;t deliver a monologue; they encourage others to poke holes and ask questions, because that scrutiny will either validate the idea or help improve it. In meetings, this might look like: <em>&#8220;Here&#8217;s what I propose and why. Does anyone see any gap in this reasoning or have concerns?&#8221;</em> By fostering an open dialogue, they ensure the solution is robust and agreed upon, not just the loudest voice winning.</p></li></ul><p>Finally, <strong>&#8220;How do we ensure we&#8217;re continuously improving our critical thinking?&#8221;</strong> This meta-question is worth a thought. The answer is practice and reflection. Just as we do retrospectives for projects, doing mini-retrospectives on decisions can sharpen thinking skills. For instance, if a rushed decision led to a bug, a team can analyze: how did we miss it, and how can we catch such things next time? </p><p>Over time, engineers build a mental library of lessons learned (e.g. &#8220;Remember to check X, because last time we assumed and it burned us&#8221;). Many top engineers also cultivate habits like reading post-mortems from other companies&#8217; failures or studying cognitive biases to become familiar with traps they might fall into. Critical thinking isn&#8217;t a one-and-done checkbox; it&#8217;s a continuous, career-long discipline of staying curious, humble, and evidence-driven.</p><h2>Conclusion</h2><p>As AI gets increasingly used, critical thinking is <strong>not optional, but essential</strong>. </p><p>We should ask <em>Who</em> should be involved, <em>What</em> is the real problem, <em>Where</em> is the context, <em>When</em> to dig deeper, <em>Why</em> something is done, and <em>How</em> to do it properly. By using this classic framework pragmatically, technical teams can navigate complexity with clarity. </p><p>It means a culture where independent thinking is valued: team members feel safe to question a proposed solution (<em>&#8220;How do we know this is truly the fix and not a band-aid?&#8221;</em>), to challenge assumptions (<em>&#8220;Why are we sure the users want this feature?&#8221;</em>), and to demand evidence (<em>&#8220;Does the data actually show an improvement, or are we seeing what we want to see?&#8221;</em>). Embracing humble curiosity &#8211; the idea that no matter how experienced we are, we could be missing something &#8211; keeps engineers from falling prey to confirmation bias or overconfidence.</p><p>Critical thinking also protects against the allure of quick fixes. It&#8217;s understandably tempting to patch a problem and move on, especially under pressure. But as we&#8217;ve seen, failing to think critically about a quick fix can mean the same problem resurfaces later or, worse, that we fix the wrong thing entirely. By asking the tough questions upfront and validating before acting, we actually <strong>save time and trouble in the long run</strong>. We avoid downstream issues by catching them upstream &#8211; whether it&#8217;s discovering a design flaw before code is written or realizing an AI&#8217;s output is flawed before it reaches customers.</p><p>In conclusion, while AI and automation will continue to evolve and handle more routine work, <strong>critical thinking remains an uniquely human advantage</strong>. It&#8217;s how we ensure that we&#8217;re solving the right problems, in the right way, for the right reasons.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!54oK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!54oK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 424w, https://substackcdn.com/image/fetch/$s_!54oK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 848w, https://substackcdn.com/image/fetch/$s_!54oK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!54oK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!54oK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1146228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/178957072?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!54oK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 424w, https://substackcdn.com/image/fetch/$s_!54oK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 848w, https://substackcdn.com/image/fetch/$s_!54oK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!54oK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e90581d-19f6-4a27-bec6-26e9ce06b3c5_5246x3496.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>]]></content:encoded></item><item><title><![CDATA[Conductors to Orchestrators: The Future of Agentic Coding]]></title><description><![CDATA[From micro-manager to macro-manager: coding's asynchronous future]]></description><link>https://addyo.substack.com/p/conductors-to-orchestrators-the-future</link><guid isPermaLink="false">https://addyo.substack.com/p/conductors-to-orchestrators-the-future</guid><dc:creator><![CDATA[Addy Osmani]]></dc:creator><pubDate>Sat, 01 Nov 2025 14:30:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!knBl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>AI coding assistants</strong> have quickly moved from novelty to necessity where up to 90% of software engineers use some kind of AI for coding. But a new paradigm is emerging in software development - one where engineers leverage <strong>fleets of autonomous coding agents</strong>. In this agentic future, the role of the software engineer is evolving from <strong>implementer</strong> to <strong>manager</strong>, or in other words, from <em>coder</em> to <strong>conductor</strong> and ultimately <strong><a href="https://www.youtube.com/watch?v=sQFIiB6xtIs">orchestrator</a></strong>.</p><p>Over time, developers will increasingly <strong>guide AI agents to build the right code</strong> and coordinate multiple agents working in concert. This write-up explores the distinction between <strong>Conductors</strong> and <strong>Orchestrators</strong> in AI-assisted coding, defines these roles, and examines how today&#8217;s cutting-edge tools embody each approach. Senior engineers may start to see the writing on the wall: our jobs are shifting from <em>&#8220;How do I code this?&#8221;</em> to <em>&#8220;How do I get the right code built?&#8221;</em> - a subtle but profound change.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://addyo.substack.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">Elevate is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xumY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xumY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 424w, https://substackcdn.com/image/fetch/$s_!xumY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 848w, https://substackcdn.com/image/fetch/$s_!xumY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 1272w, https://substackcdn.com/image/fetch/$s_!xumY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xumY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:635199,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.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_!xumY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 424w, https://substackcdn.com/image/fetch/$s_!xumY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 848w, https://substackcdn.com/image/fetch/$s_!xumY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.png 1272w, https://substackcdn.com/image/fetch/$s_!xumY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb45e5d-d4fd-4f87-b6cc-8e49d07b7830_1678x936.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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>What&#8217;s the tl;dr of an orchestrator tool? It supports multi-agent workflows where you can run many agents in parallel without them interfering with each another. But let&#8217;s talk terminology more first.</p><h2><strong>The Conductor: Guiding a single AI agent</strong></h2><p>In the context of AI coding, acting as a <strong>Conductor</strong> means working closely with a single AI agent on a specific task, much like a conductor guiding a soloist through a performance.</p><p>The engineer remains in the loop at each step, dynamically steering the agent&#8217;s behavior, tweaking prompts, intervening when needed, and iterating in real-time. This is the logical extension of the &#8220;AI pair programmer&#8221; model many developers are already familiar with. With conductor-style workflows, <strong>coding happens in a synchronous, interactive session between human and AI</strong>, typically in your IDE or CLI.</p><p><strong>Key characteristics:</strong> A conductor keeps a tight feedback loop with one agent, verifying or modifying each suggestion, much as a driver navigates with a GPS. The AI helps write code, but the developer still performs many manual steps - creating branches, running tests, writing commit messages, etc., and ultimately decides which suggestions to accept.</p><p>Crucially, <strong>most of this interaction is ephemeral</strong>: once code is written and the session ends, the AI&#8217;s role is done and any context or decisions not captured in code may be lost. This mode is powerful for focused tasks and allows fine-grained control, but it doesn&#8217;t fully exploit what multiple AIs could do in parallel.</p><p><strong>Modern tools as Conductors:</strong> Several current AI coding tools exemplify the conductor pattern:</p><ul><li><p><strong>Claude Code (Anthropic):</strong> Anthropic&#8217;s Claude model offers a coding assistant mode (accessible via a CLI tool or editor integration) where the developer converses with Claude to generate or modify code. For example, with the <strong>Claude Code CLI</strong>, you navigate your project in a shell, ask Claude to implement a function or refactor code, and it prints diffs or file updates for you to approve. You remain the conductor: you trigger each action and review the output immediately. While Claude Code has features to handle long-running tasks and tools, in the basic usage it&#8217;s essentially a smart co-developer working step-by-step under human direction.</p></li><li><p><strong>Gemini CLI (Google):</strong> A command-line assistant powered by Google&#8217;s Gemini model, used for planning and coding with a very large context window. An engineer can prompt Gemini CLI to analyze a codebase or draft a solution plan, then iterate on results interactively. The human directs each step and Gemini responds within the CLI session. It&#8217;s a one-at-a-time collaborator, not running off to make code changes on its own (at least in this conductor mode).</p></li><li><p><strong>Cursor (Editor AI Assistant):</strong> The Cursor editor (a specialized AI-augmented IDE) can operate in an inline or chat mode where you ask it questions or to write a snippet, and it immediately performs those edits or gives answers within your coding session. Again, you guide it one request at a time. Cursor&#8217;s strength as a conductor is its deep context integration - it indexes your whole codebase so the AI can answer questions about any part of it. But the hallmark is that <strong>you, the developer, initiate and oversee each change</strong> in real time.</p></li><li><p><strong>VSCode, Cline, Roo Code (in-IDE chat):</strong> Similar to above, other coding agents also fall into this category. They suggest code or even multi-step fixes, but always under continuous human guidance.</p></li></ul><p>This conductor-style AI assistance has already boosted productivity significantly. It feels like having a junior engineer or pair programmer always by your side. However, it&#8217;s inherently <strong>one-agent-at-a-time and synchronous</strong>. To truly leverage AI at scale, we need to go beyond being a single-agent conductor. This is where the <strong>Orchestrator</strong> role comes 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_!51RX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!51RX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 424w, https://substackcdn.com/image/fetch/$s_!51RX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 848w, https://substackcdn.com/image/fetch/$s_!51RX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 1272w, https://substackcdn.com/image/fetch/$s_!51RX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!51RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fdb352c4-7273-45d7-810e-737b4133508d_1670x934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:780354,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.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_!51RX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 424w, https://substackcdn.com/image/fetch/$s_!51RX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 848w, https://substackcdn.com/image/fetch/$s_!51RX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.png 1272w, https://substackcdn.com/image/fetch/$s_!51RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffdb352c4-7273-45d7-810e-737b4133508d_1670x934.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>The Orchestrator: Managing a fleet of agents</strong></h2><p>If a conductor works with one AI &#8220;musician,&#8221; an <strong>Orchestrator</strong> oversees the entire symphony of multiple AI agents working in parallel on different parts of a project. The orchestrator sets high-level goals, defines tasks, and lets a team of autonomous coding agents independently carry out the implementation details. </p><p>Instead of micromanaging every function or bug fix, the human focuses on <strong>coordination, quality control, and integration</strong> of the agents&#8217; outputs. In practical terms, this often means an engineer can <strong>assign tasks to AI agents (e.g. via issues or prompts) and have those agents asynchronously produce code changes - often as ready-to-review pull requests</strong>. The engineer&#8217;s job becomes reviewing, giving feedback, and merging the results, rather than writing all the code personally.</p><p>This asynchronous, parallel workflow is a fundamental shift. It moves AI assistance from the foreground to the background. <strong>While you attend to higher-level design or other work, your &#8220;AI team&#8221; is coding in the background.</strong> When they&#8217;re done, they hand you completed work (with tests, docs, etc.) for review. It&#8217;s akin to being a project tech lead delegating tasks to multiple devs and later reviewing their pull requests, except the &#8220;devs&#8221; are AI agents.</p><p><strong>Key characteristics:</strong> An orchestrator deals with <strong>autonomous agents</strong> that can plan and execute multi-step coding tasks with minimal intervention. These agents have more agency: they can clone your repo, create new git branches, edit multiple files, compile/run tests, and iteratively refine their solution before presenting it.</p><p>The orchestrator doesn&#8217;t see every intermediate step (unless they choose to peek in); they mainly ensure the final outcome aligns with requirements. Importantly, all this happens in a <strong>tracked, persistent workflow</strong> (often leveraging version control and CI pipelines) rather than ephemeral suggestions. For example, GitHub&#8217;s coding agent operates entirely via pull requests on GitHub, so every change is logged and reviewable. Another hallmark is concurrency: an orchestrator can spin up multiple agents to tackle different tasks simultaneously, dramatically parallelizing development.</p><p><strong>Modern tools as Orchestrators:</strong> Over just the past year, several tools have emerged that embody this orchestrator paradigm:</p><ul><li><p><strong>GitHub Copilot </strong><em><strong>Coding Agent</strong></em> (Microsoft): This upgrade to Copilot transforms it from an in-editor assistant into an <strong>autonomous background developer (</strong>I cover it in <a href="https://www.youtube.com/watch?v=sQFIiB6xtIs">this video</a>). You can assign a GitHub issue to Copilot&#8217;s agent or invoke it via the VS Code agents panel, telling it (for example) &#8220;Implement feature X&#8221; or &#8220;Fix bug Y&#8221;. Copilot then <strong>spins up an ephemeral dev environment via GitHub Actions, checks out your repo, creates a new branch, and begins coding</strong>. It can run tests, linters, even spin up the app if needed, all without human babysitting. When finished, it opens a pull request with the changes, complete with a description and meaningful commit messages. It then asks for your review. You, the human orchestrator, review the PR (perhaps using Copilot&#8217;s AI-assisted <strong>code review</strong> to get an initial analysis). If changes are needed, you can leave comments like @copilot please update the unit tests for edge case Z, and the agent will iterate on the PR. <strong>This is asynchronous, autonomous code generation in action.</strong> Notably, Copilot automates the tedious book-keeping: branch creation, committing, opening PRs, etc., which used to cost developers time. All the grunt work around writing code (aside from the design itself) is handled, allowing developers to focus on reviewing and guiding at a high level. GitHub&#8217;s agent effectively lets one engineer supervise many &#8220;AI juniors&#8221; working in parallel across different issues (and you can even create multiple specialized agents for different task types).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rmBg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rmBg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 424w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 848w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rmBg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png" width="1456" height="757" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:757,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:540032,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.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_!rmBg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 424w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 848w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!rmBg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ced1b20-bbb4-4450-aa2d-6b108c0b0f2a_3010x1564.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li><li><p><strong>Jules, Google&#8217;s Coding Agent:</strong> <strong>Jules</strong> is an autonomous coding agent. Jules is <strong>&#8220;not a co-pilot, not a code-completion sidekick, but an autonomous agent that reads your code, understands your intent, and gets to work.&#8221;</strong> Integrated with Google Cloud and GitHub, Jules lets you connect a repository and then ask it to perform tasks much as you would a developer on your team. Under the hood, Jules <strong>clones your entire codebase into a secure cloud VM</strong> and analyzes it with a powerful model. You might tell Jules: &#8220;Add user authentication to our app&#8221; or &#8220;Upgrade this project to the latest Node.js and fix any compatibility issues.&#8221; It will formulate a plan, present it to you for approval, and once you approve, execute the changes asynchronously. It makes commits on a new branch and can even open a pull request for you to merge. Jules handles writing new code, updating tests, bumping dependencies, etc., all while you could be doing something else. Crucially, Jules provides <strong>transparency and control</strong>: it shows you its proposed plan and reasoning before making changes, and allows you to intervene or modify instructions at any point (a feature Google calls &#8220;user steerability&#8221;). This is akin to giving an AI intern the spec and watching over their shoulder less frequently - you trust them to get it mostly right, but you still verify the final diff. Jules also boasts unique touches like <strong>audio changelogs</strong> (it generates spoken summaries of code changes) and the ability to run multiple tasks concurrently in the cloud. In short, Google&#8217;s Jules demonstrates the orchestrator model: you define the task, Jules does the heavy lifting asynchronously, and you oversee the result.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DjpK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DjpK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 424w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 848w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DjpK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png" width="1400" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#128025; Google Jules: The AI Coding Agent That Actually Works Autonomously | by  Elio Verhoef | Medium&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#128025; Google Jules: The AI Coding Agent That Actually Works Autonomously | by  Elio Verhoef | Medium" title="&#128025; Google Jules: The AI Coding Agent That Actually Works Autonomously | by  Elio Verhoef | Medium" srcset="https://substackcdn.com/image/fetch/$s_!DjpK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 424w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 848w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!DjpK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1ebab2-c5d9-4097-ba85-68707df9df17_1400x1048.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li><li><p><strong>OpenAI Codex (Cloud Agent):</strong> OpenAI introduced a new cloud-based <strong>Codex agent</strong> in to complement ChatGPT. This evolved Codex (different from the 2021 Codex model) is described as <strong>&#8220;a cloud-based software engineering agent that can work on many tasks in parallel&#8221;</strong>. It&#8217;s available as part of ChatGPT Plus/Pro under the name <em>OpenAI Codex</em> and via an npm CLI (npm i -g @openai/codex). With the Codex CLI or its VS Code/Cursor extensions, you can delegate tasks to OpenAI&#8217;s agent similar to Copilot or Jules. For instance, from your terminal you might say: <em>&#8220;Hey Codex, implement dark mode for the settings page&#8221;</em>. Codex then launches into your repository, edits the necessary files, perhaps runs your test suite, and when done, presents the diff for you to merge. It operates in an isolated sandbox for safety, running each task in a container with your repo and environment. Like others, OpenAI&#8217;s Codex agent integrates with developer workflows: you can even kick off tasks from a <strong>ChatGPT mobile app</strong> on your phone and get notified when the agent is done. OpenAI emphasizes seamless switching <strong>&#8220;between real-time collaboration and async delegation&#8221;</strong> with Codex. In practice, this means you have the flexibility to use it in conductor mode (pair-programming in your IDE) or orchestrator mode (hand off a background task to the cloud agent). Codex can also be invited into your Slack channels - teammates can assign tasks to @Codex in Slack and it will pull context from the conversation and your repo to execute them. It&#8217;s a vision of ubiquitous AI assistance, where coding tasks can be delegated from anywhere. Early users report that Codex can autonomously identify and fix bugs, or generate significant features, given a well-scoped prompt. All of this again aligns with the orchestrator workflow: the human defines the goal, the AI agent autonomously delivers a solution.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pW8l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pW8l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 424w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 848w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 1272w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pW8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png" width="1274" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;OpenAI Codex: The Autonomous AI Coding Agent | by Komal Raut | AI  Simplified in Plain English | Medium&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="OpenAI Codex: The Autonomous AI Coding Agent | by Komal Raut | AI  Simplified in Plain English | Medium" title="OpenAI Codex: The Autonomous AI Coding Agent | by Komal Raut | AI  Simplified in Plain English | Medium" srcset="https://substackcdn.com/image/fetch/$s_!pW8l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 424w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 848w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.png 1272w, https://substackcdn.com/image/fetch/$s_!pW8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F884081a1-6333-408f-b74b-fe797d666bb2_1274x847.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li><li><p><strong>Anthropic Claude Code (for Web):</strong> Anthropic has offered Claude as an AI chatbot for a while, and their Claude Code CLI has been a favorite for interactive coding. Anthropic took the next step by launching <strong>Claude Code for Web</strong>, effectively a hosted version of their coding agent. Using Claude Code for Web, you point it at your GitHub repo (with configurable sandbox permissions) and give it a task. The agent then runs in Anthropic&#8217;s managed container, just like the CLI version, but now you can trigger it from a web interface or even a mobile app. It queues up multiple prompts and steps, executes them, and when done, pushes a branch to your repo (and can open a PR). Essentially, Anthropic took their single-agent Claude Code and made it an orchestratable service in the cloud. They even provided a &#8220;teleport&#8221; feature to transfer the session to your local environment if you want to take over manually. The rationale for this web version aligns with orchestrator benefits: convenience and scale. You don&#8217;t need to run long jobs on your machine; Anthropic&#8217;s cloud handles the heavy lifting, with <strong>filesystem and network isolation</strong> for safety. Claude Code for Web acknowledges that <em>autonomy with safety</em> is key - by sandboxing the agent, they reduce the need for constant permission prompts, letting the agent operate more freely (less babysitting by the user). In effect, Anthropic has made it easier to use Claude as an autonomous coding worker you launch on demand.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6VKc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6VKc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 424w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 848w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 1272w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6VKc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2423312,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.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_!6VKc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 424w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 848w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.png 1272w, https://substackcdn.com/image/fetch/$s_!6VKc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa78c062a-d656-478d-99ea-19a7c3619790_3550x1990.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li><li><p><strong>Cursor Background Agents:</strong> tl;dr - Cursor 2.0 has a more focused <a href="https://cursor.com/blog/2-0#the-multi-agent-interface">multi-agent interface</a> more focused around agents rather than files. Cursor 2 expands its <a href="https://cursor.com/docs/cloud-agent">Background Agents</a> feature into a full-fledged orchestration layer for developers. Beyond serving as an interactive assistant, Cursor 2 lets you spawn autonomous background agents that operate asynchronously in a managed cloud workspace. When you delegate a task, Cursor 2&#8217;s agents now clone your GitHub repository, spin up an ephemeral environment, and check out an isolated branch where they execute work end-to-end. These agents can handle the entire development loop - from editing and running code, to installing dependencies, executing tests, running builds, and even searching the web or referencing documentation to resolve issues. Once complete, they push commits and open a detailed pull request summarizing their work. Cursor 2 introduces multi-agent orchestration, allowing several background agents to run concurrently across different tasks - for instance, one refining UI components while another optimizes backend performance or fixes tests. Each agent&#8217;s activity is visible through a real-time dashboard that can be accessed from desktop or mobile, enabling you to monitor progress, issue follow-ups, or intervene manually if needed. This new system effectively treats each agent as part of an on-demand AI workforce, coordinated through the developer&#8217;s high-level intent. Cursor 2&#8217;s focus on parallel, asynchronous execution dramatically amplifies a single engineer&#8217;s throughput - fully realizing the orchestrator model where humans oversee a fleet of cooperative AI developers rather than a single assistant.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RsSA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RsSA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 424w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 848w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 1272w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RsSA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png&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;:1529052,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.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_!RsSA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 424w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 848w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.png 1272w, https://substackcdn.com/image/fetch/$s_!RsSA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd10a8fb0-9331-4162-bdf4-3b27c4acb9db_3010x1694.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li><li><p><strong>Agent Orchestration Platforms:</strong> Beyond individual product offerings, there are also emerging <strong>platforms and open-source projects</strong> aimed at orchestrating multiple agents. For instance, <strong><a href="https://conductor.build/">Conductor</a></strong> by Melty Labs (despite its name!) is actually an orchestration tool that lets you deploy and manage multiple Claude Code agents on your own machine in parallel. With Conductor, each agent gets its own isolated Git worktree to avoid conflicts, and you can see a dashboard of all agents (&#8220;who&#8217;s working on what&#8221;) and review their code as they progress. The idea is to make running a small swarm of coding agents as easy as running one. Similarly, <strong><a href="https://smtg-ai.github.io/claude-squad/">Claude Squad</a></strong> is a popular open-source terminal app that essentially multiplexes Anthropic&#8217;s Claude - it can spawn several Claude Code instances working concurrently in separate tmux panes, allowing you to give each a different task and thus code &#8220;10x faster&#8221; by parallelizing. These orchestration tools underscore the trend: developers want to coordinate <em>multiple</em> AI coding agents and have them collaborate or divide work. Even Microsoft&#8217;s Azure AI services are enabling this - at Build 2025 they announced tools for developers to <strong>&#8220;orchestrate multiple specialized agents to handle complex tasks&#8221;</strong>, with SDKs supporting Agent-to-Agent communication so your fleet of agents can talk to each other and share context. All of this infrastructure is being built to support the <strong>orchestrator engineer</strong>, who might eventually oversee dozens of AI processes tackling different parts of the software development lifecycle.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AFu_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AFu_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 424w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 848w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 1272w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AFu_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp" width="1456" height="984" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:984,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:586276,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AFu_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 424w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 848w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 1272w, https://substackcdn.com/image/fetch/$s_!AFu_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1977a6f3-15ec-4112-b30d-95510af7df13_3256x2200.webp 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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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></li></ul><blockquote><p>&#8220;I found <a href="https://www.linkedin.com/redir/suspicious-page?url=https%3A%2F%2Fconductor%2ebuild%2F&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_detail_base%3B4m9RhAtxR6ebkFVf%2FmOdlg%3D%3D">Conductor</a> to make the most sense to me. It was a perfect balance of talking to an agent and seeing my changes in a pane next to it. Its Github integration feels seamless; e.g. after merging PR, it immediately showed a task as &#8220;Merged&#8221; and provided an &#8220;Archive&#8221; button.&#8221; - <a href="https://www.linkedin.com/in/juriyzaytsev?miniProfileUrn=urn%3Ali%3Afsd_profile%3AACoAAACPjPoB242NjG3ty49SjbsQdnWjb4xr0Tg&amp;lipi=urn%3Ali%3Apage%3Ad_flagship3_detail_base%3B4m9RhAtxR6ebkFVf%2FmOdlg%3D%3D">Juriy Zaytsev</a>, Staff SWE, LinkedIn</p><p>He also tried <a href="https://www.magnet.run/">Magnet</a>: &#8220;The idea of tying tasks to a Kanban board is interesting and makes sense. As such, Magnet feels very product -centric.&#8221;</p></blockquote><h2><strong>Conductor vs Orchestrator - Differences</strong></h2><p><strong>Many engineers will continue to engage in conductor-style workflows (single-agent, interactive) even as orchestrator patterns mature. The two modes will co-exist.</strong></p><p>It&#8217;s clear that &#8220;conductor&#8221; and &#8220;orchestrator&#8221; aren&#8217;t just fancy terms but they describe a genuine shift in how we work with AI:</p><ul><li><p><strong>Scope of control:</strong> A conductor operates at the micro level, guiding one agent through a single task or a narrow problem. An orchestrator operates at the macro level, defining broader tasks and objectives for multiple agents or for a powerful single agent that can handle multi-step projects. The conductor asks, &#8220;How do I solve this function or bug with the AI&#8217;s help?&#8221; The orchestrator asks, &#8220;What set of tasks can I delegate to AI agents today to move this project forward?&#8221;</p></li><li><p><strong>Degree of autonomy:</strong> In conductor mode, the AI&#8217;s autonomy is low - it waits for user prompts each step of the way. In orchestrator mode, we give the AI high autonomy - it might plan and execute dozens of steps internally (writing code, running tests, adjusting its approach) before needing human feedback. A GitHub Copilot agent or Jules will try to complete a feature from start to finish once assigned, whereas Copilot&#8217;s IDE suggestions only go line-by-line as you type.</p></li><li><p><strong>Synchronous vs Asynchronous:</strong> Conductor interactions are typically synchronous - you prompt, AI responds within seconds, you immediately integrate or iterate. It&#8217;s a real-time loop. Orchestrator interactions are asynchronous - you might dispatch an agent and check back minutes or hours later when it&#8217;s done (somewhat like kicking off a long CI job). This means orchestrators must handle waiting, context-switching, and possibly managing multiple things concurrently, which is a different workflow rhythm for developers.</p></li><li><p><strong>Artifacts and traceability:</strong> A subtle but important difference: orchestrator workflows produce persistent artifacts like branches, commits, and pull requests that are preserved in version control. The agent&#8217;s work is fully recorded (and often linked to an issue/ticket), which improves traceability and collaboration. With conductor-style (IDE chat, etc.), unless the developer manually commits intermediate changes, a lot of the AI&#8217;s involvement isn&#8217;t explicitly documented. In essence, orchestrators leave a paper trail (or rather a git trail) that others on the team can see or even trigger themselves. This can help bring AI into team processes more naturally.</p></li><li><p><strong>Human Effort Profile:</strong> For a conductor, the human is actively engaged nearly 100% of the time the AI is working - reviewing each output, refining prompts, etc. It&#8217;s interactive work. For an orchestrator, the human&#8217;s effort is front-loaded (writing a good task description or spec for the agent, setting up the right context) and back-loaded (reviewing the final code and testing it), but not much is needed in the middle. This means one orchestrator can manage more total work in parallel than would ever be possible by working with one AI at a time. Essentially, orchestrators leverage <strong>automation at scale</strong>, trading off fine-grained control for breadth of throughput.<br></p></li></ul><p>To illustrate, consider a common scenario: adding a new feature that touches frontend, backend, and requires new tests. As a conductor, you might open your AI chat and implement the backend logic with the AI&#8217;s help, then separately implement the frontend, then ask it to generate some tests - doing each step sequentially with you in the loop throughout. As an orchestrator, you could assign the backend implementation to one agent (Agent A), the frontend UI changes to another (Agent B), and test creation to a third (Agent C). You give each a prompt or an issue description, then step back and let them work concurrently. </p><p>After a short time, you get perhaps three PRs: one for backend, one for frontend, one for tests. Your job then is to review and integrate them (and maybe have Agent C adjust tests if Agents A/B&#8217;s code changed during integration). In effect, you managed a mini &#8220;AI team&#8221; to deliver the feature. This example highlights how orchestrators think in terms of <strong>task distribution and integration</strong>, whereas conductors focus on <strong>step-by-step implementation</strong>.</p><p>It&#8217;s worth noting that <strong>these roles are fluid, not rigid categories</strong>. A single developer might act as a conductor in one moment and an orchestrator the next. For example, you might kick off an asynchronous agent to handle one task (orchestrator mode) while you personally work with another AI on a tricky algorithm in the meantime (conductor mode). Tools are also blurring lines: as OpenAI&#8217;s Codex marketing suggests, you can seamlessly switch between collaborating in real-time and delegating async tasks. So, think of &#8220;conductor&#8221; vs &#8220;orchestrator&#8221; as two ends of a spectrum of AI-assisted development, with many hybrid workflows in between.</p><h2><strong>Why Orchestrators matter</strong></h2><p>Experts are suggesting that this shift to orchestration could be one of the biggest leaps in programming productivity we&#8217;ve ever seen. Consider the historical trends: we went from writing assembly to using high-level languages, then to using frameworks and libraries, and recently to leveraging AI for autocompletion. Each step abstracted away more low-level work. <strong>Autonomous coding agents are the next abstraction layer</strong> - instead of manually coding every piece, you describe what you need at a higher level and let multiple agents build it.</p><p>As orchestrator-style agents ramp up, we could imagine even larger percentages of code being drafted by AIs. What does a software team look like when AI agents generate, say, 80% or 90% of the code, and humans provide the 10% critical guidance and oversight? Many believe it doesn&#8217;t mean replacing developers - it means <strong>augmenting developers to build better software</strong>. We may witness an explosion of productivity where a small team of engineers, effectively managing dozens of agent processes, can accomplish what once took an army of programmers months. (Note: I continue to believe the code review loop where we&#8217;ll continue to focus our human skills is going to need work if all this code is not to be slop).</p><p>One intriguing possibility is that <strong>every engineer becomes, to some degree, a </strong><em><strong>manager</strong></em><strong> of AI developers</strong>. It&#8217;s a bit like everyone having a personal team of interns or junior engineers. Your effectiveness will depend on how well you can break down tasks, communicate requirements to AI, and verify the results. Human judgment will remain vital: deciding what to build, ensuring correctness, handling ambiguity, and injecting creativity or domain knowledge where AI might fall short. In other words, the skillset of an orchestrator - good planning, prompt engineering, validation, and oversight - is going to be in high demand. Far from making engineers obsolete, these agents could <strong>elevate engineers into more strategic, supervisory roles</strong> on projects</p><h2><strong>Toward an &#8220;AI Team&#8221; of specialists</strong></h2><p>Today&#8217;s coding agents mostly tackle implementation: write code, fix code, write tests, etc. But the vision doesn&#8217;t stop there. Imagine a full software development pipeline where <strong>multiple specialized AI agents handle different phases of the lifecycle, coordinated by a human orchestrator</strong>. This is already on the horizon. Researchers and companies have floated architectures where, for example, you have:</p><ul><li><p>a <strong>Planning Agent</strong> that analyzes feature requests or bug reports and breaks them into specific tasks</p></li><li><p>a <strong>Coding Agent</strong> (or several) that implement the tasks in code</p></li><li><p>a <strong>Testing Agent</strong> that generates and runs tests to verify the changes</p></li><li><p>a <strong>Code Review Agent</strong> that checks the pull requests for quality and standards compliance</p></li><li><p>a <strong>Documentation Agent</strong> that updates README or docs to reflect the changes</p></li><li><p>possibly a <strong>Deployment/Monitoring Agent</strong> that can roll out the change and watch for issues in production.</p></li></ul><p>In this scenario, the human engineer&#8217;s role becomes one of <strong>oversight and orchestration across the whole flow</strong>: you might initiate the process with a high-level goal (e.g., &#8220;Add support for payment via cryptocurrency in our app&#8221;), the planning agent turns that into sub-tasks, coding agents implement each sub-task asynchronously, the testing agent and review agent catch problems or polish the code, and finally everything gets merged and deployed under watch of monitoring agents. </p><p>The human would step in to approve plans, resolve any conflicts or questions the agents raise, and give final approval to deploy. This is essentially an <strong>&#8220;AI swarm&#8221;</strong> tackling software development end-to-end, with the engineer as the conductor of the orchestra.</p><p>While this might sound futuristic, we see early signs. Microsoft&#8217;s Azure AI Foundry now provides building blocks for multi-agent workflows and agent orchestration in enterprise settings, implicitly supporting the idea that multiple agents will collaborate on complex, multi-step tasks. Internal experiments at tech companies have agents creating pull requests that other agent reviewers automatically critique, forming an AI/AI interaction with a human in the loop at the end. In open-source communities, people have chained tools like Claude Squad (parallel coders) with additional scripts that integrate their outputs. And the conversation has started about standards like <strong>Model-Context Protocol (MCP)</strong> for agents sharing state and communicating results to each other.</p><p>I&#8217;ve noted before that &#8220;<em>specialized agents for Design, Implementation, Test, and Monitoring could work together to develop, launch, and land features in complex environments</em>&#8220; - with developers onboarding these AI agents to their team and guiding/overseeing their execution. In such a setup, agents would <em>&#8220;coordinate with other agents autonomously, request human feedback, reviews and approvals&#8221;</em> at key points, and otherwise handle the busywork amongst themselves. The goal is a <strong>central platform where we can deploy specialized agents across the workflow, without humans micromanaging each individual step</strong> - instead, the human oversees the entire operation with full context. </p><p>This could transform how software projects are managed: more like running an automated assembly line where engineers ensure quality and direction, rather than hand-crafting each component on the line.</p><h2><strong>Challenges and Human Role in orchestration</strong></h2><p>Does this mean programming becomes a push-button activity where you sit back and let the AI factory run? Not quite - and likely never entirely. There are significant challenges and open questions with the orchestrator model:</p><ul><li><p><strong>Quality control &amp; trust:</strong> Orchestrating multiple agents means you&#8217;re not eyeballing every single change as it&#8217;s made. Bugs or design flaws might slip through if you solely rely on AI. Human oversight remains <strong>critical</strong> as the final failsafe. Indeed, current tools explicitly require the human to review the AI&#8217;s pull requests before merging. The relationship is often compared to managing a team of junior developers: they can get a lot done, but you wouldn&#8217;t ship their code without review. The orchestrator engineer must be vigilant about checking the AI&#8217;s work, writing good test cases, and having monitoring in place. AI agents can make mistakes or produce logically correct but undesirable solutions (for instance, implementing a feature in a convoluted way). Part of the orchestration skillset is knowing <strong>when to intervene</strong> versus when to trust the agent&#8217;s plan. As the CTO of Stack Overflow wrote, <em>&#8220;developers maintain expertise to evaluate AI outputs&#8221;</em> and will need new <strong>&#8220;trust models&#8221;</strong> for this collaboration.</p></li><li><p><strong>Coordination &amp; conflict:</strong> When multiple agents work on a shared codebase, coordination issues arise - much like multiple developers can conflict if they touch the same files. We need strategies to prevent merge conflicts or duplicated work. Current solutions use <em>workspace isolation</em> (each agent works on its own git branch or separate environment) and clear task separation. For example, one agent per task, and tasks designed to minimize overlap. Some orchestrator tools can even automatically merge changes or rebase agent branches, but usually it falls to the human to integrate. Ensuring agents don&#8217;t step on each others&#8217; toes is an active area of development. It&#8217;s conceivable that in the future agents might negotiate with each other (via something like agent-to-agent communication protocols) to avoid conflicts, but today the orchestrator sets the boundaries.</p></li><li><p><strong>Context, shared state and hand-offs: </strong>Coding workflows are rich in state: repository structure, dependencies, build systems, test suites, style guidelines, team practices, legacy code, branching strategies etc. Multi-agent orchestration demands shared context, memory, and smooth transitions. But in enterprise settings: Context sharing across agents is non-trivial. Without a unified &#8220;workflow orchestration layer&#8221;, each agent can become a silo, working well in its domain but failing to mesh.  In a coding-engineering team this may translate into: one agent creates a feature branch, another one runs unit tests, another merges into master - if the first agent doesn&#8217;t tag metadata the second is expecting, you get breakdowns.</p></li><li><p><strong>Prompting and specifications:</strong> Ironically, as the AI handles more coding, <strong>the human&#8217;s &#8220;coding&#8221; moves up a level to writing specifications and prompts</strong>. The quality of an agent&#8217;s output is highly dependent on how well you specify the task. Vague instructions lead to subpar results or agents going astray. Best practices that have emerged include writing mini design docs or acceptance criteria for the agents - essentially treating them like contractors who need a clear definition of done. This is why we&#8217;re seeing ideas like <em>spec-driven development</em> for AI: you feed the agent a detailed spec of what to build, so it can execute predictably. Engineers will need to hone their ability to describe problems and desired solutions unambiguously. Paradoxically, it&#8217;s a very old-school skill (writing good specs and tests) made newly important in the AI era. As agents improve, prompts might get simpler (&#8220;write me a mobile app for X and Y with these features&#8221;) and yet yield more complex results, but we&#8217;re not quite at the point of the AI intuiting everything unsaid. For now, orchestrators must be excellent communicators to their digital workforce.</p></li><li><p><strong>Tooling and debugging:</strong> With a human developer, if something goes wrong, they can debug in real time. With autonomous agents, if something goes wrong (say the agent gets stuck on a problem or produces a failing PR), the orchestrator has to debug the situation: Was it a bad prompt? Did the agent misinterpret the spec? Do we roll back and try again or step in and fix it manually? New tools are being added to help here: for instance, <strong>checkpointing and rollback</strong> commands let you undo an agent&#8217;s changes if it went down a wrong path. Monitoring dashboards can show if an agent is taking too long or has errors. But effectively, orchestrators might at times have to drop down to conductor mode to fix an issue, then go back to orchestration. This interplay will improve as agents get more robust, but it highlights that orchestrating isn&#8217;t just &#8220;fire and forget&#8221; - it requires active monitoring. AI observability tools (tracking cost, performance, accuracy of agents) are likely to become part of the developer&#8217;s toolkit.</p></li><li><p><strong>Ethics and responsibility:</strong> Another angle - if an AI agent writes most of the code, who is responsible for license compliance, security vulnerabilities, or bias in that code? Ultimately the human orchestrator (or their organization) carries responsibility. This means orchestrators should incorporate practices like security scanning of AI-generated code and verifying dependencies. Interestingly, some agents like Copilot and Jules include built-in safeguards (they won&#8217;t introduce known vulnerable versions of libraries, for instance, and can be directed to run security audits). But at the end of the day, <em>&#8220;trust, but verify&#8221;</em> is the mantra. The human remains accountable for what ships, so orchestrators will need to ensure AI contributions meet the team&#8217;s quality and ethical standards.<br></p></li></ul><p>In summary, the rise of orchestrator-style development doesn&#8217;t remove the human from the loop - it <strong>changes the human&#8217;s position in the loop</strong>. We move from being the one turning the wrench to the one designing and supervising the machine that turns the wrench. It&#8217;s a higher-leverage position, but also one that demands broader awareness. </p><p>Developers who adapt to being effective conductors and orchestrators of AI will likely be <strong>even more valuable</strong> in this new landscape.</p><h2><strong>Conclusion: Every engineer a maestro?</strong></h2><p>Will every engineer become an orchestrator of multiple coding agents? It&#8217;s a provocative question, but trends suggest we&#8217;re headed that way for a large class of programming tasks. The day-to-day reality of a software engineer in the late 2020s could involve less heads-down coding and more high-level supervision of code that&#8217;s mostly written by AIs. </p><p>Today we&#8217;re already seeing early adopters treating AI agents as teammates - for example, some developers report delegating 10+ pull requests per day to AI, effectively <strong>treating the agent as an independent teammate rather than a smart autocomplete</strong>. Those developers free themselves to focus on system design, tricky algorithms, or simply coordinating even more work.</p><p>That said, the transition won&#8217;t happen overnight for everyone. Junior developers might start as &#8220;AI conductors,&#8221; getting comfortable working with a single agent, before they take on orchestrating many. Seasoned engineers are more likely to early-adopt orchestrator workflows, since they have the experience to architect tasks and evaluate outcomes. In many ways, it mirrors career growth: junior engineers implement (now with AI help), senior engineers design and integrate (soon with AI agent teams). </p><p>The tools we discussed - from GitHub&#8217;s coding agent to Google&#8217;s Jules to OpenAI&#8217;s Codex - are rapidly lowering the barrier to try this approach, so expect it to go mainstream quickly. The hyperbole aside, there&#8217;s truth that these capabilities can dramatically amplify what an individual developer can do.</p><p>So, will we all be orchestrators? Probably to some extent - yes. We&#8217;ll still write code, especially for novel or complex pieces that defy simple specification. But much of the boilerplate, routine patterns, and even a lot of sophisticated glue code could be offloaded to AI. The role of &#8220;software engineer&#8221; may evolve to emphasize product thinking, architecture, and validation, with the actual coding being a largely automated act. In this envisioned future, asking an engineer to crank out thousands of lines of mundane code by hand would feel as inefficient as asking a modern accountant to calculate ledgers with pencil and paper. Instead, the engineer would delegate that to their AI agents and focus on the creative and critical-thinking aspects around it.</p><p>Btw, yes, there&#8217;s plenty to be cautious about. We need to ensure these agents don&#8217;t introduce more problems than they solve. And the developer experience of orchestrating multiple agents is still maturing - it can be clunky at times. But the trajectory is clear. Just as continuous integration and automated testing became standard practice, <strong>continuous delegation to AI</strong> could become a normal part of the development process. The engineers who master both modes - knowing when to be a precise conductor and when to scale up as an orchestrator - will be in the best position to leverage this &#8220;agentic&#8221; world.</p><p>One thing is certain: the way we build software in the next 5-10 years will look quite different from the last 10. <strong>I want to stress that not all or most code will be agent-driven within a year or two, but that&#8217;s a direction we&#8217;re heading in.</strong> The keyboard isn&#8217;t going away, but alongside our keystrokes we&#8217;ll be issuing high-level instructions to swarms of intelligent helpers. In the end, the human element remains irreplaceable: it&#8217;s our judgment, creativity, and understanding of real-world needs that guides these AI agents toward meaningful outcomes. </p><p><strong>The future of coding isn&#8217;t AI or human, it&#8217;s AI </strong><em><strong>and</strong></em><strong> human - with humans at the helm as conductors and orchestrators, directing a powerful ensemble to achieve our software ambitions.</strong></p><p><em>I&#8217;m excited to share I&#8217;m written a new <a href="https://beyond.addy.ie">AI-assisted engineering book</a> with O&#8217;Reilly. If you&#8217;ve enjoyed my writing here you may be interested in checking it out.</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_!knBl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!knBl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 424w, https://substackcdn.com/image/fetch/$s_!knBl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 848w, https://substackcdn.com/image/fetch/$s_!knBl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 1272w, https://substackcdn.com/image/fetch/$s_!knBl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!knBl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7188581,&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://addyo.substack.com/i/177541153?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.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_!knBl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 424w, https://substackcdn.com/image/fetch/$s_!knBl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 848w, https://substackcdn.com/image/fetch/$s_!knBl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.png 1272w, https://substackcdn.com/image/fetch/$s_!knBl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdac571f-5afb-495e-ab15-794c18d7702c_5246x3496.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 aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><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 class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://addyo.substack.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">Elevate is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>