<?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[Agentic AI in Production]]></title><description><![CDATA[A weekly on what actually happens when AI agents leave the demo and run inside a real system.]]></description><link>https://www.scalableapps.io</link><image><url>https://substackcdn.com/image/fetch/$s_!wi0d!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda61e50b-5ad9-4495-822d-f88c2f265f7b_512x512.png</url><title>Agentic AI in Production</title><link>https://www.scalableapps.io</link></image><generator>Substack</generator><lastBuildDate>Sun, 15 Nov 2026 09:56:36 GMT</lastBuildDate><atom:link href="https://www.scalableapps.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Surendra Singh]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[bolnet@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[bolnet@substack.com]]></itunes:email><itunes:name><![CDATA[Surendra Singh]]></itunes:name></itunes:owner><itunes:author><![CDATA[Surendra Singh]]></itunes:author><googleplay:owner><![CDATA[bolnet@substack.com]]></googleplay:owner><googleplay:email><![CDATA[bolnet@substack.com]]></googleplay:email><googleplay:author><![CDATA[Surendra Singh]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Correct by design: the video edition]]></title><description><![CDATA[Edition 016 in 24 minutes: how to trust code your agents write and nobody reads in full.]]></description><link>https://www.scalableapps.io/p/correct-by-design-the-video-edition</link><guid isPermaLink="false">https://www.scalableapps.io/p/correct-by-design-the-video-edition</guid><dc:creator><![CDATA[Surendra Singh]]></dc:creator><pubDate>Wed, 11 Nov 2026 22:38:17 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/224524435/593944a8f1f8b9056bb352bc679e741c.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>This is edition 016 as a narrated video. It follows Sean Allen&#8217;s public writing on correctness: decide what working means before the code exists, use tools that refuse wrong programs, test whole workloads under failure, and limit what installed packages can do.</p><p>Code panes, balances and dates marked &#8220;example&#8221; or &#8220;schematic&#8221; are illustrations. The numbers come from the sources below.</p><p>The full written edition, with every source: <a href="https://www.scalableapps.io/p/correct-by-design-software-correctness">https://www.scalableapps.io/p/correct-by-design-software-correctness</a></p><p>Main sources:</p><ul><li><p>CodeRabbit, &#8220;Our new report: AI code creates 1.7x more problems&#8221;, Dec 2025</p></li><li><p>DORA, &#8220;2025 State of AI-assisted Software Development&#8221;</p></li><li><p>Google Security Blog, &#8220;Eliminating Memory Safety Vulnerabilities at the Source&#8221;, Sep 2024</p></li><li><p>Google, &#8220;Rust in Android: move fast and fix things&#8221;, Nov 2025</p></li><li><p>M&#252;ndler et al., &#8220;Type-Constrained Code Generation with Language Models&#8221;, Apr 2025</p></li><li><p>Jepsen analyses of YugaByte DB 1.1.9, TiDB 2.1.7 and MariaDB Galera Cluster 12.1.2</p></li><li><p>Zhou et al., &#8220;FoundationDB: A Distributed Unbundled Transactional Key Value Store&#8221;, SIGMOD 2021</p></li><li><p>Charity Majors, &#8220;I test in prod&#8221;, Increment, Aug 2019</p></li><li><p>William Woodruff, &#8220;We should all be using dependency cooldowns&#8221;, Nov 2025</p></li><li><p>Andrew Nesbitt, &#8220;Package managers need to cool down&#8221;, Mar 2026</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Correct by design: software correctness and supply chain risk, from Sean Allen’s work]]></title><description><![CDATA[Agents write more code than anyone can read. Build correctness in before the code exists, and know which risks you cannot test away.]]></description><link>https://www.scalableapps.io/p/correct-by-design-software-correctness</link><guid isPermaLink="false">https://www.scalableapps.io/p/correct-by-design-software-correctness</guid><dc:creator><![CDATA[Surendra Singh]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:18:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1-U_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Coding agents now write more code than any team can read. Review was never built to carry that load. Sean Allen has spent his career on systems that must not break: stream processors, the Pony language, confidential containers, and now correctness testing at Antithesis. His public writing makes one argument again and again. Decide what &#8220;working&#8221; means before the code exists, pick tools that refuse wrong programs, and test whole workloads under failure. Then accept that some risks, like the packages you install, have no clean fix at all.</p><blockquote><p><strong>In 60 seconds</strong></p><ul><li><p>Memory-safety bugs fell from 76% of Android vulnerabilities in 2019 to under 20% in 2025, as new code moved to memory-safe languages. Rust code shows 0.2 such bugs per million lines, against about 1,000 for C and C++.</p></li><li><p>94% of compile errors in LLM-written TypeScript were failed type checks in one 2025 study. Types catch what agents get wrong.</p></li><li><p>Jepsen&#8217;s bank test found a database where $100 in total became $136 after a crash. Simple workloads under faults find bugs that unit tests miss.</p></li><li><p>A 7-day dependency cooldown would have blocked 8 of 10 recent supply chain attacks. In May 2026 a worm shipped 84 malicious package versions with valid provenance.</p></li><li><p>Java&#8217;s ZGC took garbage collection pauses from a 10 ms goal in 2018 to a 1 ms goal in 2023. Pony avoids the global pause entirely with one heap per actor.</p></li></ul></blockquote><h2>Agents write code faster than anyone can check it</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1-U_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1-U_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1-U_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.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;:null,&quot;alt&quot;:&quot;More code than ever, and more issues per pull request in AI-written code&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="More code than ever, and more issues per pull request in AI-written code" title="More code than ever, and more issues per pull request in AI-written code" srcset="https://substackcdn.com/image/fetch/$s_!1-U_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!1-U_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44959474-7a71-4b36-849f-a6ae5ea27c2f_1600x900.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">More code than ever, and more issues per pull request in AI-written code</figcaption></figure></div><p>In its October 2025 Octoverse, GitHub counted a record 518.7 million merged pull requests. That is a 29% jump in one year, with developers pushing almost 1 billion commits. Among new developers, 80% used Copilot during their first week.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scalableapps.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Agentic AI in Production! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Shipping more code does not mean shipping working code. In December 2025, CodeRabbit compared 470 open source pull requests, splitting them between 320 written with AI and 150 written by people. <strong>AI pull requests had about 1.7 times more issues.</strong> Problems with logic and correctness showed up 75% more often, and security issues ran up to 2.74 times higher. Note that CodeRabbit sells AI code review, and it admits it cannot guarantee every &#8220;human&#8221; pull request was strictly human.</p><p>Google&#8217;s DORA 2025 report polled almost 5,000 people and found that 90% use AI on the job. Even so, the report found that AI adoption &#8220;does continue to have a negative relationship with software delivery stability.&#8221; About 30% of respondents have little or no trust in AI-written code.</p><p>In a May 2026 post, Sean Allen stated the problem plainly. Teams took human review, which was already a poor tool for catching bugs, and &#8220;bolted it onto the end of a brand new firehose.&#8221; He summed it up well: &#8220;That isn&#8217;t a quality gate. That&#8217;s a person drowning.&#8221;</p><p>Allen works as a distinguished engineer at Antithesis, a vendor of deterministic testing. He also serves on the core team for Pony, a language designed for safe concurrency, and co-wrote papers covering confidential containers. This article pulls from his posts, talks, and papers, alongside independent sources for each concept. When a source comes from Antithesis itself, we note it. We have no relationship with Antithesis or Allen.</p><p>Here is the plan:</p><ol><li><p>What &#8220;correct&#8221; means, and the languages that reject bad programs.</p></li><li><p>Why testing belongs at the end, and what comes before it.</p></li><li><p>Workloads, the bank test, and simulation.</p></li><li><p>Why quality does not work as a gate.</p></li><li><p>Tech debt you never pay down.</p></li><li><p>Supply chain attacks, which lack a good fix.</p></li><li><p>Garbage collection and tail latency.</p></li><li><p>Going slow in order to go fast.</p></li></ol><h2>Correct means it does its job and never pages anyone</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8rLc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8rLc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!8rLc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.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;:null,&quot;alt&quot;:&quot;Allen's working definition: does what it should, never wakes anyone up&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="Allen's working definition: does what it should, never wakes anyone up" title="Allen's working definition: does what it should, never wakes anyone up" srcset="https://substackcdn.com/image/fetch/$s_!8rLc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8rLc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e3970d8-01f2-414d-a170-276b3d86a5d5_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Allen&#8217;s working definition: does what it should, never wakes anyone up</figcaption></figure></div><p>If you ask ten engineers to define &#8220;correct&#8221; you will get ten different answers. Allen takes a practical view. &#8220;I carried a pager for years,&#8221; he wrote in May 2026. &#8220;My idea of beautiful code is code that does what it is supposed to and never wakes anyone up at 3 am.&#8221;</p><p>He made a similar point back in 2020 on the CoRecursive podcast. &#8220;For me, beautiful is, I&#8217;ve written you, you work.&#8221; He pointed to a system he built at PubMatic as an example: &#8220;Running for a year, not one teeny tiny little issue.&#8221;</p><p><strong>Correctness starts with a question, not a test.</strong> In his April 2026 post &#8220;How Do I Know It&#8217;s Working?&#8221;, Allen explains his approach to design: &#8220;The design is guided by one question: how will I know it&#8217;s working?&#8221;</p><p>The trouble is that people usually cannot answer that question upfront. Allen used to run a design exercise for job candidates. He asked for an in-memory key/value store supporting put, get and delete, optional expiry, thread safety, and &#8220;95th-percentile reads under a millisecond at ten million keys.&#8221; Candidates came up with hash maps, sharded maps, and skip lists. Every design met the performance targets, yet almost no one could explain how to verify that the store actually worked. That exposes a deeper gap. &#8220;What does &#8216;correct&#8217; even mean when two writes hit the same key at the same time? The spec didn&#8217;t say.&#8221;</p><p>People in formal methods call these answers invariants. They are properties that must always hold true. An account balance never drops below zero. An acknowledged write is never lost. Allen quotes Leslie Lamport on this: &#8220;If you&#8217;re thinking without writing, you only think you&#8217;re thinking.&#8221; Allen puts it his own way: &#8220;You aren&#8217;t really designing until you&#8217;ve started writing down how you&#8217;ll know it works.&#8221;</p><p><strong>If you run agents:</strong> an agent will happily build all three key/value stores. It will not tell you which property matters when two writes collide. That decision is still yours, and it has to be written down before the agent starts.</p><h2>Ada refused his programs, and C let him shoot himself</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nic2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nic2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nic2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.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;:null,&quot;alt&quot;:&quot;Ada would not compile his unsafe code; C compiled it and segfaulted&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="Ada would not compile his unsafe code; C compiled it and segfaulted" title="Ada would not compile his unsafe code; C compiled it and segfaulted" srcset="https://substackcdn.com/image/fetch/$s_!Nic2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Nic2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4399c02-e94e-4018-a910-ee1f91fa8ec0_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ada would not compile his unsafe code; C compiled it and segfaulted</figcaption></figure></div><p>Allen learned to program on Ada and C. His 2016 post &#8220;Learning From Ada&#8221; tells what happened. He spent two weeks on Ada. &#8220;It took me forever to get any of my programs to compile.&#8221; C was easier. &#8220;The C compiler made me feel adequate.&#8221;</p><p>Then the bill came. &#8220;I spent a ton of time in C dealing with code that segfaulted.&#8221; Over years he built a private rulebook for C and C++: how to share memory, when to make data immutable, how to thread safely. They were, he wrote, &#8220;patterns to avoid dangerous code that the Ada compiler wouldn&#8217;t let me write in the first place.&#8221;</p><p>Ten years later, in April 2026, he put it in one line. <strong>&#8220;Ada&#8217;s compiler being annoying was Ada doing its job.&#8221;</strong> His 2016 post ends with his rule: stick with &#8220;the language whose compiler is trying to tell me I&#8217;m doing it wrong.&#8221;</p><p>Ada still exists, and its vendors now pitch it against Rust. AdaCore&#8217;s 2024 comparison table rates strong typing as &#8220;Yes&#8221; for Ada and &#8220;Limited&#8221; for Rust. For contracts such as preconditions and invariants, it lists Ada as &#8220;Yes, checked at run-time&#8221;, SPARK as &#8220;Yes, checked statically, via proof&#8221;, and Rust as &#8220;No&#8221;. AdaCore sells Ada tools, so read that table as a vendor&#8217;s view. Its claim for SPARK is strong: proving properties &#8220;with 100% certainty via mathematical proof&#8221; can &#8220;eliminate many unit-level tests.&#8221;</p><p>The lesson is not &#8220;use Ada&#8221;. It is that a compiler which says no early is cheaper than a pager that rings late. Every rule Allen kept in his head for C was a rule a person could forget on a tired day. A compiler does not get tired.</p><p><strong>If you run agents:</strong> an agent&#8217;s private rulebook is its prompt, and it forgets that too. Rules the compiler enforces hold on every build. Rules in a markdown file hold when the model feels like it.</p><h2>Memory-safe code cut Android&#8217;s memory bugs from 76% to under 20%</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fi7i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fi7i!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fi7i!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Memory-safety bugs as a share of Android vulnerabilities: 76% in 2019, 24% in 2024, under 20% in 2025&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="Memory-safety bugs as a share of Android vulnerabilities: 76% in 2019, 24% in 2024, under 20% in 2025" title="Memory-safety bugs as a share of Android vulnerabilities: 76% in 2019, 24% in 2024, under 20% in 2025" srcset="https://substackcdn.com/image/fetch/$s_!Fi7i!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!Fi7i!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7bf3228-6b29-4363-b5d8-fa1fe3fbb63a_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Memory-safety bugs as a share of Android vulnerabilities: 76% in 2019, 24% in 2024, under 20% in 2025</figcaption></figure></div><p>Android gives us the strongest public evidence for languages that reject broken programs.</p><p>In September 2024, Google&#8217;s security team reported that memory-safety issues &#8220;accounted for 76% of Android vulnerabilities in 2019, and are currently 24% in 2024, well below the 70% industry norm.&#8221; This happened, it explained, because new development &#8220;shifted to memory safe languages&#8221;. Nobody went back to rewrite the old C and C++ code. Engineers just stopped piling new unsafe code on top of it.</p><p>A November 2025 update showed even more progress. <strong>Memory-safety bugs fell &#8220;below 20% of total vulnerabilities for the first time.&#8221;</strong> Android includes roughly 5 million lines of Rust. Across all that code, only one potential memory-safety bug turned up, and it was fixed before release. That comes out to 0.2 per million lines. By comparison, Android&#8217;s legacy C and C++ code sits &#8220;closer to 1,000 memory safety vulnerabilities per MLOC.&#8221; Google calls this &#8220;a 1000x reduction.&#8221;</p><p>This extra safety did not slow teams down. Rust changes went through about 20% fewer revisions and took about 25% less time in code review. For medium and large changes, the rollback rate dropped to about a quarter of the C++ rate.</p><p>Governments agree with this approach. CISA and the NSA released joint guidance in June 2025 stating that memory-safe languages offer &#8220;the most comprehensive mitigation against this class of vulnerabilities.&#8221; CISA and the FBI also classify the lack of a memory-safety roadmap for existing unsafe products as a bad practice that &#8220;significantly elevates risk to national security.&#8221;</p><p><strong>If you run agents:</strong> a quarter less review time per change is exactly where agent teams hurt. When the language rules out a whole class of bug, reviewers spend less time on it, whoever wrote the code.</p><h2>ML-family languages turn a missed case into a compile error</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8MII!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8MII!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!8MII!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!8MII!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!8MII!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!8MII!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Add a sixth case to a sum type and the compiler lists every place that ignores it&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="Add a sixth case to a sum type and the compiler lists every place that ignores it" title="Add a sixth case to a sum type and the compiler lists every place that ignores it" srcset="https://substackcdn.com/image/fetch/$s_!8MII!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!8MII!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!8MII!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!8MII!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59871eae-437a-4493-a0a0-36a5a1a11f29_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add a sixth case to a sum type and the compiler lists every place that ignores it</figcaption></figure></div><p>Most popular languages trace back to ALGOL. They share block structure, local variables, and statements that mutate state. C, C++, Python, Ruby, and Perl all belong to this group. Another family comes from ML, which Robin Milner started at Edinburgh in 1973. Standard ML, OCaml, and F# are built around strong type systems.</p><p>Rust is the most widely known language with ML roots. The Rust Reference lists its very first influence as &#8220;SML, OCaml: algebraic data types, pattern matching, type inference.&#8221;</p><p>The feature that really matters here is the sum type, where a value is strictly one of several named cases. Pair that with exhaustive matching and the compiler verifies that you handled every case. The Rust book states this plainly: &#8220;Matches in Rust are exhaustive.&#8221; If you forget one, the build fails with error E0004, &#8220;non-exhaustive patterns&#8221;. OCaml runs this check too, though it defaults to a warning instead of a failed build.</p><p><strong>Add a sixth case to a five-case type, and the compiler walks every match in the codebase and points at each one that ignores it.</strong></p><p>Allen experienced this firsthand. In his May 2026 post &#8220;Spooky Action at a Distance&#8221;, he wrote about building a customer-defined type system in Go using the visitor pattern. &#8220;It took me less than a week before I realized I didn&#8217;t want to be on call for this thing.&#8221; He moved the project to F#, which &#8220;has discriminated unions and exhaustive pattern matching.&#8221; One year later, the team had to overhaul the type system. &#8220;It was easy.&#8221; Adding optional types later on was &#8220;Ridiculously easy.&#8221; His takeaway was simple: &#8220;I&#8217;m not the one doing the chasing. The compiler is.&#8221;</p><p><strong>If you run agents:</strong> this is the cheapest review there is. When an agent adds a case, the compiler produces the list of places to change. Without it, a reviewer has to remember them.</p><h2>Typed languages are rising because agents need them</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eFKU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eFKU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!eFKU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.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;:null,&quot;alt&quot;:&quot;TypeScript passed Python and JavaScript on GitHub in August 2025&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="TypeScript passed Python and JavaScript on GitHub in August 2025" title="TypeScript passed Python and JavaScript on GitHub in August 2025" srcset="https://substackcdn.com/image/fetch/$s_!eFKU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!eFKU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f20a0f0-e114-478a-a1d1-3c3a4b708726_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">TypeScript passed Python and JavaScript on GitHub in August 2025</figcaption></figure></div><p>GitHub saw an unusual shift in August 2025. By contributor count, <strong>TypeScript overtook both Python and JavaScript</strong>. The language added over 1 million contributors in 2025, a 66% jump in a single year. GitHub attributed this growth to &#8220;typed languages that make agent-assisted coding more reliable in production.&#8221; It also pointed out that JavaScript and Python still lead in other rankings.</p><p>Research from ETH Zurich and UC Berkeley in 2025 shows the reason. They tested LLM-written TypeScript and found that &#8220;on average 94% of compilation errors result from failing type checks.&#8221; Constraining code generation with the type system cut compile errors by over half. At GitHub, Cassidy Williams referenced this paper in January 2026, calling types &#8220;the safety net for code you didn&#8217;t write yourself.&#8221;</p><p>TypeScript lead architect Anders Hejlsberg explained the goal during a November 2025 GitHub interview: &#8220;box in AI workflows with just enough determinism that they stay useful without going off the rails.&#8221; He cautioned that asking AI to translate half a million lines of code directly means &#8220;it might hallucinate.&#8221; The better path is asking it to build a deterministic translator.</p><p>Allen tried this approach on his own language. In his March 2026 post &#8220;Teaching Claude to Write Pony&#8221;, he noted that just a year prior, &#8220;every LLM I tested on Pony produced&#8221; an uncompilable mix of Python and Pony. Using Claude Code with a detailed instruction list, &#8220;it compiled which was more than I&#8217;d ever gotten before.&#8221; His rules for the agent borrow a core principle from the ML community: make illegal states unrepresentable.</p><p>Still, he ran into the limits of the agent. While struggling with the types in Pony&#8217;s property testing library, PonyCheck, Claude &#8220;declared that the library was broken and unusable.&#8221; Allen summed this up as &#8220;a very frustrated junior engineer move.&#8221;</p><p><strong>If you run agents:</strong> the type checker is a reviewer that never sleeps. The stricter it is, the more agent mistakes stop at build time.</p><h2>The best test is the one the compiler makes unnecessary</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Cch!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Cch!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Cch!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/893783ce-170a-464b-887e-3ccfda77970b_1600x900.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;:null,&quot;alt&quot;:&quot;Allen's order of preference: make the bug impossible, then test what is left&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="Allen's order of preference: make the bug impossible, then test what is left" title="Allen's order of preference: make the bug impossible, then test what is left" srcset="https://substackcdn.com/image/fetch/$s_!0Cch!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cch!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893783ce-170a-464b-887e-3ccfda77970b_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Allen&#8217;s order of preference: make the bug impossible, then test what is left</figcaption></figure></div><p>For someone who works on testing full time, Allen opens his April 2026 post in a surprising way. &#8220;No one cares about testing.&#8221; And then: &#8220;I don&#8217;t value tests. Tests are a means to an end.&#8221; In another post he repeats it: &#8220;I don&#8217;t care about tests. I care about a working system.&#8221;</p><p>The point is order. <strong>&#8220;The strongest move is to make the failure impossible.&#8221;</strong> The compiler answers &#8220;is it working?&#8221; every time you build. In Pony, data races on shared mutable state &#8220;aren&#8217;t expressible. The compiler refuses to compile code that could race.&#8221; Hence his line: &#8220;The compiler is the test I didn&#8217;t have to write.&#8221;</p><p>The phrase behind this comes from Yaron Minsky of Jane Street. In a 2011 lecture on OCaml he showed a slide titled &#8220;Make illegal states unrepresentable&#8221;. His example was a connection record with a state field and a pile of optional fields, most of which made no sense in most states. The fix was to give each state only the data it can have. Bad combinations then cannot be built at all.</p><p>Allen puts the rule straight into his agent instructions. His global CLAUDE.md, quoted in his March 2026 post, says: &#8220;Make illegal states unrepresentable: Centralize validation at the construction boundary so the rest of the code can trust its inputs.&#8221; In dynamic languages he asks the agent to &#8220;enforce this by convention with validated types&#8221;.</p><p>Testing still has a design role, especially for APIs. Martin Fowler&#8217;s description of test-driven development (TDD) says that &#8220;thinking about the test first forces us to think about the interface to the code first.&#8221; Allen makes the same point about systems: know &#8220;how we&#8217;ll test the thing before we start building it,&#8221; and design it to be easy to test &#8220;instead of bolting tests on after.&#8221; We love TDD for the same reason: our own product, forge, is built test-first throughout.</p><p>Manual testing sits at the bottom of the list. It comes last, costs most and repeats worst.</p><p><strong>If you run agents:</strong> put the constraint in a type, not a test. An agent can delete a failing test. It cannot ship code the compiler refuses.</p><h2>Hard-coded answers are why property-based testing exists</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ssck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ssck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ssck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.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;:null,&quot;alt&quot;:&quot;Example tests can be passed by hard-coding; random inputs and properties cannot&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="Example tests can be passed by hard-coding; random inputs and properties cannot" title="Example tests can be passed by hard-coding; random inputs and properties cannot" srcset="https://substackcdn.com/image/fetch/$s_!Ssck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Ssck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c60206-a279-4d0f-a274-29e3e323ec93_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example tests can be passed by hard-coding; random inputs and properties cannot</figcaption></figure></div><p>In a classic pairing exercise, one person writes a test and the other writes the smallest amount of code to pass it. On an April 2026 episode of Antithesis&#8217;s Bug Bash podcast, Allen talked about playing it this way. He simply hard-coded every expected answer until his partner had to admit they needed random inputs.</p><p>Scott Wlaschin wrote the definitive take on this in 2014. His &#8220;Enterprise Developer from Hell&#8221; passes every addition test by using a lookup table. Given 1 and 2 it returns 3, given 2 and 2 it returns 4, and for anything else it returns 0. <strong>The fix is to stop picking examples and start stating properties</strong>. Addition is commutative, and adding zero changes nothing. You can use random inputs to check both rules, though Wlaschin warns that coming up with good properties &#8220;is the hardest part.&#8221;</p><p>The underlying concept goes back further. Koen Claessen and John Hughes introduced QuickCheck at ICFP in 2000. In their setup, properties are Haskell functions that &#8220;can be automatically tested on random input.&#8221; They pointed out that testing can take &#8220;up to 50% of the cost of software development.&#8221; Later, Hypothesis brought this approach to Python. You write tests &#8220;which should pass for all inputs&#8221; within a given range, and the library chooses which inputs to try.</p><p>Agents have gotten good at this task. In October 2025, a research group including Anthropic staff ran an agent across 100 popular Python packages to write Hypothesis property tests. Across all the bugs it flagged, 56% were valid. Within the 21 top-scoring reports, 86% were valid. The team reported 5 bugs to maintainers, including 4 with patches, and 3 of those patches were merged.</p><p><strong>If you run agents:</strong> an agent asked for unit tests may write tests that match its own code, bugs included. Ask instead for properties that must hold for any input. Then the test checks the requirement, not the implementation.</p><h2>A workload keeps running and keeps checking</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pC_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pC_V!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!pC_V!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A workload loop: generate operations, inject faults, check invariants, repeat&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 workload loop: generate operations, inject faults, check invariants, repeat" title="A workload loop: generate operations, inject faults, check invariants, repeat" srcset="https://substackcdn.com/image/fetch/$s_!pC_V!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!pC_V!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01736d20-4d0e-4825-9f9e-203ec7c841ec_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A workload loop: generate operations, inject faults, check invariants, repeat</figcaption></figure></div><p>A unit test runs once, then passes or fails. Workloads work differently. On that same April podcast, Antithesis engineer Marco Primi described a workload as something that will &#8220;keep running, keep doing stuff, keep checking that invariants&#8221; hold true. <strong>A workload is generated operations plus a validator.</strong></p><p>The episode&#8217;s summary makes a strong claim: &#8220;even a workload as &#8216;dumb&#8217; as a basic while true loop can expose silent data loss that your unit tests would never catch.&#8221; Primi gave the example of a single producer in an endless loop, pushing messages into a queue. He checked two invariants: the offset only goes up, and the producer never gets stuck for over a minute. Within a few days, this setup surfaced several bugs that could stall the system or lose data.</p><p>Jepsen describes the exact same approach for testing databases: &#8220;we construct random operations, apply them to the system, and construct a concurrent history of their results. That history is checked against a model.&#8221;</p><p>Pure randomness has a flaw, though, because it just wanders around. Antithesis showed this problem on the game Gradius in February 2025. Random button presses carry a bias. Pressing up and down at the same time moves the ship down, so pure random input makes the ship drift toward the bottom. Also, holding a single button for N frames by sheer chance gets very unlikely as N grows. To fix this, Antithesis generates correlated runs of input and judges which system states are worth exploring further. FoundationDB&#8217;s team tuned its fault rates for the very same reason. Injecting too many faults traps the system in a tiny corner of its state space.</p><p>A good workload starts simple and slowly ratchets up by adding more clients, longer runs, and more kinds of faults. On the episode, Allen advised starting from old bug reports. Past bugs show which invariants people actually care about, &#8220;even if nobody&#8217;s spoken them out loud.&#8221;</p><p><strong>If you run agents:</strong> Antithesis said in September 2026 that its agents now write such workloads. In tests on rqlite, the agent&#8217;s workloads broke 11 of 13 safety properties after 19 injected mutants across 46 runs, and found 3 new bugs. That is the vendor&#8217;s own result.</p><h2>The bank test made money appear from nowhere</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-rKH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-rKH!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-rKH!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Jepsen's bank test: $100 in total became $136 after a crash&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="Jepsen's bank test: $100 in total became $136 after a crash" title="Jepsen's bank test: $100 in total became $136 after a crash" srcset="https://substackcdn.com/image/fetch/$s_!-rKH!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!-rKH!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc597c8b8-f3c9-4cb8-ba58-e46752edff1b_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Jepsen&#8217;s bank test: $100 in total became $136 after a crash</figcaption></figure></div><p>The best known workload is tiny. You open a few accounts with a fixed total, then run lots of concurrent transfers between them and read every balance. That total sum should never change. When it does, the database has broken its isolation promise.</p><p>As Jepsen notes, the bank test &#8220;was originally designed to verify snapshot isolation in Galera Cluster.&#8221; Running it against MariaDB with Galera and Percona XtraDB Cluster proved that &#8220;neither system offered snapshot isolation.&#8221;</p><p>This test catches concrete failures. During a March 2019 test of YugaByte DB 1.1.9, reading accounts with a $100 total &#8220;could return $102, $85, or $180.&#8221; In a June 2019 test of TiDB 2.1.7, <strong>the total drifted on a healthy cluster, &#8220;doubling in under thirty seconds.&#8221;</strong> Crashing a single component made the total jump: it &#8220;rose from $100 to $136.&#8221; Vendors fixed both bugs. Still, the March 2026 Jepsen report on MariaDB Galera showed the system &#8220;allows P4 (Lost Update)&#8221; even when no faults occur.</p><p>Allen likes the bank test, though he adds a caveat. On the April podcast, he mentioned that the test is fine on its own, yet it only tests transfers. While working on an embedded database, he could reliably corrupt data by running concurrent updates alongside a delete of a different row. The bank test never tries that combination. The takeaway here is to keep the test simple while widening the mix of operations.</p><p>Look at what all these bugs share. Every one of these databases had unit tests, yet none of those tests threw thousands of concurrent transfers at the system while a node crashed.</p><p><strong>If you run agents:</strong> any agent-built service that moves money, credits or inventory needs its own bank test. It takes an afternoon to write. It checks one sum. It catches the bugs that reviews miss.</p><h2>Simulation runs millions of failures a night</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SJRK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SJRK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!SJRK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.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;:null,&quot;alt&quot;:&quot;FoundationDB: 5 to 10 million simulation runs a night; TigerBeetle: nearly 2 millennia of simulated runtime a day&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="FoundationDB: 5 to 10 million simulation runs a night; TigerBeetle: nearly 2 millennia of simulated runtime a day" title="FoundationDB: 5 to 10 million simulation runs a night; TigerBeetle: nearly 2 millennia of simulated runtime a day" srcset="https://substackcdn.com/image/fetch/$s_!SJRK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!SJRK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e0a7dd4-4f5a-4502-a730-d330071c01f2_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">FoundationDB: 5 to 10 million simulation runs a night; TigerBeetle: nearly 2 millennia of simulated runtime a day</figcaption></figure></div><p>Jepsen made fault injection famous. Kyle Kingsbury started the series in May 2013 to show how databases behave under network partitions. Many test suites, Jepsen notes, &#8220;only evaluate the behavior of healthy clusters.&#8221;</p><p>FoundationDB took the idea further. Its 2021 SIGMOD paper describes running the real database code &#8220;together with randomized synthetic workloads and fault injection, in a deterministic discrete-event simulation.&#8221; The simulator injects machine, rack and data center failures, network partitions, latency and disk faults. Because it is deterministic, any failure can be replayed exactly. <strong>Apple&#8217;s CloudKit has run FoundationDB &#8220;for more than 0.5M disk years without a single data corruption event.&#8221;</strong></p><p>Will Wilson, who later co-founded Antithesis, described the scale at Strange Loop in 2014: &#8220;we can run 5 to 10 million simulation runs per night.&#8221;</p><p>TigerBeetle runs the same approach. Its VOPR simulates a whole cluster, including clocks, disks and network. In November 2024 it moved to 1,000 cores. With time sped up about 700 times, that adds up to &#8220;nearly 2 millennia of simulated database runtime per day.&#8221; In June 2025 Jepsen still found a bug the simulator missed, because Jepsen corrupted whole disk sectors instead of single bits. No tool sees everything.</p><p>Allen&#8217;s own team built this into Wallaroo, his stream processing company. His May 2026 post on Wilson lists their method: &#8220;Change the orderings. Drop the messages. Kill the nodes.&#8221; Antithesis now sells the approach as a product, running software deterministically on its own hypervisor.</p><p><strong>If you run agents:</strong> simulation turns &#8220;it worked on my laptop&#8221; into millions of laptops, each having a bad day. Agent-written systems need that more, because nobody built a mental model of the code while typing it.</p><h2>Real outages look like the bugs these tests hunt</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CVcA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CVcA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!CVcA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.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;:null,&quot;alt&quot;:&quot;AWS's October 2025 outage began with a latent race condition&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="AWS's October 2025 outage began with a latent race condition" title="AWS's October 2025 outage began with a latent race condition" srcset="https://substackcdn.com/image/fetch/$s_!CVcA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!CVcA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72fd0140-3922-4d61-84cc-52ce8dd5e1d4_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AWS&#8217;s October 2025 outage began with a latent race condition</figcaption></figure></div><p>AWS&#8217;s us-east-1 region suffered a major outage across October 19 and 20, 2025, starting at 11:48 PM PDT on October 19 and lasting until 2:20 PM PDT the next day. AWS&#8217;s own summary names the cause: &#8220;a latent race condition in the DynamoDB DNS management system that resulted in an incorrect empty DNS record.&#8221; One of two automated DNS updaters ran unusually slowly, and the two interacted in an unlikely way.</p><p>Lorin Hochstein, who writes on incident analysis, noted that DNS came back by 2:25 AM, though full recovery waited until 3:01 PM, &#8220;over twelve and a half hours later.&#8221; His broader takeaway: &#8220;The only thing we can really predict about future high-severity incidents is that they are going to surprise us.&#8221;</p><p>His December 2025 write-up of AWS&#8217;s re:Invent talk adds the main detail. After the incident, AWS built a TLA+ model. <strong>&#8220;The original design didn&#8217;t have this race condition, but later incremental changes to the system did introduce it.&#8221;</strong> Five separate reliability mechanisms combined to trigger the bug. AWS also used AI to verify that the model matched the code.</p><p>Antithesis reports a similar story about etcd in an October 2026 post. A linearizability bug &#8220;had already caused production outages, but nobody knew what caused it.&#8221; It happened when a leader paused, the cluster elected a new leader, and the old one woke up &#8220;still thinking it was in charge.&#8221; That is the vendor&#8217;s account of its own find.</p><p>Workloads and models exist to catch bugs like these. Every individual step looked safe on its own, and the failure lived entirely in the ordering of events.</p><p><strong>If you run agents:</strong> agents make many small, reasonable changes. That is exactly how the AWS race arrived: not in the design, but in increments. Re-check invariants after changes, not only at design time.</p><h2>Review only feels like a gate</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZNe-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZNe-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZNe-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.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;:null,&quot;alt&quot;:&quot;DORA 2024: elite teams fail 5% of changes, low performers 40%&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="DORA 2024: elite teams fail 5% of changes, low performers 40%" title="DORA 2024: elite teams fail 5% of changes, low performers 40%" srcset="https://substackcdn.com/image/fetch/$s_!ZNe-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZNe-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad44742-eeac-4912-83ad-afc702551ac9_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DORA 2024: elite teams fail 5% of changes, low performers 40%</figcaption></figure></div><p>In a May 2026 post on trunk-based development, Allen includes a section titled &#8220;Quality is not a gate.&#8221; He sums it up simply: &#8220;The pull request was never the quality gate we pretend it is.&#8221; He adds that <strong>&#8220;Review works just enough to feel like a gate. It does not work well enough to be one.&#8221;</strong></p><p>Instead, he argues for building in quality from the very first line. According to him, what actually cuts bug counts is &#8220;Building the software so the bug can&#8217;t be expressed in the first place,&#8221; alongside testing designed in from the start. His guiding rule is &#8220;Detect and recover beats predict and prevent.&#8221; In this model, the true gate is &#8220;the tests, running against the real main, all day.&#8221;</p><p>Safety science backs up the idea that a single layer never suffices. In 2000, James Reason published his Swiss cheese model in the BMJ, picturing defences as slices full of holes that &#8220;are continually opening, shutting, and shifting.&#8221; When the holes align, accidents happen. Think of review, CI, static analysis, and monitoring as individual slices, where none of them acts as a solid wall.</p><p>We can see how effective teams operate in the 2024 DORA report. Elite teams ship 182 times more deployments per year than low performers, while keeping their change failure rate 8 times lower. These elite groups deploy on demand and fail on just 5% of changes. Meanwhile, low performers ship monthly or less and see a 40% failure rate. Slow releases did not buy them quality.</p><p>The DORA 2025 report brings agents into the picture. It notes that AI &#8220;amplifies what&#8217;s already there.&#8221; If a team lacks &#8220;strong automated testing, mature version control practices, and fast feedback loops, an increase in change volume leads to instability.&#8221;</p><p>Allen also addresses agents directly, writing: &#8220;If what you distrust is the code&#8217;s correctness, the gate is the wrong tool and the loop is the right one.&#8221;</p><p><strong>If you run agents:</strong> a human approval step on every agent pull request feels safe and scales badly. Put the effort into checks that run on every change, all day.</p><h2>Write the spec down and let a model checker break it</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B6ny!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B6ny!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!B6ny!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.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;:null,&quot;alt&quot;:&quot;AWS used TLA+ on 10 large systems; DynamoDB's model found bugs 35 steps deep&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="AWS used TLA+ on 10 large systems; DynamoDB's model found bugs 35 steps deep" title="AWS used TLA+ on 10 large systems; DynamoDB's model found bugs 35 steps deep" srcset="https://substackcdn.com/image/fetch/$s_!B6ny!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!B6ny!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e69a1-5981-4920-96b8-eaf6ca3d0da3_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AWS used TLA+ on 10 large systems; DynamoDB&#8217;s model found bugs 35 steps deep</figcaption></figure></div><p>Allen describes an ideal where a machine checks a written specification. Amazon showed that this approach works in production.</p><p>The paper &#8220;Use of Formal Methods at Amazon Web Services&#8221; (a September 2014 preprint, published in CACM in 2015) says AWS engineers started using formal specification and model checking in 2011. They applied TLA+ &#8220;on 10 large complex real-world systems&#8221; across &#8220;7 teams&#8221;. For the DynamoDB replication protocol, the model checker <strong>&#8220;Found 3 bugs, some requiring traces of 35 steps.&#8221;</strong> It also caught 2 bugs in S3 and 3 in EBS. Engineers picked up TLA+ from scratch and saw &#8220;useful results in 2 to 3 weeks.&#8221; The team tried Alloy as well.</p><p>Test suites cannot reliably catch a bug 35 steps deep, whereas a model checker explores every possible event ordering within a small model.</p><p>Static checks sit one level below formal specs. Google&#8217;s 2018 CACM paper on static analysis says these tools are &#8220;used daily by the majority of engineers at Google&#8221;. They catch &#8220;thousands of issues per day&#8221;, which engineers fix before checking in their code.</p><p>Language design offers another layer of defense. As Allen said in a July 2026 talk, the actor model provides &#8220;data race freedom by construction,&#8221; since each actor owns its state and communicates through messages. Pony takes this further: &#8220;the type system ensures at compile time that your concurrent program can never have data races,&#8221; and because it lacks locks, it cannot deadlock. Still, Allen points out a weak spot in the actor model. Any operation that spans multiple actors turns into a protocol, and protocols bring their own bugs.</p><p><strong>If you run agents:</strong> writing a TLA+ model used to cost weeks of expert time. Agents can now draft one from a design doc, as AWS used AI to check its model against code. The model is still only as good as the invariants a person chose.</p><h2>Everyone tests in production</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8rnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8rnb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!8rnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee64e832-0938-4bea-97be-eb81111c856a_1600x900.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;:null,&quot;alt&quot;:&quot;No tool proves correctness; production is the final test&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="No tool proves correctness; production is the final test" title="No tool proves correctness; production is the final test" srcset="https://substackcdn.com/image/fetch/$s_!8rnb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8rnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee64e832-0938-4bea-97be-eb81111c856a_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">No tool proves correctness; production is the final test</figcaption></figure></div><p>Charity Majors wrote it in 2019: &#8220;all of us test in production all the time. (At least, the good engineers do.)&#8221; Allen agrees. &#8220;You are going to ship bugs. Everybody ships bugs.&#8221; And: &#8220;A working system lives or dies in production.&#8221;</p><p>Jepsen, the most rigorous public tester of databases, states its own limit. &#8220;We cannot prove correctness, only find errors.&#8221; Hochstein&#8217;s account of the AWS outage adds that a model made at design time &#8220;wouldn&#8217;t have caught it then either, because it wasn&#8217;t there at design time.&#8221;</p><p>So the question is not whether you test in production, but whether you can see what happens there. <strong>Hard-to-define outputs still have invariants.</strong> A search may return many valid answers, but it must return something, and every result must match the query. Data from one account must never appear in another.</p><p>Datadog showed what invariant-first work finds. In an Antithesis case study from September 2026, Datadog engineer Joy Zhang said: &#8220;When our developers are designing new systems, they&#8217;re starting with invariants and test properties.&#8221; A research agent found a durability violation &#8220;within a couple of hours.&#8221; It sat on the ordinary path under ordinary load and was covered by existing tests. But those tests &#8220;weren&#8217;t framed around the invariant.&#8221; Datadog handles more than 100 trillion events a day.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:1735184}" data-component-name="PollToDOM"></div><p></p><p><strong>If you run agents:</strong> write two lists for each service. What must never happen (safety). What must eventually happen (liveness). Then make monitoring check both.</p><h2>Most debt gets worked around, not repaid</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HvKN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HvKN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HvKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.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;:null,&quot;alt&quot;:&quot;Allen's 2015 rule: most debt is worked around, not repaid&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="Allen's 2015 rule: most debt is worked around, not repaid" title="Allen's 2015 rule: most debt is worked around, not repaid" srcset="https://substackcdn.com/image/fetch/$s_!HvKN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!HvKN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f526c2-619b-419e-89bb-3fb930bafe6b_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Allen&#8217;s 2015 rule: most debt is worked around, not repaid</figcaption></figure></div><p>Ward Cunningham coined the debt metaphor at OOPSLA in 1992. He said, &#8220;Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite.&#8221; He also left a clear warning: &#8220;The danger occurs when the debt is not repaid.&#8221;</p><p>Allen pushed back on this in his 2015 post, &#8220;Of Debt and Decisions&#8221;. He shared the story of a 1990s intranet product built on a mix of Perl and Java. The team &#8220;barely had any source control&#8221; and &#8220;no automated testing&#8221;. Rather than pay down the debt, they just worked around it. A fix &#8220;couldn&#8217;t involve rewriting all the Perl code in Java.&#8221; So they built a socket bridge between Perl and Java. Allen also kept private MySQL patches to close the feature gap with SQL Server, and he spent three weekends patching the Linux kernel for speed.</p><p>&#8220;Here&#8217;s the thing though: we were making money.&#8221; That led to his main point: <strong>&#8220;Technical debt only hurts if you have to pay it back.&#8221;</strong> He wrote that the metaphor &#8220;is misleading,&#8221; since repayment is optional. Working around the mess is a valid path.</p><p>Martin Fowler arrived at a similar conclusion in a 2019 essay. You only pay interest on debt &#8220;when I have to work with that part of the software.&#8221; In practice, this means &#8220;crufty but stable areas of code can be left alone.&#8221;</p><p>Going the other way brings the risk of a full rewrite. Joel Spolsky used Netscape as his example when he called rewriting from scratch &#8220;the single worst strategic mistake that any software company can make,&#8221; and Allen&#8217;s team avoided that trap. Without tests, a rewrite was simply too risky.</p><p><strong>If you run agents:</strong> agents make rewrites cheap to type, which tempts teams to repay debt nobody is charging interest on. Ask first whether anyone works in that code. If not, leave it.</p><h2>Supply chain attacks now arrive every few weeks</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DVBC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DVBC!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!DVBC!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Major package and CI compromises, March 2025 to August 2026&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="Major package and CI compromises, March 2025 to August 2026" title="Major package and CI compromises, March 2025 to August 2026" srcset="https://substackcdn.com/image/fetch/$s_!DVBC!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!DVBC!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74ed940f-9eec-4ecb-a99f-50bc330d9ccf_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Major package and CI compromises, March 2025 to August 2026</figcaption></figure></div><p>Allen takes his bleakest view on supply chain security, noting that no good fix exists. Looking back at the past 18 months makes it clear why.</p><ul><li><p><strong>March 2025:</strong> Attackers compromised the tj-actions/changed-files GitHub Action from March 12 to 15. CISA warned users to &#8220;Rotate all identified secrets immediately.&#8221;</p></li><li><p><strong>August 26, 2025:</strong> Bad versions of Nx stayed live for roughly two hours. Attackers later used the stolen tokens to expose more than 5,500 private repositories to the public.</p></li><li><p><strong>September 2025:</strong> A phishing domain hijacked 18 packages, including chalk and debug, which see over 2 billion weekly downloads. Days after that, the Shai-Hulud worm infected over 500 npm packages. A second wave started on November 21, hitting 621 packages and leaking 14,206 secrets.</p></li></ul><p>The pace held steady into 2026. On March 19, attackers hijacked the Trivy security scanner, followed by LiteLLM on March 24. Then on March 31, axios, a package with more than 100 million weekly downloads, served a remote access tool for roughly three hours. <strong>On May 11, the Mini Shai-Hulud worm published 84 malicious versions across 42 TanStack packages</strong> using TanStack&#8217;s own release pipeline. On May 19, a single phished account took about 22 minutes to push 637 bad versions across 314 AntV packages. By August 4, Wiz reported a worm spreading via keyv to more than 400 packages.</p><p>GitHub pushed back. Their September 2025 plan restricted package releases to trusted publishing, short-lived tokens, and local publishing with two-factor authentication. Then on December 9, 2025, npm killed off all classic tokens. Logging in yields &#8220;a two-hour session token,&#8221; while write tokens expire after a maximum of 90 days.</p><p><strong>If you run agents:</strong> your agent installs packages faster than you read changelogs. Every incident above would reach an agent that runs <code>npm install</code> on a fresh branch.</p><h2>CI pipelines are the new front door</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hsVA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hsVA!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!hsVA!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;One compromised scanner led to a poisoned AI library&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="One compromised scanner led to a poisoned AI library" title="One compromised scanner led to a poisoned AI library" srcset="https://substackcdn.com/image/fetch/$s_!hsVA!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!hsVA!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4b5fa2-5221-4c85-800b-5d4070877346_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">One compromised scanner led to a poisoned AI library</figcaption></figure></div><p>Attackers look for the weakest link, and the build pipeline is usually it. Pipelines hold publish tokens and cloud keys while running code from many different places.</p><p>Consider the Nx attack. A workflow pasted a pull request title directly into a shell command. The token from that step triggered a publish job, where a malicious commit sent the npm token to an attacker&#8217;s webhook. The resulting malicious package then used a postinstall script to gather credentials.</p><p>A chain from March 2026 shows how far a single flaw can reach. Attackers used credentials that survived a rotation which &#8220;was not atomic&#8221; to publish a poisoned Trivy release. They also force-pushed 76 of 77 trivy-action tags to malicious commits. Their payload read secrets straight from the CI runner&#8217;s memory. <strong>LiteLLM believes the Trivy action in its own CI scanning workflow was how attackers reached it.</strong> On March 24, two poisoned LiteLLM releases sat on PyPI for roughly 40 minutes, turning a security scanner into the entry point for an AI library.</p><p>Package signatures failed to help in May. StepSecurity called the TanStack compromise &#8220;the first documented npm worm that produces validly-attested malicious packages.&#8221; That worm used hijacked OIDC tokens to publish through the project&#8217;s own pipeline, even with failing workflow tests. Provenance only proved where the package was built, saying nothing about whether the build itself was honest.</p><p>Putting AI agents into CI creates another entry point. Adnan Khan disclosed &#8220;Clinejection&#8221; in February 2026. Cline&#8217;s issue triage workflow fed issue titles straight into a prompt for Claude, which had shell access. A crafted title could trick it into installing an attacker&#8217;s commit. From there, cache poisoning reached the nightly release job and its publish tokens. One token survived rotation, letting an unauthorized cline 2.3.0 reach npm on February 17.</p><p><strong>If you run agents:</strong> any agent that reads untrusted text in CI is a shell for whoever writes that text. Give it no secrets and no publish rights.</p><h2>Coding agents are now targets of these attacks</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HSGN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HSGN!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HSGN!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Hallucinated package names: at least 5.2% for commercial models, 21.7% for open source models&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="Hallucinated package names: at least 5.2% for commercial models, 21.7% for open source models" title="Hallucinated package names: at least 5.2% for commercial models, 21.7% for open source models" srcset="https://substackcdn.com/image/fetch/$s_!HSGN!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!HSGN!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88b01b51-2792-4331-868f-83aa2c488ade_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hallucinated package names: at least 5.2% for commercial models, 21.7% for open source models</figcaption></figure></div><p>In August 2025, the Nx malware tried a new tactic. It invoked AI command line tools already installed on the victim&#8217;s machine, such as Claude, Gemini, and Q. It passed flags to bypass permission checks, turning the local agent into a search tool for the attacker. Wiz saw this work &#8220;in hundreds of cases.&#8221;</p><p>By 2026, worms were going straight after agent configurations. StepSecurity saw a May payload drop a <code>.claude/settings.json</code> file containing a session start hook, while also grabbing MCP configuration files for Claude and Kiro. Then the August keyv worm arrived. It pulled credentials for Claude, OpenAI, Codex, Cursor, and Gemini, maintaining persistence via Claude Code hooks. <strong>An agent&#8217;s settings file is now a place where malware hides.</strong></p><p>Agents also make up dependencies. For a USENIX Security 2025 paper, Spracklen and colleagues analyzed 576,000 code samples across 16 models. They saw hallucinated packages at a rate of &#8220;at least 5.2% for commercial models and 21.7% for open-source models.&#8221; That added up to 205,474 unique fake package names. If an attacker registers one of those names, any agent that repeats the hallucination will pull it down.</p><p>An April 2026 note from the Cloud Security Alliance on &#8220;slopsquatting&#8221; puts the problem clearly: &#8220;Agentic systems eliminate that checkpoint.&#8221; A human developer might stop and question an unfamiliar package name, while an agent with install permissions just runs it. The note points out that 43% of hallucinated names showed up across all 10 repeat runs, making them very predictable targets.</p><p><strong>If you run agents:</strong> restrict which registries and packages agents may install, review agent settings files like code, and treat a new dependency in an agent pull request as a security event.</p><h2>Cooldowns would have blocked 8 of 10 attacks, by free-riding</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1P4R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1P4R!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!1P4R!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b342c563-7950-47b7-8414-ec4452712549_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Exposure windows of 10 attacks: 8 lasted under a week&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="Exposure windows of 10 attacks: 8 lasted under a week" title="Exposure windows of 10 attacks: 8 lasted under a week" srcset="https://substackcdn.com/image/fetch/$s_!1P4R!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!1P4R!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb342c563-7950-47b7-8414-ec4452712549_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exposure windows of 10 attacks: 8 lasted under a week</figcaption></figure></div><p>Waiting is the simplest defense. With a dependency cooldown, your tools reject any package version published less than N days ago.</p><p>William Woodruff laid out the numbers for this in November 2025 by tracking how long 10 recent attacks remained live. Nx lasted 4 hours, chalk was under 12 hours, and tj-actions stayed up for 3 days. xz-utils ran for about 5 weeks. <strong>&#8220;8/10 attacks had windows of opportunity of less than a week.&#8221;</strong> A 7-day cooldown would have dodged all eight of them.</p><p>Package managers added support quickly. A March 2026 survey by Andrew Nesbitt tracks the rollout: Dependabot added a cooldown in July 2025, followed by pnpm and Yarn in September 2025. Bun shipped theirs in October 2025, uv in December 2025, pip in January 2026, and npm introduced <code>min-release-age</code> in February 2026.</p><p>This approach has a catch. As Cal Paterson wrote in April 2026: &#8220;dependency cooldowns work by free-riding on the pain and suffering of others.&#8221; Somebody still has to pull the compromised version first so the community notices it. If the whole ecosystem waits seven days, the attack simply fires on day eight. Paterson suggests holding new packages at the registry prior to distribution instead, much like Debian holds packages for 2 to 10 days before they enter testing.</p><p>Cooldowns bring real operational costs too. Legitimate security fixes get delayed right alongside malicious updates, so teams must build a fast path for reviewed, urgent patches. Nesbitt points out another hole: a developer can still manually install the newest version at any time.</p><p>The other standard defenses are using fewer dependencies and maintaining pinned forks. Both options shrink your attack surface in exchange for maintenance work that you have to take on yourself.</p><p><strong>If you run agents:</strong> set a cooldown in the package manager config your agents use, not in a guideline they may skip. Then decide who approves the exceptions.</p><h2>Installed code runs with your rights</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!brHL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!brHL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!brHL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!brHL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!brHL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!brHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.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;:null,&quot;alt&quot;:&quot;npm install runs package scripts through /bin/sh&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="npm install runs package scripts through /bin/sh" title="npm install runs package scripts through /bin/sh" srcset="https://substackcdn.com/image/fetch/$s_!brHL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!brHL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!brHL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!brHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F980bbd33-5070-4f94-adef-00e3591c8e49_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">npm install runs package scripts through /bin/sh</figcaption></figure></div><p>This problem persists because package managers were built on trust. CPAN, the Perl archive, has been &#8220;online since October 1995&#8221; and now holds over 33 million modules from 14,758 authors. Later registries copied this open model. Anyone can publish, and everyone installs.</p><p>Installing a package also means running code. The npm docs note that preinstall, install, and postinstall scripts trigger during <code>npm install</code> and <code>npm ci</code>. &#8220;Scripts are run by passing the line as a script argument to <code>/bin/sh</code>.&#8221; <strong>The code you download can do anything your account can do.</strong> Shai-Hulud 2.0 took advantage of the preinstall script so its payload executed even when the installation failed. It registered victims as self-hosted GitHub runners and included a failsafe to wipe local files.</p><p>In January 2025, pnpm changed its default behavior. Version 10 blocks lifecycle scripts unless you explicitly allow them. One contributor described the previous setup well: &#8220;It&#8217;s nuts that a [pnpm|yarn|npm] install can run arbitrary code in the first place.&#8221;</p><p>Sandboxes help, though they still leak. In November 2025, three runc vulnerabilities enabled &#8220;full container breakouts&#8221;. Two of those flaws affected every known version of runc.</p><p>Allen points out that this goes beyond a bug in a single tool. Every popular ecosystem made this exact tradeoff, giving code from strangers the same authority as code you wrote yourself.</p><p><strong>If you run agents:</strong> run agents in a disposable environment with no long-lived credentials. Assume anything they install can read everything they can.</p><h2>Object capabilities fix this in theory, and FFI breaks it</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tg6S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tg6S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tg6S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.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;:null,&quot;alt&quot;:&quot;A capability is the right to do one thing, passed explicitly&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 capability is the right to do one thing, passed explicitly" title="A capability is the right to do one thing, passed explicitly" srcset="https://substackcdn.com/image/fetch/$s_!Tg6S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!Tg6S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6abdc9c1-adb8-4477-837c-e95f138500c1_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A capability is the right to do one thing, passed explicitly</figcaption></figure></div><p>Research already has an answer for this: object capabilities. In his 2006 dissertation, &#8220;Robust Composition&#8221;, Mark Miller starts with the core problem. Programs built to cooperate &#8220;may instead destructively interfere in unanticipated ways.&#8221; He presents E, a secure distributed language, along with CapDesk, &#8220;a virus-safe desktop built in E.&#8221;</p><p>The concept is straightforward. <strong>Code can only do what it was handed the right to do.</strong> You pass a logging library a handle to one specific log file. It cannot open a network connection because nothing ever handed it network access.</p><p>Pony builds on this foundation. A 2015 paper by Clebsch and colleagues, &#8220;Deny Capabilities for Safe, Fast Actors&#8221;, credits the capability term to Miller. Allen presented that paper at Papers We Love in 2020, calling it &#8220;the core novel idea behind the Pony programming language.&#8221; Mainstream tools have adopted pieces of this model. Deno is &#8220;secure by default&#8221;, blocking file, network, and environment access until explicitly granted. WASI uses handles that are &#8220;unforgeable, so they can be used to pass around access to individual resources.&#8221;</p><p>The trouble starts with the foreign function interface. Deno&#8217;s docs warn that enabling <code>--allow-ffi</code> means &#8220;a native library runs as compiled machine code in the same process and can issue system calls directly.&#8221; They advise treating that flag just like <code>--allow-all</code>. Pony&#8217;s tutorial is equally blunt, noting that its safety guarantees &#8220;can be voided by calling FFI functions.&#8221; Pony at least provides a compile flag to restrict which packages are allowed to call C.</p><p>No popular language enforces object capabilities across its entire ecosystem, because most practical software relies on C libraries somewhere down the stack.</p><p><strong>If you run agents:</strong> agent tool permissions are capabilities in practice. Grant each tool one narrow right. A &#8220;run any shell command&#8221; tool is FFI with a friendly name.</p><h2>Hardware isolation comes with an asterisk</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T_LL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T_LL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!T_LL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.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;:null,&quot;alt&quot;:&quot;Interposers under $1,000 broke Intel and AMD confidential computing in 2025&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="Interposers under $1,000 broke Intel and AMD confidential computing in 2025" title="Interposers under $1,000 broke Intel and AMD confidential computing in 2025" srcset="https://substackcdn.com/image/fetch/$s_!T_LL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!T_LL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a572d5e-01dc-433a-9da2-7c853298431c_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Interposers under $1,000 broke Intel and AMD confidential computing in 2025</figcaption></figure></div><p>Hardware sits beneath the software, and it leaks too. On June 1, 2017, Google&#8217;s Project Zero reported Spectre and Meltdown to Intel, AMD and ARM, before publishing the details in January 2018. Meltdown &#8220;breaks the most fundamental isolation between user applications and the operating system.&#8221;</p><p>Fixing this cost performance. In February 2018, Brendan Gregg measured the Linux page table isolation patch overhead at &#8220;anything from 1% to over 800%,&#8221; hitting that upper bound on a system call heavy microbenchmark. He expected a 0.1% to 6% hit for Netflix&#8217;s cloud. The industry took the penalty and moved on.</p><p>Confidential computing aims to shield workloads from the host itself. In 2023, Allen co-wrote the Parma paper on confidential containers for Azure. Their design assumes &#8220;a powerful attacker who controls the untrusted host and hypervisor,&#8221; and it adds a 13% mean overhead on SPEC2017. The paper is upfront about its boundaries: <strong>&#8220;Anything not mentioned here, e.g., sidechannel attacks, are outside the scope of our threat model.&#8221;</strong> As he wrote in a March 2026 post: &#8220;In security, trust isn&#8217;t good. It&#8217;s a liability.&#8221;</p><p>Researchers walked right through that gap in 2025. Disclosed in October 2025, TEE.fail used a DDR5 memory bus interposer built for &#8220;under $1000&#8221; to break Intel TDX, SGX and AMD SEV-SNP. Battering RAM pulled off the DDR4 equivalent using hardware that &#8220;can be built for less than $50.&#8221; Both Intel and AMD consider physical attacks out of scope, and AMD has no plans for a firmware fix.</p><p>Every guarantee in this stack comes with fine print. You should still use these tools, provided you know which caveats you are signing up for.</p><p><strong>If you run agents:</strong> &#8220;the model runs in a secure enclave&#8221; is a claim with a threat model behind it. Ask what that model excludes.</p><h2>Pauses come from coordination, not from collecting</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UyiR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UyiR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!UyiR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.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;:null,&quot;alt&quot;:&quot;Java's ZGC pause goal: 10 ms in 2018, under 1 ms by 2023; G1 pauses range from milliseconds to seconds&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="Java's ZGC pause goal: 10 ms in 2018, under 1 ms by 2023; G1 pauses range from milliseconds to seconds" title="Java's ZGC pause goal: 10 ms in 2018, under 1 ms by 2023; G1 pauses range from milliseconds to seconds" srcset="https://substackcdn.com/image/fetch/$s_!UyiR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!UyiR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F189cf311-28c0-4741-a2c1-b672e9d30ee4_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Java&#8217;s ZGC pause goal: 10 ms in 2018, under 1 ms by 2023; G1 pauses range from milliseconds to seconds</figcaption></figure></div><p>In his April 2026 talk &#8220;GC Made Fast&#8221;, Allen opens by conceding a point: &#8220;stop-the-world collectors really do destroy your tail latencies.&#8221; Then he pivots. <strong>&#8220;&#8217;GC is slow&#8217; confuses the symptom with the cause. The real villain is coordination.&#8221;</strong> Each pause, atomic reference count, and lock-free reclamation scheme &#8220;is coordination over memory.&#8221;</p><p>Discord ran into this in production. A February 2020 post details why they rewrote their Read States service from Go to Rust. The old service suffered from &#8220;latency and CPU spikes roughly every 2 minutes,&#8221; since &#8220;Go will force a garbage collection run every 2 minutes at minimum.&#8221; The new Rust version &#8220;had no latency spikes!&#8221; Holding 8 million cached entries, its average response time fell to microseconds.</p><p>For a decade, runtime teams have worked to shrink these pauses. Rick Hudson from the Go team shared their progress at ISMM in 2018. On one production server, pause times dropped from roughly 300 to 400 ms down to 30 or 40 ms in August 2015. They fell to 4 or 5 ms, and then went under a millisecond by March 2017. By 2018, the target was 500 microseconds per cycle.</p><p>Java took a similar path. JEP 333 brought ZGC to JDK 11. The goal was that pauses &#8220;should not exceed 10ms,&#8221; trading away up to 15% of throughput compared to G1. JDK 16 reduced ZGC safepoint times to sub-millisecond levels. In JDK 21, Generational ZGC maintains the target that pauses &#8220;should not exceed 1 millisecond&#8221;. Meanwhile, that same JEP points out that the default G1 collector still pauses for &#8220;milliseconds to seconds.&#8221;</p><p>Look at the costs involved. Every reduction in pause time was paid for with either memory or throughput.</p><p><strong>If you run agents:</strong> latency spikes are hard to see in a code review and easy to see in a load test. When an agent picks a runtime or a cache size, test the tail, not the average.</p><h2>Per-actor heaps trade peak speed for flat latency</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_1yH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_1yH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!_1yH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.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;:null,&quot;alt&quot;:&quot;Pony: each actor collects its own heap, so there is no global pause&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="Pony: each actor collects its own heap, so there is no global pause" title="Pony: each actor collects its own heap, so there is no global pause" srcset="https://substackcdn.com/image/fetch/$s_!_1yH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!_1yH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9701722-30c8-4afb-b94b-8ed917f6450b_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pony: each actor collects its own heap, so there is no global pause</figcaption></figure></div><p>Pony takes a different approach by removing the coordination altogether. Allen&#8217;s talk abstract puts it plainly: &#8220;Actors own their own heaps. Each actor collects independently, using only local knowledge. No stop-the-world. Ever.&#8221; It adds: &#8220;This isn&#8217;t magic and it isn&#8217;t free. But the costs are local, not coordination costs.&#8221;</p><p>This design is called ORCA, and it was published at OOPSLA in 2017. Pony&#8217;s authors started with &#8220;the requirements of financial applications,&#8221; where Java&#8217;s GC pauses &#8220;were a stumbling block for adoption.&#8221; With ORCA, <strong>&#8220;each actor&#8217;s collection touches only a few megabytes of memory as opposed to an entire heap.&#8221;</strong> Collection cost scales with a single actor&#8217;s heap rather than the whole program. You pay for this in space for reference counts, along with work that only runs between behaviors. As Pony&#8217;s tutorial notes, a behavior that allocates a lot of memory &#8220;will not get any of it back until the behavior finishes.&#8221;</p><p>Trading firms on the JVM reached a similar place by hand. Martin Fowler&#8217;s 2011 article on LMAX describes a platform that processed 6 million orders per second on a single thread. &#8220;When you are trying to process millions of transactions per second with minimum jitter, a GC pause becomes a problem.&#8221; To get around this, the team wrote custom collections that were &#8220;careful with garbage.&#8221;</p><p>Arenas and slab allocators offer a middle ground. Jeff Bonwick&#8217;s 1994 slab allocator kept objects in their constructed state between uses. Google&#8217;s Go team proposed arenas in 2022 and reported &#8220;savings of up to 15% in CPU and memory usage&#8221; across large applications. That proposal has been &#8220;on hold indefinitely&#8221; since January 2023 due to API safety concerns. Managing memory by hand wins back speed at the expense of safety.</p><p><strong>If you run agents:</strong> the trade is the same at every level. Flat latency, peak throughput and safety pull against each other. Pick two, write down which, and test that the system keeps the promise.</p><h2>A rushed cutover tokenized on the letter a for months</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3-zm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3-zm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!3-zm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.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;:null,&quot;alt&quot;:&quot;A missing escape turned \&quot;&amp;amp;\&quot; into a tokenizer that split on the letter a for months&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 missing escape turned &quot;&amp;amp;&quot; into a tokenizer that split on the letter a for months" title="A missing escape turned &quot;&amp;amp;&quot; into a tokenizer that split on the letter a for months" srcset="https://substackcdn.com/image/fetch/$s_!3-zm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!3-zm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7379d12e-7531-4d3e-a766-06cb156fb667_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A missing escape turned &#8220;&amp;amp;&#8221; into a tokenizer that split on the letter a for months</figcaption></figure></div><p>Allen starts his May 2026 post, &#8220;Go Slow to Go Fast&#8221;, with a story he regrets. A team of three wanted to finish an Elasticsearch cutover before Christmas Eve, so they worked &#8220;overlapping twelve-hour shifts for several days.&#8221; By the end, they were &#8220;Loopy, exhausted, and proud of ourselves.&#8221;</p><p>Someone had pasted an XML-escaped <code>&amp;amp;</code> straight into a JSON config. <strong>For months, &#8220;we were tokenizing on a.&#8221;</strong> It took a long time for anyone to notice.</p><p>He shares a few more examples. One Super Bowl weekend vanished while merging two modules that depended on different major versions of an HTTP library. Another case involved a velocity bonus, a rushed feature copied into multiple places, 45 to 60 minute deploys, and a bug caused by &#8220;a &gt; that should have been a &gt;=&#8221;.</p><p>Allen defines going slow in practical terms. &#8220;It means writing a planning document and coming to agreement on what we&#8217;re doing before anyone touches code.&#8221; &#8220;It means knowing how we&#8217;ll test the thing before we start building it.&#8221; Finally, &#8220;It means stopping when production is on fire at 2 a.m.&#8221; just to figure out what you actually know.</p><p>His team at Wallaroo worked this way deliberately. First, they created &#8220;a slow, throwaway &#8216;Wallaroo&#8217; in Python&#8221; and built their test harness against that prototype. They also added fault injection &#8220;before we built the features that would need it.&#8221; When they picked Pony as their language, they willingly took on &#8220;Weeks of ramp time.&#8221; He sums it up simply: &#8220;We bought speed later by spending time up front.&#8221;</p><p>A rested engineer spots the <code>&amp;amp;</code> mistake, while a tired one ships it.</p><p><strong>If you run agents:</strong> agents never tire, but the people approving their work do. A pace set by agents produces the twelve-hour shift without anyone deciding to have one.</p><h2>Most design time is agreeing what words mean</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!244h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!244h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!244h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!244h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!244h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!244h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.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;:null,&quot;alt&quot;:&quot;Exactly-once: impossible as network delivery, possible as processing inside Kafka&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="Exactly-once: impossible as network delivery, possible as processing inside Kafka" title="Exactly-once: impossible as network delivery, possible as processing inside Kafka" srcset="https://substackcdn.com/image/fetch/$s_!244h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!244h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!244h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!244h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bf70d25-f932-4dc3-a105-b4ee3fb446c8_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exactly-once: impossible as network delivery, possible as processing inside Kafka</figcaption></figure></div><p>One question and a single word started the <code>&amp;amp;</code> bug. A coworker asked, &#8220;We want to keep the same tokenization rules, right?&#8221; Allen replied: &#8220;I said yes.&#8221; Both had different rules in mind.</p><p>Distributed systems have a well known case of this problem. Tyler Treat wrote &#8220;You Cannot Have Exactly-Once Delivery.&#8221; back in 2015. He argued that the Two Generals problem makes it impossible over a network. He also noted how engineers &#8220;often bend the meaning of &#8216;delivery&#8217; in order to make their system fit.&#8221;</p><p>Confluent announced exactly-once semantics for Kafka 0.11 in 2017. Their post answered him directly in the title: &#8220;Exactly-Once Semantics Are Possible.&#8221; They even quoted the skeptics: &#8220;Exactly-once delivery is impossible.&#8221; Kafka combined transactions with an idempotent producer to build it. For 1 KB messages, they measured only a 3% drop in throughput compared to ordered at-least-once delivery. <strong>Both sides were right. They disagreed about the word, not the maths.</strong> Treat was talking about network delivery. Confluent was talking about processing results within Kafka, relying on the exact idempotence escape hatch Treat had pointed out.</p><p>In 2017, researchers at Microsoft gave a similar trap a name: gray failure. Big cloud outages &#8220;tend to be caused by subtle underlying faults,&#8221; where one part struggles while another part misses the issue entirely. Their term for this is &#8220;differential observability.&#8221; Adding redundancy can actually make things worse. The system &#8220;works&#8221; under one definition while failing under another.</p><p>Released in September 2025, GitHub&#8217;s Spec Kit lays out the solution for agents: &#8220;Specs become the shared source of truth.&#8221; In this view, a spec &#8220;is a contract for how your code should behave.&#8221;</p><p><strong>If you run agents:</strong> an agent will say yes to an ambiguous request faster than any colleague. Define the words in the spec before the agent starts: &#8220;delivered&#8221;, &#8220;done&#8221;, &#8220;same rules&#8221;.</p><h2>Agents make upfront design pay off again</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aCYa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aCYa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!aCYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.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;:null,&quot;alt&quot;:&quot;Plan, then build: GitHub, AWS, OpenAI and Anthropic all now put the spec first&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="Plan, then build: GitHub, AWS, OpenAI and Anthropic all now put the spec first" title="Plan, then build: GitHub, AWS, OpenAI and Anthropic all now put the spec first" srcset="https://substackcdn.com/image/fetch/$s_!aCYa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!aCYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F327060bd-4c05-442d-bec5-ab0ee2948bed_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Plan, then build: GitHub, AWS, OpenAI and Anthropic all now put the spec first</figcaption></figure></div><p>We stopped doing big upfront design because building took too long and plans went stale. Agents change that cost. When implementation takes a few hours, the plan becomes most of the work.</p><p>The major tool makers agree. GitHub&#8217;s Spec Kit points out that agent code often &#8220;looks right, but doesn&#8217;t quite work,&#8221; so it uses four phases: Specify, Plan, Tasks and Implement, where &#8220;you don&#8217;t move to the next one until the current task is fully validated.&#8221; AWS launched Kiro in July 2025. They built the whole product around spec-driven development because with vibe-coded prototypes &#8220;you can&#8217;t tell if the application meets them.&#8221;</p><p>In February 2026, OpenAI wrote a post on &#8220;harness engineering&#8221; about a product with roughly 1 million lines of code, around 1,500 pull requests, and &#8220;0 lines of manually-written code,&#8221; built by three engineers merging 3.5 pull requests each per day. <strong>&#8220;Plans are treated as first-class artifacts.&#8221;</strong> They enforce rules &#8220;mechanically via custom linters&#8221; alongside structural tests. Even with those checks, the team &#8220;used to spend every Friday (20% of the week)&#8221; cleaning up bad patterns the agents copied.</p><p>Anthropic&#8217;s Claude Code guidance is blunt about skipping verification. &#8220;Claude stops when the work looks done.&#8221; If it lacks a check it can run itself, &#8220;that makes you the test suite.&#8221; Anthropic suggests writing a spec and a definition of done, and using hooks for actions that must happen every time, since Claude &#8220;is allowed to decide a guideline doesn&#8217;t apply.&#8221;</p><p>You cannot trust your gut on speed either. A July 2025 METR trial found experienced developers took 19% longer using AI tools, even though they thought they were 20% faster. A follow-up in February 2026 hinted at a speedup, though METR calls this &#8220;only very weak evidence.&#8221;</p><p>Allen&#8217;s advice from an older era holds up well: put in the time early, and know how you will verify that the system works.</p><p><strong>If you run agents:</strong> write the invariants, the spec and the test plan first. Hand the agent the plan, not the problem.</p><h2>Before you hand the work to agents</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZZwO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZZwO!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZZwO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Eight checks before agents ship code nobody reads in full&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="Eight checks before agents ship code nobody reads in full" title="Eight checks before agents ship code nobody reads in full" srcset="https://substackcdn.com/image/fetch/$s_!ZZwO!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!ZZwO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1caa1891-b107-4fef-931e-61515751fb1a_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Eight checks before agents ship code nobody reads in full</figcaption></figure></div><p>Allen&#8217;s work comes down to one order of operations. Make the bug impossible. Test what is left with workloads under faults. Watch production, because something will get through. For packages and hardware, know what you trusted.</p><p>As checks a team can run:</p><ol><li><p><strong>Write invariants first.</strong> For each service, list what must never happen and what must eventually happen.</p></li><li><p><strong>Push constraints into types.</strong> Sum types, exhaustive matches, validated constructors.</p></li><li><p><strong>Prefer memory-safe languages for new code.</strong> Android&#8217;s data is the evidence.</p></li><li><p><strong>Ask agents for properties, not examples.</strong></p></li></ol><p>Then the next four:</p><ol><li><p><strong>Run one simple workload under faults.</strong> A bank test for anything that moves value.</p></li><li><p><strong>Gate on continuous checks, not approvals.</strong></p></li><li><p><strong>Cooldown dependencies in config,</strong> with a reviewed fast path for urgent fixes.</p></li><li><p><strong>Give agents narrow capabilities and no long-lived secrets.</strong></p></li></ol><p>None of these needs a new tool. Most need a decision written down before code exists.</p><blockquote><p><strong>What to ask your team</strong></p><ul><li><p><strong>The risk:</strong> agent pull requests carry about 1.7 times more issues, and AI adoption still lowers delivery stability, per DORA 2025. Meanwhile packages ship worms through valid release pipelines.</p></li><li><p><strong>The cost:</strong> memory-safe code needed about 25% less review time at Google, and a 7-day cooldown would have blocked 8 of 10 recent attacks. Both are settings and choices, not headcount.</p></li><li><p>Which invariants does each of our critical services have written down, and what checks them on every change?</p></li><li><p>Do our agents install packages with a cooldown and without long-lived credentials?</p></li><li><p>If we removed human approval tomorrow, which automated check would catch a lost write?</p></li></ul></blockquote><p>Reply to this email with one number from your team: the share of merged pull requests last month that were mostly written by an agent, and whether a human read every line. We will publish what readers send, without names, in a future edition.</p><h2>Sources</h2><ul><li><p>GitHub, &#8220;Octoverse: A new developer joins GitHub every second as AI leads TypeScript to #1&#8221;, 28 Oct 2025 (github.blog)</p></li><li><p>CodeRabbit, &#8220;Our new report: AI code creates 1.7x more problems&#8221;, 17 Dec 2025 (coderabbit.ai)</p></li><li><p>Google Cloud, &#8220;Announcing the 2025 DORA Report&#8221;, 23 Sep 2025 (cloud.google.com)</p></li><li><p>DORA, &#8220;2025 State of AI-assisted Software Development&#8221; (services.google.com)</p></li><li><p>Sean T. Allen, &#8220;Trunk Based Development: Now More Than Ever&#8221;, 21 May 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;How Do I Know It&#8217;s Working?&#8221;, 27 Apr 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Spooky Action at a Distance&#8221;, 18 May 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Go Slow to Go Fast&#8221;, 7 May 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Teaching Claude to Write Pony&#8221;, 27 Mar 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Learning From Ada&#8221;, 22 Feb 2016 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Of Debt and Decisions&#8221;, 19 Apr 2015 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Will Wilson and Me&#8221;, 27 May 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;On When Concurrency Matters&#8221;, talk, 21 Jul 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;GC Made Fast&#8221;, talk and slides, 12 Apr 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;Parma for Mortals&#8221;, 6 Mar 2026 (seantallen.com)</p></li><li><p>Sean T. Allen, &#8220;On Deny Capabilities for Safe, Fast Actors&#8221;, Papers We Love, 8 Jan 2020 (seantallen.com)</p></li><li><p>CoRecursive, &#8220;Unproven Tech Case Study with Sean Allen&#8221;, 2020 (corecursive.com)</p></li><li><p>Antithesis, Bug Bash S2E8, &#8220;Why simple workloads find the hardest bugs&#8221;, 8 Apr 2026 (antithesis.com)</p></li><li><p>Antithesis, &#8220;Depth is all you need: how Antithesis crushes Gradius&#8221;, 21 Feb 2025 (antithesis.com)</p></li><li><p>Antithesis, &#8220;Why we taught agents to break distributed safety properties&#8221;, 25 Sep 2026 (antithesis.com)</p></li><li><p>Antithesis, &#8220;Testing Datadog&#8217;s Next-Generation Event Platform Intake with Antithesis&#8221;, 29 Sep 2026 (antithesis.com)</p></li><li><p>Antithesis, &#8220;Your agent can now ship reliable distributed systems&#8221;, 15 Oct 2026 (antithesis.com)</p></li><li><p>AdaCore, &#8220;Should I choose Ada, SPARK, or Rust over C/C++?&#8221;, 27 Sep 2024 (adacore.com)</p></li><li><p>Google Security Blog, &#8220;Eliminating Memory Safety Vulnerabilities at the Source&#8221;, 25 Sep 2024 (security.googleblog.com)</p></li><li><p>Google, &#8220;Rust in Android: move fast and fix things&#8221;, 13 Nov 2025 (blog.google)</p></li><li><p>CISA, &#8220;New Guidance Released for Reducing Memory-Related Vulnerabilities&#8221;, 24 Jun 2025 (cisa.gov)</p></li><li><p>CISA and FBI, &#8220;Product Security Bad Practices&#8221;, v2.0, 17 Jan 2025 (cisa.gov)</p></li><li><p>The Rust Reference, &#8220;Influences&#8221; (doc.rust-lang.org)</p></li><li><p>The Rust Programming Language, &#8220;The match Control Flow Construct&#8221; (doc.rust-lang.org)</p></li><li><p>Real World OCaml, &#8220;Lists and Patterns&#8221; (dev.realworldocaml.org)</p></li><li><p>GitHub, &#8220;Why AI is pushing developers toward typed languages&#8221;, 8 Jan 2026 (github.blog)</p></li><li><p>GitHub, &#8220;TypeScript&#8217;s rise in the AI era: Insights from Lead Architect, Anders Hejlsberg&#8221;, 6 Nov 2025 (github.blog)</p></li><li><p>M&#252;ndler et al., &#8220;Type-Constrained Code Generation with Language Models&#8221;, Apr 2025 (arxiv.org)</p></li><li><p>Yaron Minsky, &#8220;Effective ML Revisited&#8221;, 9 Mar 2011 (blog.janestreet.com)</p></li><li><p>Martin Fowler, &#8220;Test Driven Development&#8221;, 11 Dec 2023 (martinfowler.com)</p></li><li><p>Scott Wlaschin, &#8220;The Enterprise Developer from Hell&#8221;, 1 Dec 2014 (fsharpforfunandprofit.com)</p></li><li><p>Claessen and Hughes, &#8220;QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs&#8221;, ICFP 2000 (cs.tufts.edu)</p></li><li><p>Hypothesis documentation (hypothesis.readthedocs.io)</p></li><li><p>Maaz et al., &#8220;Agentic Property-Based Testing&#8221;, 10 Oct 2025 (arxiv.org)</p></li><li><p>Jepsen, &#8220;Analyses&#8221; (jepsen.io)</p></li><li><p>Jepsen, &#8220;YugaByte DB 1.1.9&#8221;, 26 Mar 2019 (jepsen.io)</p></li><li><p>Jepsen, &#8220;TiDB 2.1.7&#8221;, 12 Jun 2019 (jepsen.io)</p></li><li><p>Jepsen, &#8220;CockroachDB beta-20160829&#8221;, 16 Feb 2017 (jepsen.io)</p></li><li><p>Jepsen, &#8220;MariaDB Galera Cluster 12.1.2&#8221;, 16 Mar 2026 (jepsen.io)</p></li><li><p>Jepsen, &#8220;TigerBeetle 0.16.11&#8221;, 6 Jun 2025 (jepsen.io)</p></li><li><p>Kyle Kingsbury, &#8220;Jepsen: On the perils of network partitions&#8221;, 18 May 2013 (aphyr.com)</p></li><li><p>Zhou et al., &#8220;FoundationDB: A Distributed Unbundled Transactional Key Value Store&#8221;, SIGMOD 2021 (foundationdb.org)</p></li><li><p>Will Wilson, &#8220;Testing Distributed Systems w/ Deterministic Simulation&#8221;, Strange Loop, 20 Sep 2014 (youtube.com)</p></li><li><p>TigerBeetle, &#8220;October in TigerLand&#8221;, 7 Nov 2024 (tigerbeetle.com)</p></li><li><p>AWS, &#8220;Summary of the Amazon DynamoDB Service Disruption in the Northern Virginia (US-EAST-1) Region&#8221;, Oct 2025 (aws.amazon.com)</p></li><li><p>Lorin Hochstein, &#8220;Quick thoughts on the recent AWS outage&#8221;, 25 Oct 2025 (surfingcomplexity.blog)</p></li><li><p>Lorin Hochstein, &#8220;AWS re:Invent talk on their Oct &#8216;25 incident&#8221;, 14 Dec 2025 (surfingcomplexity.blog)</p></li><li><p>James Reason, &#8220;Human error: models and management&#8221;, BMJ, 18 Mar 2000 (ncbi.nlm.nih.gov)</p></li><li><p>DORA, &#8220;Accelerate State of DevOps Report 2024&#8221; (services.google.com)</p></li><li><p>Octopus Deploy, &#8220;2024 DevOps performance clusters&#8221;, 19 Nov 2024 (octopus.com)</p></li><li><p>Newcombe et al., &#8220;Use of Formal Methods at Amazon Web Services&#8221;, 29 Sep 2014 (lamport.azurewebsites.net)</p></li><li><p>Sadowski et al., &#8220;Lessons from Building Static Analysis Tools at Google&#8221;, CACM 2018 (research.google)</p></li><li><p>Pony tutorial, introduction, &#8220;Object Capabilities&#8221;, &#8220;C FFI&#8221;, &#8220;Trust Boundary&#8221; and &#8220;Garbage Collection&#8221; (tutorial.ponylang.io)</p></li><li><p>Charity Majors, &#8220;I test in prod&#8221;, Increment, 23 Aug 2019 (increment.com)</p></li><li><p>Ward Cunningham, &#8220;The WyCash Portfolio Management System&#8221;, OOPSLA, 26 Mar 1992 (c2.com)</p></li><li><p>Martin Fowler, &#8220;Technical Debt&#8221;, 21 May 2019 (martinfowler.com)</p></li><li><p>Joel Spolsky, &#8220;Things You Should Never Do, Part I&#8221;, 6 Apr 2000 (joelonsoftware.com)</p></li><li><p>CISA, &#8220;Supply Chain Compromise of Third-Party tj-actions/changed-files&#8221;, 18 Mar 2025 (cisa.gov)</p></li><li><p>Nx, security advisory GHSA-cxm3-wv7p-598c, 27 Aug 2025 (github.com)</p></li><li><p>Wiz, &#8220;s1ngularity: supply chain attack leaks secrets on GitHub&#8221;, Aug 2025 (wiz.io)</p></li><li><p>Aikido, &#8220;npm debug and chalk packages compromised&#8221;, 8 Sep 2025 (aikido.dev)</p></li><li><p>CISA, &#8220;Widespread Supply Chain Compromise Impacting npm Ecosystem&#8221;, 23 Sep 2025 (cisa.gov)</p></li><li><p>Check Point Research, &#8220;Shai-Hulud 2.0: Inside The Second Coming&#8221;, 25 Nov 2025 (blog.checkpoint.com)</p></li><li><p>GitHub, &#8220;Our plan for a more secure npm supply chain&#8221;, 22 Sep 2025 (github.blog)</p></li><li><p>GitHub Changelog, &#8220;npm classic tokens revoked, session-based auth and CLI token management now available&#8221;, 9 Dec 2025 (github.blog)</p></li><li><p>Aqua Security, Trivy advisory GHSA-69fq-xp46-6x23, 19 Mar 2026 (github.com)</p></li><li><p>LiteLLM, &#8220;Security Update: Suspected Supply Chain Incident&#8221;, Mar 2026 (docs.litellm.ai)</p></li><li><p>Datadog Security Labs, &#8220;axios npm supply chain compromise&#8221;, 31 Mar 2026 (securitylabs.datadoghq.com)</p></li><li><p>StepSecurity, &#8220;Mini Shai-Hulud is back&#8221;, 11 May 2026 (stepsecurity.io)</p></li><li><p>Chainguard, &#8220;Mini Shai-Hulud npm Attack: AntV Ecosystem Compromise&#8221;, 19 May 2026 (chainguard.dev)</p></li><li><p>Wiz, &#8220;keyv and cacheable npm Package Hijacked in Supply Chain Attack&#8221;, 4 Aug 2026 (wiz.io)</p></li><li><p>Adnan Khan, &#8220;Clinejection&#8221;, 9 Feb 2026 (adnanthekhan.com)</p></li><li><p>Spracklen et al., &#8220;We Have a Package for You!&#8221;, USENIX Security 2025 (arxiv.org)</p></li><li><p>Cloud Security Alliance, &#8220;Slopsquatting: AI Code Hallucinations Fuel Supply Chain Attacks&#8221;, 19 Apr 2026 (labs.cloudsecurityalliance.org)</p></li><li><p>William Woodruff, &#8220;We should all be using dependency cooldowns&#8221;, 21 Nov 2025 (blog.yossarian.net)</p></li><li><p>Andrew Nesbitt, &#8220;Package managers need to cool down&#8221;, 4 Mar 2026 (nesbitt.io)</p></li><li><p>Cal Paterson, &#8220;Dependency cooldowns turn you into a free-rider&#8221;, Apr 2026 (calpaterson.com)</p></li><li><p>CPAN mirror, Funet (nic.funet.fi)</p></li><li><p>npm Docs, &#8220;scripts&#8221; (docs.npmjs.com)</p></li><li><p>Socket, &#8220;pnpm 10.0.0 blocks lifecycle scripts by default&#8221;, 10 Jan 2025 (socket.dev)</p></li><li><p>Aleksa Sarai, runc security advisory, oss-security, 5 Nov 2025 (openwall.com)</p></li><li><p>Mark S. Miller, &#8220;Robust Composition&#8221;, PhD dissertation, May 2006 (erights.org)</p></li><li><p>Clebsch et al., &#8220;Deny Capabilities for Safe, Fast Actors&#8221;, 2015 (ponylang.io)</p></li><li><p>Deno docs, &#8220;Security and permissions&#8221; (docs.deno.com)</p></li><li><p>WASI, &#8220;Capabilities&#8221; (github.com)</p></li><li><p>Google Project Zero, &#8220;Reading privileged memory with a side-channel&#8221;, 3 Jan 2018 (projectzero.google)</p></li><li><p>Graz University of Technology et al., Meltdown and Spectre (meltdownattack.com)</p></li><li><p>Brendan Gregg, &#8220;KPTI/KAISER Meltdown Initial Performance Regressions&#8221;, 9 Feb 2018 (brendangregg.com)</p></li><li><p>Johnson et al., &#8220;Parma: Confidential Containers via Attested Execution Policies&#8221;, Feb 2023 (arxiv.org)</p></li><li><p>TEE.fail, IEEE S&amp;P 2026; disclosed Oct 2025 (tee.fail)</p></li><li><p>Battering RAM, IEEE S&amp;P 2026; disclosed Oct 2025 (batteringram.eu)</p></li><li><p>Discord, &#8220;Why Discord is switching from Go to Rust&#8221;, 4 Feb 2020 (discord.com)</p></li><li><p>Rick Hudson, &#8220;Getting to Go: The Journey of Go&#8217;s Garbage Collector&#8221;, 12 Jul 2018 (go.dev)</p></li><li><p>OpenJDK, JEP 333, JEP 376 and JEP 439 (openjdk.org)</p></li><li><p>Clebsch et al., &#8220;Orca: GC and Type System Co-Design for Actor Languages&#8221;, OOPSLA 2017 (ponylang.io)</p></li><li><p>Martin Fowler, &#8220;The LMAX Architecture&#8221;, 12 Jul 2011 (martinfowler.com)</p></li><li><p>Jeff Bonwick, &#8220;The Slab Allocator&#8221;, USENIX Summer 1994 (people.eecs.berkeley.edu)</p></li><li><p>Go issue 51317, &#8220;proposal: arena: new package providing memory arenas&#8221;, 22 Feb 2022 (github.com)</p></li><li><p>Tyler Treat, &#8220;You Cannot Have Exactly-Once Delivery&#8221;, 25 Mar 2015 (bravenewgeek.com)</p></li><li><p>Confluent, &#8220;Exactly-Once Semantics Are Possible: Here&#8217;s How Kafka Does It&#8221;, 30 Jun 2017 (confluent.io)</p></li><li><p>Huang et al., &#8220;Gray Failure: The Achilles&#8217; Heel of Cloud-Scale Systems&#8221;, HotOS 2017 (microsoft.com)</p></li><li><p>GitHub, &#8220;Spec-driven development with AI: Get started with a new open source toolkit&#8221;, 2 Sep 2025 (github.blog)</p></li><li><p>Kiro, &#8220;Introducing Kiro&#8221;, 14 Jul 2025 (kiro.dev)</p></li><li><p>OpenAI, &#8220;Harness engineering: leveraging Codex in an agent-first world&#8221;, 11 Feb 2026 (openai.com)</p></li><li><p>Anthropic, &#8220;Best practices for Claude Code&#8221; (code.claude.com)</p></li><li><p>METR, &#8220;Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity&#8221;, 10 Jul 2025 (metr.org)</p></li><li><p>METR, &#8220;Uplift update&#8221;, 24 Feb 2026 (metr.org)</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scalableapps.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Agentic AI in Production! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How we repeated MIT’s weight-space experiments]]></title><description><![CDATA[Watch now (5 mins) | Every step from prompt to score, including what went wrong.]]></description><link>https://www.scalableapps.io/p/how-we-repeated-mits-weight-space</link><guid isPermaLink="false">https://www.scalableapps.io/p/how-we-repeated-mits-weight-space</guid><dc:creator><![CDATA[Surendra Singh]]></dc:creator><pubDate>Thu, 05 Nov 2026 00:21:32 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/223555735/4f75f26d3383254e7094977523e440c3.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>This is the detailed follow-up to the Astra video. We repeated 2 of the 8 experiments in MIT&#8217;s Sparks of Weight-Space Programming. The other 6 were not run, so nothing here confirms or disputes them.</p><p>Each model replied once per game, so Opus&#8217;s lead over Astra is unproven. Opus also wrote our code while being one of the models compared, which is why we ran MIT&#8217;s own networks and answers through it.</p><p>The game footage and network activations come from the saved network, replayed for this video. Published scores are the mean of 1,000 games.</p><p>Run the checks yourself: https://github.com/bolnet/context-clock/blob/master/WEIGHTSPACE_HOW_WE_DID_IT.md </p><p>Sources:</p><p>MIT CSAIL, Sparks of Weight-Space Programming (Takehi, Teoh, Zhang, Khattab): https://rikiyat.github.io/blog/weight-space-programming/ </p><p>MIT&#8217;s logs: https://github.com/RikiyaT/lm_understand-logs </p><p>Our runs and checker: https://github.com/bolnet/context-clock </p>]]></content:encoded></item><item><title><![CDATA[AI models just became something you can repair]]></title><description><![CDATA[MIT researchers changed 0.016% of a model with no retraining. Its math score went from 7.9% to 48.1%.]]></description><link>https://www.scalableapps.io/p/ai-models-just-became-something-you-b4a</link><guid isPermaLink="false">https://www.scalableapps.io/p/ai-models-just-became-something-you-b4a</guid><dc:creator><![CDATA[Surendra Singh]]></dc:creator><pubDate>Wed, 04 Nov 2026 04:53:49 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/223427146/28731c06694042be65ce10ce79524bb9.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>AI models just became something you can repair, not only retrain.</p><p>If an AI can now repair another AI, who should be allowed to make those repairs, and how would you know they did?</p><p>Sources: Takehi, Teoh, Zhang and Khattab, &#8220;Sparks of Weight-Space Programming&#8221;, MIT CSAIL, 2 Nov 2026 (rikiyat.github.io). Matthew Honnibal, critique, 3 Nov 2026 (honnibal.dev). Qwen3.5-0.8B model card (huggingface.co).</p>]]></content:encoded></item><item><title><![CDATA[How building software is changing: two eras of shipping]]></title><description><![CDATA[Coding agents can multiply what one engineer ships. Then the bottleneck moves: to review, to CI, to source control, and finally to the engineer.]]></description><link>https://www.scalableapps.io/p/how-building-software-is-changing</link><guid isPermaLink="false">https://www.scalableapps.io/p/how-building-software-is-changing</guid><dc:creator><![CDATA[Surendra Singh]]></dc:creator><pubDate>Tue, 03 Nov 2026 21:38:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!alBc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Coding agents can multiply what one engineer ships. One public ledger shows merged pull requests going from 19 a month to 207. The gain only arrives when a team removes the human steps that used to set the pace. Then the bottleneck moves. First it lands on review, then on CI and source control, and finally on the engineer.</p><blockquote><p><strong>In 60 seconds</strong></p><ul><li><p>One engineer&#8217;s merged pull requests went from 19 a month to 207 when coding agents arrived.</p></li><li><p>Across GitHub, agents started 17% of pull requests in March 2026 and more than 40% by September. Per developer, the gain was only 16.2% to 20%.</p></li><li><p>The gain arrives when teams remove human steps. 96% of his PRs at Tano never had a human reviewer, and median time to merge fell from 15.1 hours to 0.7.</p></li><li><p>Each removed step exposes the next. At Anthropic, CI jobs rose 25 times in six months, then merges went from 2,500 a day to more than 30,000 and Anthropic left git.</p></li><li><p>The last constraint is the engineer. Agent sessions sit about 80% idle waiting for a person, and follow-up fixes nearly doubled, from about 7.6% to about 13.8%.</p></li></ul></blockquote><h2>One engineer&#8217;s merged pull requests went from 19 a month to 207</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!alBc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!alBc!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!alBc!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!alBc!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!alBc!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!alBc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Merged pull requests per month at three jobs: 8, 19 and 207&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="Merged pull requests per month at three jobs: 8, 19 and 207" title="Merged pull requests per month at three jobs: 8, 19 and 207" srcset="https://substackcdn.com/image/fetch/$s_!alBc!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!alBc!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!alBc!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!alBc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F470ff462-3e97-4b8c-ae03-4b34e0b99c38_720x406.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Merged pull requests per month at three jobs: 8, 19 and 207</figcaption></figure></div><p>Neil Kakkar publishes his own GitHub ledger. It covers three jobs. He was at Bloomberg from 2018 to 2021. He was at PostHog from May 2021 to January 2025. He has been the founding engineer at Tano since January 2026. Tano builds agents that run influencer marketing for brands.</p><p>By his own count, he merged 8 pull requests a month at Bloomberg and 19 at PostHog. At Tano the figure is 207 per 30 days. That is 859 merged PRs in 3.7 years at PostHog, against 1,638 in the first eight months at Tano. His Tano total passed his whole PostHog total on day 139.</p><p>The jump from Bloomberg to PostHog was 2.4x. He credits that to a faster company. <strong>The jump from PostHog to Tano is 11x</strong>, and it came with coding agents. He also gives a smaller number. Comparing his best eight months at PostHog with his first eight at Tano gives 7.0x. He calls that his most conservative figure. We use both.</p><p>His peak months tell the same story. PostHog&#8217;s best month had 42 merged PRs. Tano&#8217;s best had 363. On his busiest Tano days, 44 PRs merged. Lines added per 30 days went from 2,899 to 102,239. No one types 100,000 lines a month by hand.</p><p>Two caveats come from the ledger itself. He labels PostHog &#8220;pre-agent&#8221; and says the label is approximate. Copilot and chat assistants existed for part of his time there. Autonomous agents did not. He also says a PR count measures throughput, not value. A pull request is a unit of change, not a unit of worth.</p><p>So treat 11x as an upper bound for one person in one kind of company. It is still the cleanest before-and-after we have. It is one engineer, measured the same way, across a clear change in tools and process. Most public data mixes thousands of teams with different habits. This ledger does not.</p><p>The rest of this edition asks what had to change around him for that number to happen, and what it cost.</p><h2>Across GitHub, agents now start four in ten pull requests</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8To2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8To2!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!8To2!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!8To2!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!8To2!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!8To2!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Agents started 17% of GitHub pull requests in March 2026 and more than 40% by September&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="Agents started 17% of GitHub pull requests in March 2026 and more than 40% by September" title="Agents started 17% of GitHub pull requests in March 2026 and more than 40% by September" srcset="https://substackcdn.com/image/fetch/$s_!8To2!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!8To2!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!8To2!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!8To2!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefa1437a-5638-4e05-b0c3-d995e0a9a806_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Agents started 17% of GitHub pull requests in March 2026 and more than 40% by September</figcaption></figure></div><p>One ledger is a story. The industry numbers give the scale.</p><p>GitHub&#8217;s Octoverse 2026, published October 28, counted 1.3 billion merged pull requests in its year. GitHub says that more than tripled. The count now includes private repositories, so it does not line up neatly with last year&#8217;s report. The share of PRs started by an agent is the cleaner signal. It was 17% in March 2026. <strong>By September it was more than 40%</strong>. GitHub says activity climbed from January and surged around June. AI code review usage rose 90% year on year. Actions now runs 1,440 jobs a second.</p><p>The Stack Overflow 2026 survey, published October 6, asked more than 30,000 developers. Among those who use AI, 66% use coding agents. Claude Code was used by 66% of them and Copilot by 59%. A third of daily users spend four or more hours a day in AI tools.</p><p>Per developer, the gain is much smaller than 11x. Faros AI studied 22,000 developers across more than 4,000 teams for its April 2026 report. The PR merge rate per developer rose 16.2%. Cortex&#8217;s 2026 benchmark found PRs per author up 20%.</p><p>So the totals tripled while the typical developer merged about a sixth to a fifth more. Both can be true. More developers, more agents and more automation add volume. The individual gain depends on what surrounds the individual.</p><p>That gap, between 11x for one engineer and about 20% for the median, is the subject of this edition. The difference is not the model. Neil and the Faros teams had access to the same agents. The difference is which human steps were still in the path between a finished change and production.</p><h2>Review was the first wall, and it fell first</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BIC9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BIC9!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!BIC9!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Median time from open to merge: 15.1 hours with human review, 0.7 hours with agent review&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="Median time from open to merge: 15.1 hours with human review, 0.7 hours with agent review" title="Median time from open to merge: 15.1 hours with human review, 0.7 hours with agent review" srcset="https://substackcdn.com/image/fetch/$s_!BIC9!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!BIC9!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faebcfa97-5ef9-49d9-89b8-4a0255f20cde_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Median time from open to merge: 15.1 hours with human review, 0.7 hours with agent review</figcaption></figure></div><p>Code review was the step most teams kept. It was also the first to break under agent volume.</p><p>Cloudflare put it plainly in April 2026. Review is &#8220;one of the most reliable ways to bottleneck an engineering team.&#8221; Boris Cherny, who leads Claude Code at Anthropic, gave the method in June: &#8220;Find the bottleneck, solve the bottleneck.&#8221;</p><p>Faros measured what happens when review stays manual. Median time in review rose 441.5%. Pull requests merged with no review at all rose 31.3%. Volume went up, so people either queued or skipped.</p><p>Neil&#8217;s ledger shows the other path. At PostHog he reviewed 1,589 of his teammates&#8217; pull requests. At Tano he has reviewed 67. Per merged PR, that ratio went from 1.85 to 0.04. At Bloomberg it was about 2. By his count, 96% of his Tano PRs never had a human reviewer. A bot, Claude, reviewed 98% of them. His page says engineers at Tano &#8220;own their areas end to end.&#8221;</p><p>The effect on speed is direct. His median time from opening a PR to merging it <strong>went from 15.1 hours at PostHog to 0.7 hours at Tano</strong>. The share merged within an hour went from 23% to 57%.</p><p>Picture an engineer with today&#8217;s agents dropped into a team where every PR needs a colleague&#8217;s approval. Output rises, but only until the queue fills. Every PR adds work for someone else. The faster you write, the longer the line. Faros calls review the new bottleneck for exactly this reason.</p><p>So the first removed constraint was not typing. It was waiting for another person&#8217;s attention. Teams that kept mandatory human review saw small per-person gains. Teams that replaced it saw large ones. The next question is what replaced it, and whether it holds up.</p><h2>Big companies now let AI carry most review</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LZMN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LZMN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!LZMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.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;:null,&quot;alt&quot;:&quot;Cloudflare's AI reviewed 48,095 merge requests in 30 days at a median $0.98 each; Intercom and Anthropic run AI review too&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="Cloudflare's AI reviewed 48,095 merge requests in 30 days at a median $0.98 each; Intercom and Anthropic run AI review too" title="Cloudflare's AI reviewed 48,095 merge requests in 30 days at a median $0.98 each; Intercom and Anthropic run AI review too" srcset="https://substackcdn.com/image/fetch/$s_!LZMN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!LZMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddb0e4f-3484-4462-bd01-532253a2fd04_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Cloudflare&#8217;s AI reviewed 48,095 merge requests in 30 days at a median $0.98 each; Intercom and Anthropic run AI review too</figcaption></figure></div><p>Replacing human review is no longer a startup habit. Several large companies now publish their numbers.</p><p><strong>Cloudflare ran AI review on 48,095 merge requests across 5,169 repositories in 30 days</strong>. That was 131,246 review runs. The median run took 3 minutes 39 seconds and cost $0.98. The average was $1.19. Engineers used a break-glass override on 0.6% of merge requests. Cloudflare sorts every merge request into one of three risk tiers and reviews each tier differently.</p><p>Intercom wrote in April 2026 that over 93% of its pull requests are agent-driven. Over 19% are &#8220;auto-approved with no human reviewer.&#8221; In four weeks, 497 PRs went fully autonomous. The backend revert rate was 0.53% for AI-authored code and 5.39% for human-authored code. Downtime fell 35% while deployments doubled.</p><p>Anthropic launched Code Review for Claude Code in March. Inside Anthropic, the share of PRs with substantive review comments went from 16% to 54%. Engineers marked under 1% of findings as incorrect. Each review costs $15 to $25. Cherny says a team of Claude reviewers catches &#8220;pretty much every bug,&#8221; and a human still approves.</p><p>Google reported the scale in April. Sundar Pichai said 75% of all new code at Google is now AI-generated and approved by engineers.</p><p>The building blocks are documented. Claude Code GitHub Actions run a review on every pull request event and post inline comments. A deeper multi-agent review, called ultrareview, costs $5 to $25 and runs for 5 to 15 minutes. Claude does not start it on its own. A person asks for it on a risky change.</p><p>The pattern across these companies is the same. A cheap reviewer reads everything. A deeper reviewer runs on demand. Humans stay for the riskiest tier. Nobody here removed review. They moved it to a machine and kept humans at the top of the risk ladder.</p><h2>Agents miss what the codebase already knows: money</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lfvt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lfvt!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!lfvt!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;ISO 4217 minor units: 139 currencies with 2 decimals, 26 with something else&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="ISO 4217 minor units: 139 currencies with 2 decimals, 26 with something else" title="ISO 4217 minor units: 139 currencies with 2 decimals, 26 with something else" srcset="https://substackcdn.com/image/fetch/$s_!lfvt!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!lfvt!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b576cd5-ab6e-4d5c-99d4-816bda149159_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ISO 4217 minor units: 139 currencies with 2 decimals, 26 with something else</figcaption></figure></div><p>An AI reviewer reads the diff. It does not always know what the rest of the codebase already handles. Money is the classic trap.</p><p>Many developers assume every currency has 100 minor units, like cents in a dollar. Many do not. The official ISO 4217 list, maintained by SIX and last published September 17, 2026, gives the minor unit for each currency code. By our count of that list, 139 codes use 2 decimals. 17 use none, including the Japanese yen and the Korean won. 7 use three, including the Bahraini dinar and the Kuwaiti dinar. 2 use four. <strong>That is 26 currencies where &#8220;multiply by 100&#8221; is wrong.</strong></p><p>Stripe&#8217;s documentation states the rule that payment APIs follow. Amounts are given &#8220;in the currency&#8217;s minor unit.&#8221; Stripe documents zero-decimal and three-decimal currencies separately for this reason.</p><p>Agents can parse a currency amount as a float and multiply by 100. That passes every test that uses dollars. It breaks in Bahrain and in Japan. The bug ships when the codebase already has a currency utility and the agent writes its own instead. A human who knows the codebase would point at the utility. A reviewer that reads only the diff may not.</p><p>There are three fixes, and they stack. Store money as integers in minor units, never as floats. Keep one currency module and make the review agent check that new code uses it. Add test cases for a zero-decimal and a three-decimal currency, so the yen and the dinar break the build before production does.</p><p>The general point is about context. A review agent is only as good as what it can see. Give it repository search. Give it a rules file that names the shared modules. Otherwise it reviews code in isolation, and the bugs that slip through are the ones that only make sense in context.</p><h2>A normal index build on a big table blocks writes</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NvkG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NvkG!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!NvkG!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A standard index build locks out writes until it finishes; CREATE INDEX CONCURRENTLY does not&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 standard index build locks out writes until it finishes; CREATE INDEX CONCURRENTLY does not" title="A standard index build locks out writes until it finishes; CREATE INDEX CONCURRENTLY does not" srcset="https://substackcdn.com/image/fetch/$s_!NvkG!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!NvkG!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc7a3cb3-1610-4cdf-8a57-05e7fed7a916_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A standard index build locks out writes until it finishes; CREATE INDEX CONCURRENTLY does not</figcaption></figure></div><p>The second trap is the database. Agents write migrations quickly. Some migrations are safe on a small table and dangerous on a large one.</p><p>PostgreSQL&#8217;s documentation is direct. A standard index build &#8220;locks out writes (but not reads)&#8221; on the table until it finishes. On a table with millions of rows, that can take minutes. Every insert and update waits. If your ingestion pipeline writes to that table, ingestion stops. If deploys run migrations, deploys stall behind the lock.</p><p>The fix is in the same documentation. <code>CREATE INDEX CONCURRENTLY</code><strong> builds the index without blocking writes.</strong> It has its own rules. It cannot run inside a transaction block. If it fails, it leaves an &#8220;invalid&#8221; index behind that must be dropped and rebuilt.</p><p>This is old knowledge, and teams already encode it. The strong_migrations library for Rails says it plainly: &#8220;In Postgres, adding an index non-concurrently blocks writes.&#8221; GitLab&#8217;s database guide makes <code>add_concurrent_index</code> a requirement on populated tables. A RuboCop rule, <code>PreventIndexCreation</code>, blocks new indexes on tables GitLab marks as large. Squawk, a Postgres migration linter, has a rule to &#8220;Ensure all index creations use the CONCURRENTLY option.&#8221;</p><p>An agent writing a migration does not know which of your tables are large unless you tell it. A human reviewer who has been paged for this before would catch it. Remove that reviewer, and the knowledge has to live somewhere the agent can read.</p><p>The cheapest place is the review agent&#8217;s rules. List your largest tables. Forbid blocking migrations on them. Require concurrent index builds. Then add a linter like Squawk to CI, so the rule holds even when the review agent misses it. Two layers cost little. One outage on a large table costs far more.</p><h2>Every incident becomes a rule the reviewer enforces</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pemO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pemO!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!pemO!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!pemO!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!pemO!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!pemO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Every incident becomes a rule: replay it against the bad PR, check false flags on the last 50 PRs, then enforce&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="Every incident becomes a rule: replay it against the bad PR, check false flags on the last 50 PRs, then enforce" title="Every incident becomes a rule: replay it against the bad PR, check false flags on the last 50 PRs, then enforce" srcset="https://substackcdn.com/image/fetch/$s_!pemO!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!pemO!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!pemO!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!pemO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6025ac59-102f-4706-a2f5-9385bd5b9e21_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Every incident becomes a rule: replay it against the bad PR, check false flags on the last 50 PRs, then enforce</figcaption></figure></div><p>The currency bug and the index lock share a shape. Each is a mistake a human reviewer learned to catch once, through pain. Without that reviewer, the lesson has to be written down.</p><p>The tools now support this directly. Claude Code&#8217;s code review reads a REVIEW.md file in the repository. The documentation says to &#8220;add rules you want flagged on every pull request.&#8221; Each rule is a sentence the reviewer applies to every change.</p><p>Every, a company that builds several AI products, describes the habit it calls compound engineering. When something goes wrong, &#8220;add a note so the agent learns.&#8221; Each bug, failed test or insight &#8220;gets documented and used by future agents.&#8221; Every runs 12 review subagents in parallel on its code. In its words, bug fixes &#8220;eliminate entire categories of future bugs.&#8221;</p><p>GitLab&#8217;s <code>PreventIndexCreation</code> rule is the same idea from before agents. A past incident became a lint rule that blocks the whole class of change.</p><p>A rule that has never been tested is a guess. We would run each new rule through a short loop before trusting it.</p><p>First, trace the incident to the pull request that caused it. Second, write the rule as one sentence in the rules file. Third, <strong>replay that pull request through the reviewer and confirm the rule flags it</strong>. Fourth, run the reviewer over the last 50 merged PRs and count false flags. A rule that flags half the codebase will be ignored. Fifth, version the rules file and enforce it on every PR.</p><p>This turns a team&#8217;s scar tissue into something an agent can read. Done well, the same bug does not ship twice. Done badly, the rules file grows into noise that nobody trusts. The replay step is what separates the two.</p><h2>Reverts fell. Follow-up fixes nearly doubled</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rLb7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rLb7!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!rLb7!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Reverts fell from 2.3% to 0.4% while follow-up fixes rose from about 7.6% to about 13.8%&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="Reverts fell from 2.3% to 0.4% while follow-up fixes rose from about 7.6% to about 13.8%" title="Reverts fell from 2.3% to 0.4% while follow-up fixes rose from about 7.6% to about 13.8%" srcset="https://substackcdn.com/image/fetch/$s_!rLb7!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!rLb7!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab607223-32f4-4ec0-bf92-44254efd9300_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Reverts fell from 2.3% to 0.4% while follow-up fixes rose from about 7.6% to about 13.8%</figcaption></figure></div><p>The quality picture is mixed, and Neil&#8217;s ledger shows why one metric misleads.</p><p>By his count, the share of his PRs that were later reverted fell from 2.3% at PostHog to 0.4% at Tano. That looks like 6x fewer mistakes. His own page warns against reading it that way. Reverts undercount rework. At Tano, he writes, &#8220;I fix forward instead of reverting.&#8221;</p><p>So he tracks a second number. The share of his PRs that needed a follow-up fix within seven days <strong>went from about 7.6% at PostHog to about 13.8% at Tano</strong>. Fewer reverts, nearly twice the follow-up fixes. His PRs also grew. Median lines added went from 42 to 229. Median files touched went from 3 to 6. About 30% of his Tano PRs fix bugs.</p><p>The wider data points the same way. Faros found bugs per developer up 54% and the ratio of incidents to PRs up 242.7%. Cortex found incidents per PR up 23.5% and change failure rate up 30%.</p><p>Intercom&#8217;s numbers show it can go the other way. Its backend revert rate was 0.53% for AI-authored code against 5.39% for human-authored code. The difference is in the guardrails around the code, not only in who wrote it.</p><p>Fixing forward is a choice, and it is not the default advice. Google&#8217;s SRE workbook names rollback as the generic mitigation that &#8220;speeds recovery.&#8221; DORA&#8217;s metrics count a rollback and a hotfix the same way in the change fail rate. DORA also tracks deployment rework rate, the unplanned deploys caused by incidents.</p><p>The practical rule is to track three numbers together: volume, size and rework. Any one alone tells a happy story. A falling revert rate with rising follow-up fixes means the cost moved, not that it disappeared.</p><h2>Fast rewrites turn big migrations into two-way doors</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mHFt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mHFt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!mHFt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70114921-f31e-4c76-92fe-5166cade79e9_1600x900.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;:null,&quot;alt&quot;:&quot;About a year for one migration at PostHog; four company-wide migrations in eight months at Tano&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="About a year for one migration at PostHog; four company-wide migrations in eight months at Tano" title="About a year for one migration at PostHog; four company-wide migrations in eight months at Tano" srcset="https://substackcdn.com/image/fetch/$s_!mHFt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!mHFt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70114921-f31e-4c76-92fe-5166cade79e9_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">About a year for one migration at PostHog; four company-wide migrations in eight months at Tano</figcaption></figure></div><p>Speed changes which decisions are reversible.</p><p>In Amazon&#8217;s 2015 shareholder letter, Jeff Bezos split decisions into two kinds. One-way doors are hard to undo and deserve care. Most decisions, he wrote, are &#8220;changeable, reversible&#8221; two-way doors. Those should be made &#8220;quickly by high judgment individuals or small groups.&#8221;</p><p>Large data migrations used to be one-way doors. PostHog&#8217;s persons-on-events migration is a public example. PostHog moved person data onto its events table so that queries &#8220;no longer have to join tables.&#8221; PostHog said queries would improve &#8220;by up to 400%.&#8221; It had tracked over 50 billion events by then. Neil&#8217;s page dates the work from May 2022 to May 2023, about a year. He contributed to one company-wide migration at PostHog and led one.</p><p>At Tano, by his count, <strong>he has led four company-wide migrations in eight months</strong>. One moved Tano&#8217;s creator agent from a checklist design to workflow orchestration. Another moved 13,345 partners to a new model between August and September 2026.</p><p>His June post describes what changed. &#8220;A big overhaul doesn&#8217;t take weeks. It can be done overnight.&#8221; When a rewrite is that cheap, architecture becomes a two-way door. You can try a design in production, learn, and change it.</p><p>That has a cost. Moving fast through migrations means some break. A team that treats every migration as reversible needs the guardrails from the last three sections: rules for dangerous operations, tests for edge cases, and a way to measure rework.</p><p>It also changes planning. When a migration took a year, teams future-proofed it, because they could not afford a second one. When it takes weeks, the better plan is often the smallest design that works now, with the expectation of changing it. The risk is in pretending a one-way door is a two-way door. Data loss, payments and security changes still deserve the slow path.</p><h2>From a checklist agent to a workflow with fewer tools</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PTCn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PTCn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!PTCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.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;:null,&quot;alt&quot;:&quot;From one agent with many tools to a workflow of narrow steps, which now runs more than 97,000 collaborations&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="From one agent with many tools to a workflow of narrow steps, which now runs more than 97,000 collaborations" title="From one agent with many tools to a workflow of narrow steps, which now runs more than 97,000 collaborations" srcset="https://substackcdn.com/image/fetch/$s_!PTCn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!PTCn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc23bb0b0-7feb-45cc-8501-d55f21c83269_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">From one agent with many tools to a workflow of narrow steps, which now runs more than 97,000 collaborations</figcaption></figure></div><p>Neil&#8217;s first Tano migration is a design lesson for anyone running agents in production.</p><p>Tano&#8217;s agents work with creators for brands. Seedcamp described the company in November 2025 as an end-to-end AI marketing business whose agents &#8220;source, vet, outreach, negotiate.&#8221; Neil&#8217;s page lists a negotiation engine behind more than $1 million in accepted creator deals.</p><p>His page also lists a project called &#8220;Checklists to workflow orchestration,&#8221; from February to July 2026. The workflow engine now runs more than 97,000 collaborations. One example PR in his ledger replaces a &#8220;v1 one-shot executor&#8221; with an &#8220;agentic graph invoker.&#8221;</p><p>Anthropic&#8217;s guide to building effective agents draws the same line. Workflows follow &#8220;predefined code paths.&#8221; Agents &#8220;dynamically direct their own processes and tool usage.&#8221; The guide recommends the simplest design that works, and adding agent freedom only where it pays.</p><p>The failure mode of the free design is common. One agent gets a long checklist and a large set of tools. It picks the wrong tool at the wrong step. When it goes wrong, nobody can see why, because the steps are not separate.</p><p>The workflow design splits the job. Each task is a step with a clear input, a clear output and a short list of allowed tools. A failed step shows up in the trace. <strong>A wrong tool call is impossible if the tool is not offered.</strong></p><p>That fits the rest of this edition. Agents remove human constraints. Production systems need new ones, built into the design. A workflow with narrow tools is a constraint, chosen on purpose. It trades some flexibility for something you can observe and fix.</p><p>If you run an agent with more than a dozen tools and a free-form plan, look at your traces. If the same wrong tool call keeps showing up, the fix is probably structure, not a better prompt.</p><h2>One person can now own a whole feature</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QYqV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QYqV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!QYqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.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;:null,&quot;alt&quot;:&quot;One owner per area: 24 projects in eight months at Tano, against 17 in 3.7 years at PostHog&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="One owner per area: 24 projects in eight months at Tano, against 17 in 3.7 years at PostHog" title="One owner per area: 24 projects in eight months at Tano, against 17 in 3.7 years at PostHog" srcset="https://substackcdn.com/image/fetch/$s_!QYqV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!QYqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F588f0b35-35fc-4299-b489-33ac8b5291e3_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">One owner per area: 24 projects in eight months at Tano, against 17 in 3.7 years at PostHog</figcaption></figure></div><p>Review was one human constraint. Coordination was another. When writing code was slow, splitting a feature across several people made sense. When it is fast, the hand-offs cost more than the code.</p><p>Every runs five products. Each is &#8220;primarily built and run by a single person.&#8221; Neil&#8217;s page says the same of Tano: engineers &#8220;own their areas end to end.&#8221; In his March post on working with Claude Code, he describes his own role as &#8220;the manager of agents,&#8221; not the implementer. By his count <strong>he built 24 projects in eight months at Tano, against 17 in 3.7 years at PostHog</strong>.</p><p>Anthropic surveyed 132 of its own engineers for a December 2025 study. Claude was used in about 60% of their work. Engineers said they were &#8220;becoming more &#8216;full-stack&#8217;.&#8221; One said he is now &#8220;70%+&#8221; a reviewer and reviser of code.</p><p>OpenAI published a related case in February. A small team shipped a beta of about a million lines over five months with no hand-written code.</p><p>PostHog shows that single ownership predates agents. Its handbook says engineers are &#8220;normally responsible for their area of the product.&#8221; It expects product engineers to talk to users, and it built programs to &#8220;reduce the need for PMs.&#8221; PostHog had about 25 people when Neil joined in 2021.</p><p>What changes with agents is the size of the area one person can own. Design, frontend, backend and data work all fit in one head when agents write most of the code.</p><p>The cost moves to choosing. Neil wrote in February that &#8220;choosing what to build has become more important than just building.&#8221; A team of single owners needs a clear shared priority list, or each owner optimizes their own corner. The planning meeting matters more, not less. So does writing down why each area works the way it does, which is where the next part of this edition begins.</p><h2>The bottleneck moved into the engineer&#8217;s head</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1_7p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1_7p!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!1_7p!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The constraint moved from review to CI to source control to the engineer, whose agent sessions sit about 80% idle&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 constraint moved from review to CI to source control to the engineer, whose agent sessions sit about 80% idle" title="The constraint moved from review to CI to source control to the engineer, whose agent sessions sit about 80% idle" srcset="https://substackcdn.com/image/fetch/$s_!1_7p!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!1_7p!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b8e5f0f-a6ca-4ea5-89a7-fe7f4bd1b438_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The constraint moved from review to CI to source control to the engineer, whose agent sessions sit about 80% idle</figcaption></figure></div><p>Remove review and coordination, and the work still has to pass through one place: the person deciding what the agents do.</p><p>Anthropic said it directly in its October 16 report on employment at Anthropic. Human attention is now &#8220;the bottleneck for agent output.&#8221; <strong>Agent sessions spend about 80% of their time idle, waiting for a person.</strong> One engineer described &#8220;an army of Claudes, with every one asking for my attention.&#8221;</p><p>Simon Willison has written about this more than anyone. In February he said &#8220;the productivity boost these things can provide is exhausting.&#8221; In April he said using agents well takes &#8220;every inch of my 25 years&#8221; and is &#8220;mentally exhausting.&#8221;</p><p>Steve Yegge calls it the AI Vampire. His February essay says AI leaves &#8220;difficult decision-making for humans, which is exhausting and draining.&#8221; On the Hanselminutes podcast he said working with AI &#8220;drains human energy,&#8221; and asked: &#8220;so why is everyone so exhausted?&#8221;</p><p>The survey data agrees. Harness surveyed 700 engineering staff in February 2026. 75% said pressure to ship fast contributed to burnout.</p><p>From the inside it looks different. The ledger shows more output, and the engineer feels the cost. Agents do the typing. The person does the deciding, the checking and the switching, all day, at a pace set by machines that never tire.</p><p>That cost shows up in four places. The engineer switches between too many threads. Shared context thins out when nobody reads other people&#8217;s code. The workday stretches. And the bill for tokens sets a new kind of limit. The next sections take them one at a time, with what the leading practitioners say they do about each.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:1678721}" data-component-name="PollToDOM"></div><p></p><h2>Too many agents at once is thrashing</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u6My!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u6My!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!u6My!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!u6My!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!u6My!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!u6My!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Projects in flight per month: about 2 before agents, about 6 after, 9 at peak&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="Projects in flight per month: about 2 before agents, about 6 after, 9 at peak" title="Projects in flight per month: about 2 before agents, about 6 after, 9 at peak" srcset="https://substackcdn.com/image/fetch/$s_!u6My!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!u6My!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!u6My!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!u6My!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa982b20-5c8b-4ffd-a17a-ca1f78479154_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Projects in flight per month: about 2 before agents, about 6 after, 9 at peak</figcaption></figure></div><p>Operating systems have a word for this. In 1968 Peter Denning defined thrashing as &#8220;excessive overhead and severe performance degradation or collapse caused by too much paging.&#8221; The machine spends its time switching instead of working. The fix was to run fewer processes at once.</p><p>Engineers with agents now face the human version. Neil&#8217;s ledger shows it. In a typical month at PostHog he had about 2 projects in flight, at most 5. <strong>At Tano he has about 6, at most 9.</strong> His March post describes going &#8220;from getting overwhelmed by two parallel branches to running five worktrees at once.&#8221;</p><p>His session logs show a more modest picture than the projects suggest. PRs in flight at the same time went from 1.85 to 2.9. Half his active agent time is a single session.</p><p>Addy Osmani of Google wrote the clearest line on it in April: &#8220;Your cognitive bandwidth doesn&#8217;t parallelize.&#8221; The cost, he says, &#8220;isn&#8217;t in the switch itself - it&#8217;s in the recovery time.&#8221; Agent decisions cannot queue up like email.</p><p>Willison describes the limit in practice. He can &#8220;fire up four agents in parallel,&#8221; and &#8220;by like 11 AM, I am wiped out.&#8221;</p><p>A Harvard Business Review study by BCG and UC Riverside, published in March, surveyed 1,488 US workers. Heavy oversight of AI came with 14% more mental effort, 12% more fatigue and 19% more information overload. Self-rated productivity fell once people used four or more AI tools.</p><p>The operating system fix still applies. Cap the number of agent sessions per person. Finish before starting. Let urgent bugs interrupt, but not every bug. Faros found 26% more in-progress tasks sitting idle for seven days or more. That is what thrashing looks like on a team board.</p><h2>Nobody reads every pull request anymore</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2xdI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2xdI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!2xdI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.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;:null,&quot;alt&quot;:&quot;Teammates' PRs reviewed per merged PR: about 2 at Bloomberg, 1.85 at PostHog, 0.04 at Tano&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="Teammates' PRs reviewed per merged PR: about 2 at Bloomberg, 1.85 at PostHog, 0.04 at Tano" title="Teammates' PRs reviewed per merged PR: about 2 at Bloomberg, 1.85 at PostHog, 0.04 at Tano" srcset="https://substackcdn.com/image/fetch/$s_!2xdI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!2xdI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75755db4-cdb6-43e1-9970-a9d2cfc4e20c_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Teammates&#8217; PRs reviewed per merged PR: about 2 at Bloomberg, 1.85 at PostHog, 0.04 at Tano</figcaption></figure></div><p>Code review did more than catch bugs. It spread knowledge. PostHog&#8217;s handbook says it plainly: &#8220;Reviews also build shared context and collective ownership.&#8221;</p><p>That benefit goes away with the review. <strong>Neil went from reviewing 1,589 teammates&#8217; PRs at PostHog to 67 at Tano.</strong> He no longer sees most of what his colleagues change. Neither do they see his.</p><p>Anthropic&#8217;s own engineers report the same thing. In its December study, one said &#8220;More junior people don&#8217;t come to me with questions as often.&#8221; Another sends &#8220;80-90%&#8221; of questions to Claude instead of colleagues. A January Anthropic trial with 52 engineers found that people who learned a new library with AI help scored 50% on a comprehension quiz, against 67% for those without it.</p><p>Charity Majors put the stakes in one line in July: &#8220;The real product of a software team is shared understanding.&#8221;</p><p>The risk has a name. The bus factor, or truck factor, is the number of people who must leave before a project stalls. A 2016 study of 133 popular GitHub projects found that 65% had a truck factor of two or less. When one person owns an area end to end and nobody reads their code, the factor for that area is one.</p><p>The fix the industry is settling on is written context. AGENTS.md is a file that tells agents how a codebase works. Its site calls it &#8220;a README for agents&#8221; and says over 60,000 open-source projects use it. In a monorepo, &#8220;the closest AGENTS.md to the edited file wins,&#8221; so each area can carry its own. OpenAI&#8217;s Codex documentation gives the same advice.</p><p>Neil&#8217;s ledger shows the habit at work. His documentation lines at Tano reached 24,750, against 2,949 at PostHog. Written for agents, it also serves the next human.</p><h2>The workday changed shape</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!44As!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!44As!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!44As!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!44As!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!44As!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!44As!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.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;:null,&quot;alt&quot;:&quot;A typical day: 2 PRs in one afternoon burst at PostHog, 10 PRs spread across the day at Tano&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 typical day: 2 PRs in one afternoon burst at PostHog, 10 PRs spread across the day at Tano" title="A typical day: 2 PRs in one afternoon burst at PostHog, 10 PRs spread across the day at Tano" srcset="https://substackcdn.com/image/fetch/$s_!44As!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!44As!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!44As!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!44As!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff162821-5c36-497a-9868-1fa74cf4e23d_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A typical day: 2 PRs in one afternoon burst at PostHog, 10 PRs spread across the day at Tano</figcaption></figure></div><p>When a person wrote all the code, the day had a rhythm. Write in the morning, open PRs in the afternoon, wait for approval.</p><p>Neil&#8217;s charts show that rhythm at PostHog. On a typical day in April 2023 he opened 2 PRs, both between about 13:00 and 14:45. At Tano, on a typical day in August 2026, he opened 10, spread from about 10:10 to 17:35. PRs now land when an agent finishes, not when he does. <strong>The share of his PRs opened before 11:00 rose from 11% to 19%</strong>, because agents keep working after he leaves.</p><p>That creates a new pressure. If the agents could always be working, every pause feels like waste. Willison described people &#8220;losing sleep&#8221; over the thought that &#8220;my coding agents could be doing work for me,&#8221; then waking &#8220;at four in the morning.&#8221;</p><p>The data shows the hours stretching. Harness found 71% of engineering staff work evenings or weekends at least weekly. A Berkeley study of 200 employees, reported in Harvard Business Review in February, found people worked faster, took on more tasks, and worked longer hours, with &#8220;constant task-switching.&#8221; Stack Overflow found a third of daily AI users spend four or more hours a day in AI tools.</p><p>The people furthest ahead set limits. Mitchell Hashimoto, who founded HashiCorp, advises you to &#8220;turn off agent desktop notifications&#8221; and decide yourself when to check in. Yegge&#8217;s advice is simpler: &#8220;close the laptop and go for a walk.&#8221;</p><p>Good pacing looks like this. Put the hardest decisions where your attention is best. Do not make risky changes when you are tired. Let agents run on clear, bounded tasks while you are away, and review them fresh. Set a hard end to the day. The agents do not need rest. You do, and your judgment is now the scarce input.</p><h2>Default prompts make products look alike</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZWfW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZWfW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZWfW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.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;:null,&quot;alt&quot;:&quot;Unguided AI front ends converge on Inter fonts and purple gradients on white&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="Unguided AI front ends converge on Inter fonts and purple gradients on white" title="Unguided AI front ends converge on Inter fonts and purple gradients on white" srcset="https://substackcdn.com/image/fetch/$s_!ZWfW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZWfW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19ea4e2d-5e6a-44da-a668-aa7219ecfdec_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Unguided AI front ends converge on Inter fonts and purple gradients on white</figcaption></figure></div><p>Agents can build a user interface in minutes. The problem is that they build the same one.</p><p>Anthropic described this in November 2025. Its applied AI team called it &#8220;distributional convergence.&#8221; <strong>Without guidance, Claude will &#8220;almost always conform to Inter fonts, purple gradients on white backgrounds.&#8221;</strong> Users call the result &#8220;AI slop.&#8221; Anthropic&#8217;s own front-end design skill now warns against patterns that &#8220;read as AI-generated,&#8221; such as fade-and-slide-up entrances and the generic SaaS card layout.</p><p>The reason is in how models work. They produce the most likely output, and the most likely website is an average of many websites. Speed makes the average cheap. Distinctive design still takes taste and decisions.</p><p>PostHog is a useful contrast. Its first non-engineering hire was an artist, Lottie Coxon, who drew the company&#8217;s hedgehog mascot. Co-founder James Hawkins said, &#8220;We&#8217;re not going to win by being the same.&#8221; The brand that followed is one of the most recognizable in developer tools. That was a human choice, made early, before speed was cheap.</p><p>For AI-native teams the lesson is that design is now a constraint you have to add on purpose. A small team of single owners, each moving fast, will ship the default look unless someone owns the brand.</p><p>There are concrete fixes. Give agents a design system: tokens for color and type, a component library, and examples of your own pages. Anthropic&#8217;s skills approach does this, and its post shows the output change when the model is given explicit direction. Name the patterns to avoid, not only the ones to use. And review the first screen of every new product with the same care as its database migrations.</p><h2>Plan limits, not ambition, now set the pace</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5dPl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5dPl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!5dPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.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;:null,&quot;alt&quot;:&quot;Max is $100 a month for 5x Pro usage; Ultra is $200 for 10x weekly usage&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="Max is $100 a month for 5x Pro usage; Ultra is $200 for 10x weekly usage" title="Max is $100 a month for 5x Pro usage; Ultra is $200 for 10x weekly usage" srcset="https://substackcdn.com/image/fetch/$s_!5dPl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5dPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f00104-5eb9-40f1-84af-f2018d47f330_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Max is $100 a month for 5x Pro usage; Ultra is $200 for 10x weekly usage</figcaption></figure></div><p>The last new constraint is money, and it shows up as limits.</p><p>Claude&#8217;s plans set the shape of heavy agent use. As of November 3, 2026, Max costs $100 a month for &#8220;5x Pro usage every 5 hours and every week.&#8221; Ultra costs $200 a month for 10x weekly usage, with no five-hour limit. Anthropic&#8217;s support page says Pro and Max plans have &#8220;a five-hour session limit and a weekly limit.&#8221; Usage beyond that is billed &#8220;at standard API rates.&#8221;</p><p>API prices per million tokens are $4 in and $20 out for Opus 5.5, $2 and $10 for Sonnet 5.5, and $10 and $50 for Fable 5.1. An engineer running several agents all day can use far more than a plan covers.</p><p>The industry has a word for maximizing usage. Tomasz Tunguz defined &#8220;tokenmaxxing&#8221; in April as &#8220;the deliberate practice of maximizing token consumption,&#8221; and described about 250 million tokens in one day. IBM reported in September that some companies were &#8220;incentivizing employees to maximize their AI token usage,&#8221; including a leaderboard at Meta. The BCG study found firms sometimes use token consumption as a proxy for performance.</p><p>That is the wrong metric. Token spend measures effort, not results. Review shows the better frame. Cloudflare&#8217;s AI review averages $1.19 per merge request. Anthropic&#8217;s deeper Code Review costs $15 to $25. Cherny calls multi-agent review expensive, token-heavy computation. Those prices are worth paying for some changes and not others.</p><p>Autonomous monitoring, where agents watch production and open PRs on their own, is where limits bite next. PostHog&#8217;s Replay Vision, launched in September, watches session recordings &#8220;so nobody has to sit through them.&#8221; Sentry&#8217;s Seer can &#8220;open pull requests for us automatically,&#8221; but only for issues it judges fixable.</p><p><strong>Measure cost per merged PR and cost per prevented incident.</strong> A limit is useful when it forces you to spend tokens on the work that matters most.</p><h2>Anthropic sped up review, and CI broke next</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QehB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QehB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!QehB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!QehB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!QehB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!QehB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/372afe41-6086-4443-b85d-60de49cee71c_1600x900.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;:null,&quot;alt&quot;:&quot;CI at Anthropic: code 8x, CI jobs 25x in six months, three patches that lasted 70, 29 and under one day&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="CI at Anthropic: code 8x, CI jobs 25x in six months, three patches that lasted 70, 29 and under one day" title="CI at Anthropic: code 8x, CI jobs 25x in six months, three patches that lasted 70, 29 and under one day" srcset="https://substackcdn.com/image/fetch/$s_!QehB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!QehB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!QehB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!QehB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F372afe41-6086-4443-b85d-60de49cee71c_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">CI at Anthropic: code 8x, CI jobs 25x in six months, three patches that lasted 70, 29 and under one day</figcaption></figure></div><p>The clearest record of a constraint moving comes from Anthropic itself.</p><p>In a September 14 post, Anthropic&#8217;s Sachin Malhotra described what happened after agents took over most code writing. Anthropic produces about 8 times more code per quarter than it did in 2021 to 2025. Claude writes about 80% of it. Tests grew 10 times while headcount stayed roughly flat. <strong>CI jobs rose 25 times in six months.</strong></p><p>The post names the order. &#8220;Once PR review gets accelerated, CI starts feeling the pressure.&#8221;</p><p>The first thing to break was test selection. Anthropic ran only the tests affected by each change. A single process, called the listener, tracked which tests touched which code. It fell behind the PR queue. The first pages came in October 2025. Twenty minutes of listener lag meant tens of thousands of test updates were not applied.</p><p>The team patched it three times, and each patch lasted less time than the one before. A bigger machine bought 70 days. Sharding bought 29. Daily restarts bought less than one.</p><p>Then one engineer rebuilt it in three weeks. State moved to an in-memory store. Stateless workers append their results to a journal. The new design scales with the number of workers, not the size of one machine.</p><p>This is the pattern behind the 11x ledger at company scale. Remove the human step, and the next system in line takes the load. That system was designed for human pace. It holds for a while, with patches. Then the patches stop working and it needs a new design.</p><p>Teams adopting agents should expect this sequence and watch for it. If your CI queue time is rising faster than your PR count, CI is next. The time to redesign is when the second patch lasts half as long as the first, not after the third.</p><h2>Then source control broke, and Anthropic left git</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kyDS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kyDS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!kyDS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.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;:null,&quot;alt&quot;:&quot;Anthropic's monorepo: merges a day from 2,500 to 30,000+, and what moving off git changed&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="Anthropic's monorepo: merges a day from 2,500 to 30,000+, and what moving off git changed" title="Anthropic's monorepo: merges a day from 2,500 to 30,000+, and what moving off git changed" srcset="https://substackcdn.com/image/fetch/$s_!kyDS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!kyDS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c68da19-c01c-4be4-837f-7672bbb4d054_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Anthropic&#8217;s monorepo: merges a day from 2,500 to 30,000+, and what moving off git changed</figcaption></figure></div><p>After CI, the next system was source control. Anthropic described it in an October 13 post.</p><p>Merged changes to its monorepo went <strong>from about 2,500 a day in May 2026 to more than 30,000 a day in September</strong>. The main history is about 100 GB. CI ran about 25 million checkouts a day. Fetched the naive way, that would have meant more than 600 petabytes of git traffic a day. At peak, Anthropic ran several hundred git mirrors to keep up.</p><p>Anthropic names the root cause. Git was designed to work offline. Its clients are developers who sync occasionally. Agents are always online and sync constantly. The design that served people for twenty years worked against machines.</p><p>So Anthropic built its own version control system, called Scion, and a code review system called Antique. A team of seven moved the monorepo off git in five months. The new system uses about 200 times less CPU and memory than the git mirrors. Checkouts went from minutes to seconds. CI gained 25% more CPU capacity. The cache hit rate is above 99%.</p><p>Most teams will never reach 30,000 merges a day. The lesson still applies. Each removed constraint exposes the next one. The order at Anthropic was review, then CI, then source control. Each system was built for human pace and broke under agent pace.</p><p>Google reports the same kind of change from the other direction. Pichai said an agent-assisted code migration finished &#8220;six times faster than was possible a year ago with engineers alone.&#8221;</p><p>The useful question for any team is which of your systems assumes a human is on the other end. Rate limits, queue sizes, review tools, deploy windows and on-call rotations all carry that assumption. List them before agents find them for you.</p><h2>After the machines, the people became the constraint</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VnVM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VnVM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!VnVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.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;:null,&quot;alt&quot;:&quot;Anthropic sessions: about 80% idle waiting for a person; meta-work up from 10% to 22%&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="Anthropic sessions: about 80% idle waiting for a person; meta-work up from 10% to 22%" title="Anthropic sessions: about 80% idle waiting for a person; meta-work up from 10% to 22%" srcset="https://substackcdn.com/image/fetch/$s_!VnVM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!VnVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F063b9cb9-2aaf-4a67-805c-bdf24ea58cec_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Anthropic sessions: about 80% idle waiting for a person; meta-work up from 10% to 22%</figcaption></figure></div><p>Anthropic&#8217;s October 16 report on employment at Anthropic describes the step after CI and git. The constraint is now people.</p><p>Agent sessions spend about 80% of their time idle, waiting for human input. Human attention is &#8220;the bottleneck for agent output.&#8221; Work on the agents themselves, such as tooling, pipelines and prompts, <strong>rose from 10% of sessions in fall 2025 to 22% in spring 2026</strong>. The report also names the human side. An executive said &#8220;a workforce that is anxiously worried is not a workforce doing its best work.&#8221;</p><p>This fits a model older than software. Eliyahu Goldratt&#8217;s theory of constraints says a system moves at the pace of its tightest step. Improve that step, and another becomes the tightest. His last step is to avoid inertia and go back to the start. In agent terms: find the bottleneck, remove it, then look again.</p><p>Cherny&#8217;s line, &#8220;Find the bottleneck, solve the bottleneck,&#8221; is the same loop. It explains why the sequence keeps going. Review fell, so CI broke. CI was rebuilt, so git broke. Git was replaced, so attention is the limit.</p><p>Attention is harder to scale than a server. It cannot be sharded. That is why the costs in the middle of this edition matter. Thrashing, lost shared context and long hours are the symptoms of attention as the constraint.</p><p>The fixes at this stage look different. Fewer, better-scoped agent tasks. Agents that batch questions instead of interrupting. Tools that summarize what an agent did, so a person can review in minutes. Clear priorities, so engineers do not spend attention deciding what matters. The teams that solve this next will look less like they have more agents, and more like they ask their people for fewer decisions.</p><h2>AI is necessary but not sufficient</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-MAa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-MAa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-MAa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11db4445-8c43-4261-b133-95a39e103e7b_1600x900.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;:null,&quot;alt&quot;:&quot;Only 17% of developers and 23% of leaders say their company has a clear AI strategy&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="Only 17% of developers and 23% of leaders say their company has a clear AI strategy" title="Only 17% of developers and 23% of leaders say their company has a clear AI strategy" srcset="https://substackcdn.com/image/fetch/$s_!-MAa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!-MAa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11db4445-8c43-4261-b133-95a39e103e7b_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Only 17% of developers and 23% of leaders say their company has a clear AI strategy</figcaption></figure></div><p>If agents were enough on their own, every team would see Neil&#8217;s 11x. The data says they do not.</p><p>Atlassian&#8217;s State of Developer Experience 2026 surveyed more than 1,500 practitioners. <strong>Only 17% of developers and 23% of leaders said their organization has a clear, implemented AI strategy.</strong> Only 28% of developers feel less friction than before AI. Half, 49%, spend four or more hours a week reviewing AI output.</p><p>Faros&#8217;s April report is blunter: &#8220;Strong engineering foundations do not protect you.&#8221; Epics per developer rose 66%, but downstream quality got worse. Bugs per developer rose 54%.</p><p>Cortex&#8217;s 2026 benchmark found only 45% of organizations have AI policies. Its summary is the clearest single line on the subject: &#8220;AI amplifies both the best and worst aspects of your engineering practices.&#8221;</p><p>Charity Majors made the same argument in July. &#8220;Nondeterministic systems will require more engineering discipline, not less.&#8221;</p><p>Anthropic&#8217;s December study shows what the upside looks like when the organization adapts. 27% of Claude-assisted work at Anthropic was work that would not have been done otherwise. Running many Claude instances &#8220;allows you to test a bunch of different ideas.&#8221; That is experimentation built into the way people work.</p><p>So the evidence supports a simple rule. Agents are necessary for the large gains. They are not sufficient. The gains come from the changes around them: review moved to machines with guardrails, written context instead of tribal knowledge, systems rebuilt for agent pace, and limits on human attention.</p><p>Culture matters too. Teams that let people experiment with how they work find the next constraint sooner. Leaving agents running overnight, splitting work into workflows, and writing AGENTS.md files are all experiments that look odd at first. The organizations that allow them find out which ones work.</p><h2>Speed is not product-market fit</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZkTH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZkTH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZkTH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.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;:null,&quot;alt&quot;:&quot;AI-native companies grow faster but keep less: net revenue retention of 48%, against 82% for B2B SaaS&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="AI-native companies grow faster but keep less: net revenue retention of 48%, against 82% for B2B SaaS" title="AI-native companies grow faster but keep less: net revenue retention of 48%, against 82% for B2B SaaS" srcset="https://substackcdn.com/image/fetch/$s_!ZkTH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!ZkTH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36f8268-3c61-4d9a-aaf9-8ec178b6ba3e_1600x900.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI-native companies grow faster but keep less: net revenue retention of 48%, against 82% for B2B SaaS</figcaption></figure></div><p>Faster shipping helps a company only if it ships the right thing.</p><p>The speed is real. Stripe&#8217;s annual letter, published in February 2026, said its 2025 startup cohort is growing about 50% faster than the 2024 cohort. The number of companies reaching $10 million in annual revenue within three months of launch doubled. At Stripe Sessions in April, Stripe said top AI companies grew 120% in 2025 and 175% so far in 2026. Sam Altman said in April that the friction of starting a startup &#8220;has come down a lot.&#8221;</p><p>The retention is weaker. ChartMogul studied 3,500 companies for a December 2025 report. <strong>AI-native companies had a median gross revenue retention of 40% and net revenue retention of 48%.</strong> B2B SaaS had net revenue retention of 82%. ChartMogul&#8217;s summary: &#8220;The downside of being easy to buy is being easy to cancel.&#8221;</p><p>Marc Andreessen&#8217;s definition of product-market fit still frames the question: &#8220;being in a good market with a product that can satisfy that market.&#8221; Shipping more PRs does not answer it.</p><p>PostHog shows the order of events. It was founded in January 2020. By its own account, it reached product-market fit for its Scale product in September 2021, about 19 months after launch. Revenue grew six times in 2022. It passed 100,000 customers in October 2024 and turned cash-flow positive that December. Speed helped. Fit came first.</p><p>The edge for AI-native startups may also be temporary. Seema Amble of a16z wrote in September 2026 that &#8220;The incumbents aren&#8217;t sitting idly.&#8221; She argues that preserved context &#8220;is not a durable advantage.&#8221;</p><p>Established companies will adopt the same tools, more carefully, because they have more to lose. The startups that keep their lead will be the ones that turned speed into customers who stay.</p><h2>A checklist for teams going AI-native</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-9GM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-9GM!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-9GM!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif" width="720" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Eight checks before removing human review&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="Eight checks before removing human review" title="Eight checks before removing human review" srcset="https://substackcdn.com/image/fetch/$s_!-9GM!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 424w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 848w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 1272w, https://substackcdn.com/image/fetch/$s_!-9GM!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbad3f8ff-1856-4fa4-8021-86051fa9bb61_720x406.gif 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Eight checks before removing human review</figcaption></figure></div><p>Here is what this edition adds up to, as checks a team can run this quarter.</p><p><strong>Measure the change honestly.</strong></p><ul><li><p>Track volume, PR size and rework together. Use follow-up fixes within seven days, not just reverts.</p></li><li><p>Report per-developer change, not just totals.</p></li><li><p>Know your cost per merged PR and per prevented incident.</p></li></ul><p><strong>Move review to machines, with guardrails.</strong></p><ul><li><p>Route review depth by risk: a cheap reviewer on every PR, a deeper one on demand, humans on the riskiest tier.</p></li><li><p>Give the reviewer repository search and a rules file that names shared modules.</p></li><li><p>Turn every incident into a rule, and replay it against the PR that caused it before trusting it.</p></li></ul><p><strong>Encode the old human knowledge.</strong></p><ul><li><p>Store money as integers in minor units, and test a zero-decimal and a three-decimal currency.</p></li><li><p>Require concurrent index builds on large tables, in the reviewer&#8217;s rules and in a migration linter.</p></li><li><p>Write AGENTS.md files for each area, so context outlives its owner.</p></li></ul><p><strong>Protect the scarce input: attention.</strong></p><ul><li><p>Cap agent sessions per person, and finish before starting.</p></li><li><p>Turn off agent notifications and check in on your own schedule.</p></li><li><p>Set a hard end to the day. Do not make risky changes when tired.</p></li></ul><p><strong>Watch for the next constraint.</strong></p><ul><li><p>List every system that assumes a human on the other end: CI, source control, rate limits, deploy windows.</p></li><li><p>Redesign when the second patch lasts half as long as the first.</p></li><li><p>Give one person ownership of design, so speed does not ship the default look.</p></li></ul><p>The two eras are not separated by a model release. They are separated by which human steps a team removed, and how well it replaced them.</p><p>Reply to this email with two numbers from your team: merged pull requests per engineer per month, and median time from opening a pull request to merging it. We will publish what readers send, without names, in a future edition.</p><h2>Sources</h2><ul><li><p>Neil Kakkar, &#8220;Two eras of shipping&#8221; ledger, charts and table (neilkakkar.com)</p></li><li><p>Neil Kakkar, &#8220;About&#8221; and CV (neilkakkar.com)</p></li><li><p>GitHub, &#8220;Octoverse 2026&#8221;, 28 Oct 2026 (github.blog)</p></li><li><p>Stack Overflow, &#8220;2026 Developer Survey results&#8221;, 6 Oct 2026 (stackoverflow.blog)</p></li><li><p>Faros AI, &#8220;AI acceleration whiplash&#8221;, 12 Apr 2026 (faros.ai)</p></li><li><p>Cortex, &#8220;2026 Engineering Benchmark&#8221; (cortex.io)</p></li></ul><ul><li><p>Neil Kakkar, &#8220;Review ratio&#8221;, &#8220;Under the multiplier&#8221; and &#8220;What I built&#8221; charts (neilkakkar.com)</p></li><li><p>Cloudflare, &#8220;AI code review&#8221;, 20 Apr 2026 (blog.cloudflare.com)</p></li><li><p>Intercom, &#8220;AI is approving our pull requests&#8221;, 21 Apr 2026 (intercom.com)</p></li><li><p>Anthropic, &#8220;Code Review for Claude Code&#8221;, 9 Mar 2026 (claude.com)</p></li><li><p>Fortune, interview with Boris Cherny, 11 Jun 2026 (fortune.com)</p></li><li><p>Google, &#8220;Sundar Pichai at Cloud Next 2026&#8221;, 22 Apr 2026 (blog.google)</p></li><li><p>Claude Code docs, &#8220;GitHub Actions&#8221;, &#8220;Ultrareview&#8221; and &#8220;Customize code review&#8221; (code.claude.com)</p></li><li><p>SIX, &#8220;ISO 4217 List One&#8221;, 17 Sep 2026 (six-group.com)</p></li><li><p>Stripe docs, &#8220;Supported currencies&#8221; (docs.stripe.com)</p></li><li><p>PostgreSQL docs, &#8220;CREATE INDEX&#8221; (postgresql.org)</p></li><li><p>strong_migrations (github.com/ankane)</p></li><li><p>GitLab docs, &#8220;Adding database indexes&#8221; (docs.gitlab.com)</p></li><li><p>Squawk docs, &#8220;require-concurrent-index-creation&#8221; (squawkhq.com)</p></li><li><p>Every, &#8220;Compound engineering&#8221;, 11 Dec 2025 (every.to)</p></li><li><p>DORA, &#8220;DORA metrics guide&#8221;, updated 5 Jan 2026 (dora.dev)</p></li><li><p>Google, &#8220;Site Reliability Workbook: Incident response&#8221; (sre.google)</p></li><li><p>Amazon, 2015 letter to shareholders (sec.gov)</p></li><li><p>PostHog, &#8220;Persons on events&#8221;, 2 Nov 2022 (posthog.com)</p></li><li><p>Neil Kakkar, &#8220;AI made me braver&#8221;, 21 Jun 2026 (neilkakkar.com)</p></li><li><p>Seedcamp, &#8220;Tano announces their angel round&#8221;, 24 Nov 2025 (seedcamp.com)</p></li><li><p>Anthropic, &#8220;Building effective agents&#8221; (anthropic.com)</p></li><li><p>Anthropic, &#8220;How AI is transforming work at Anthropic&#8221;, 2 Dec 2025 (anthropic.com)</p></li><li><p>OpenAI, &#8220;Harness engineering&#8221;, 11 Feb 2026 (openai.com); InfoQ summary, 21 Feb 2026 (infoq.com)</p></li><li><p>PostHog handbook, &#8220;Small teams&#8221;, &#8220;Product engineers&#8221; and &#8220;Helping engineers do product&#8221; (posthog.com)</p></li><li><p>Neil Kakkar, &#8220;Agentic debt&#8221;, 24 Feb 2026, and &#8220;How I&#8217;m productive with Claude Code&#8221;, 16 Mar 2026 (neilkakkar.com)</p></li></ul><ul><li><p>Anthropic, &#8220;Employment at Anthropic&#8221;, 16 Oct 2026 (anthropic.com)</p></li><li><p>Simon Willison, &#8220;AI intensifies work&#8221;, 9 Feb 2026, and Lenny&#8217;s Podcast notes, 2 Apr 2026 (simonwillison.net)</p></li><li><p>Steve Yegge, &#8220;The AI Vampire&#8221; (yegge-ai.pages.dev); Hanselminutes episode 1035, 5 Feb 2026 (hanselminutes.com)</p></li><li><p>Harness, &#8220;State of DevOps Modernization 2026&#8221; (harness.io)</p></li><li><p>Peter Denning, &#8220;Thrashing: its causes and prevention&#8221;, 1968 (cs.uwaterloo.ca)</p></li><li><p>Neil Kakkar, &#8220;Work areas&#8221; and &#8220;Shape of a day&#8221; charts (neilkakkar.com)</p></li><li><p>Addy Osmani, &#8220;Cognitive parallel agents&#8221;, 7 Apr 2026 (addyosmani.com)</p></li><li><p>Harvard Business Review, &#8220;When using AI leads to brain fry&#8221;, 5 Mar 2026 (hbr.org); Fortune coverage, 10 Mar 2026 (fortune.com)</p></li><li><p>PostHog handbook, &#8220;How we review&#8221; (posthog.com)</p></li><li><p>Anthropic, &#8220;AI assistance and coding skills&#8221;, 29 Jan 2026 (anthropic.com)</p></li><li><p>Charity Majors, &#8220;AI demands more engineering discipline, not less&#8221;, 27 Jul 2026 (oreilly.com)</p></li><li><p>Avelino et al., &#8220;A novel approach for estimating truck factors&#8221;, 2016 (arxiv.org)</p></li><li><p>AGENTS.md (agents.md); OpenAI Codex docs, &#8220;AGENTS.md&#8221; (learn.chatgpt.com)</p></li><li><p>Mitchell Hashimoto, &#8220;My AI adoption journey&#8221;, 5 Feb 2026 (mitchellh.com)</p></li><li><p>Anthropic, &#8220;Improving frontend design through skills&#8221;, 12 Nov 2025 (claude.com); &#8220;frontend-design&#8221; skill (github.com/anthropics)</p></li><li><p>PostHog, &#8220;The first five&#8221; (posthog.com)</p></li><li><p>Anthropic, &#8220;Claude pricing&#8221;, &#8220;Using Claude Code with your Pro or Max plan&#8221; and &#8220;API pricing&#8221; (claude.com)</p></li><li><p>Tomasz Tunguz, &#8220;Tokenmaxxing&#8221;, 1 Apr 2026 (tomtunguz.com); IBM, &#8220;What is tokenmaxxing&#8221;, 1 Sep 2026 (ibm.com)</p></li><li><p>PostHog, &#8220;Replay Vision&#8221;, 22 Sep 2026 (posthog.com)</p></li><li><p>Sentry, &#8220;Automated debugging workflow&#8221;, 6 Aug 2026 (blog.sentry.io)</p></li></ul><ul><li><p>Anthropic, &#8220;Agentic coding is straining CI&#8221;, 14 Sep 2026 (claude.com)</p></li><li><p>Anthropic, &#8220;Redesigning source control&#8221;, 13 Oct 2026 (anthropic.com)</p></li><li><p>TOC Institute, &#8220;The five focusing steps&#8221; (tocinstitute.org)</p></li><li><p>Atlassian, &#8220;State of Developer Experience 2026&#8221; (atlassian.com)</p></li><li><p>Stripe, &#8220;2025 annual letter&#8221; and &#8220;Stripe Sessions 2026: Inside the AI economy&#8221; (stripe.com)</p></li><li><p>OpenAI Forum, Sam Altman event replay, 6 Apr 2026 (forum.openai.com)</p></li><li><p>ChartMogul, &#8220;The AI churn wave&#8221;, 10 Dec 2025 (chartmogul.com)</p></li><li><p>Marc Andreessen, &#8220;The only thing that matters&#8221; (pmarchive.com)</p></li><li><p>PostHog handbook, &#8220;Our story&#8221; (posthog.com)</p></li><li><p>a16z, &#8220;The Incumbents Are Coming&#8221;, 3 Sep 2026 (a16z.com)</p></li></ul>]]></content:encoded></item></channel></rss>