<?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[Refactoring: 🧵 Essays]]></title><description><![CDATA[Hard engineering / management topics, explained weekly in 2000 words]]></description><link>https://refactoring.fm/s/essays</link><image><url>https://substackcdn.com/image/fetch/$s_!CR5A!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png</url><title>Refactoring: 🧵 Essays</title><link>https://refactoring.fm/s/essays</link></image><generator>Substack</generator><lastBuildDate>Tue, 27 Oct 2026 09:20:26 GMT</lastBuildDate><atom:link href="https://refactoring.fm/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Refactoring ETS]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[refactoring@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[refactoring@substack.com]]></itunes:email><itunes:name><![CDATA[Luca Rossi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Luca Rossi]]></itunes:author><googleplay:owner><![CDATA[refactoring@substack.com]]></googleplay:owner><googleplay:email><![CDATA[refactoring@substack.com]]></googleplay:email><googleplay:author><![CDATA[Luca Rossi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Introducing Tolaria for mobile! 📱]]></title><description><![CDATA[Plus a new round of monthly updates on my coding workflow.]]></description><link>https://refactoring.fm/p/introducing-tolaria-mobile</link><guid isPermaLink="false">https://refactoring.fm/p/introducing-tolaria-mobile</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 21 Oct 2026 13:13:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IJ65!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there! Welcome to a new edition of my monthly updates on <strong>how I build <a href="https://tolaria.md/">Tolaria</a></strong>.</p><p>Once a month, I share how the project is going: an overall recap, the latest updates, and what I learned along the way. Everything comes from real experiments, including the parts that didn&#8217;t go as planned!</p><p>This is a big edition: I am introducing our <strong>brand new iOS app</strong> and massive updates to the coding workflow!</p><div class="callout-block" data-callout="true"><p>Tolaria itself stays free and open source thanks to the <a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">Tolaria Alliance</a> and the tools I use every day:</p><ul><li><p><strong><a href="http://codescene.com/">CodeScene</a></strong>: keeps code health high across the codebase. It&#8217;s one of the gates every push has to pass.</p></li><li><p><strong><a href="https://codacy.com/tolaria">Codacy</a></strong>: code quality and security. This month it also got a new role in my agent setup, more on that below.</p></li><li><p><strong><a href="https://getunblocked.com/">Unblocked</a></strong>: helps agents (and me) find context across the codebase, ADRs, GitHub issues and commit history.</p></li><li><p><strong><a href="http://circleci.com/">CircleCI</a></strong>: our CI. This month we moved the main pipeline over completely, and it got about 4&#215; faster!</p></li></ul></div><p>If you missed the previous episodes, last month we talked about <a href="https://refactoring.fm/">moving agents from local machines to the cloud</a>, and earlier chapters covered <a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">how I run the Tolaria project</a> and <a href="https://refactoring.fm/i/200102476/guides-gates-and-guards">guides, gates and guards</a>.</p><p>Here is the agenda for today:</p><ul><li><p>&#128034; <strong>Why releases have been slower</strong> &#8212; a personal note, before the news.</p></li><li><p>&#128241; <strong>Introducing Tolaria for iOS</strong> &#8212; with Android coming soon!</p></li><li><p>&#9729;&#65039; <strong>Cloud dev environments</strong> &#8212; plus Verity, and how agents access tools.</p></li><li><p>&#129302; <strong>Growing the bot family</strong> &#8212; the assistants that help me run everything.</p></li><li><p>&#128301; <strong>What&#8217;s next</strong> &#8212; Tolaria on the web, and inside your agents.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128034; Why releases have been slower</h2><p>I want to start with a small apology, as you may have noticed that Tolaria releases have been slower these last couple of months.</p><p>The truth is, after the big rush of the first months, <strong>I took some time off</strong>. This gave me some space to look at how I was working from a distance, and reflect.</p><p>I believe my #1 mistake has been to allow my attention to spread too thin across a <em>deluge</em> of small things every day instead of fewer, bigger bets that would truly make a difference. This is understandable because Tolaria has a massive <em>surface</em> for bugs and small tweaks, as it: 1) runs on multiple OSes, 2) works with multiple AI agent hosts, 3) works with the file system, the CLI, git, and 4) just does a lot of things! So I can literally fill up all of my time just working on the small improvements that people report on every day.</p><p>This felt productive, but over time I also got stressed and less motivated by that kind of work. So I took a step back, got back to the drawing board, and this is what I want to do now:</p><ul><li><p><strong>Invest most of my time in the big bets</strong> &#8212; define the few clear areas that need most of my human taste and strategy input. For me right now, these are mobile, a web version of Tolaria, and how Tolaria works with agents (more on all of these later!)</p></li><li><p><strong>Create a good workflow for the small daily improvements</strong> &#8212; good product experience is made of a thousand small things, so the little daily tweaks count. But it&#8217;s important that I keep improving my workflow so that these get done without draining my energy, and the product keeps improving, instead of degrading.</p></li></ul><p>All in all, I am figuring this out as we go, so thanks for sticking with me.</p><p>Anyway, the good news is that, from now on, things are going to get much faster. Over these months, I pretty much rebuilt how I work: the new setup lets me do much more in parallel, and scales much better than before. You can see the first results in the updates below, starting with the biggest bet of all, which is ready for you to try &#128071;</p><div><hr></div><h2>&#128241; Introducing Tolaria for iOS</h2><p>The big news of the month is: <strong>Tolaria now runs on iPad and iPhone.</strong> &#127881;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IJ65!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IJ65!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 424w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 848w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 1272w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IJ65!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png" width="1200" height="746.7032967032967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:906,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:3044530,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/221142028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!IJ65!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 424w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 848w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 1272w, https://substackcdn.com/image/fetch/$s_!IJ65!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd54712-cd30-435a-893a-d5d5765e2233_4096x2548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image 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">Introducing the Tolaria iOS app!</figcaption></figure></div><p>Mobile has always been, far and away, the #1 requested feature on our product board. If you run an iOS device, now it&#8217;s here for you to try.</p><p>But also let me be honest. The apps are still in a rough state: some parts are ugly, some are bugged, and some probably won&#8217;t work at all. But the core of what makes Tolaria useful is already there, and works on both iPad and iPhone. Like, for example:</p><ul><li><p>The visual Markdown editor, with slash commands, properties, and source mode.</p></li><li><p>Real Git push and pull with auto-commit, and two-way sync with an iCloud or Files folder.</p></li><li><p>The command palette, plus iOS gestures and rotation.</p></li><li><p>19 languages, like the desktop app.</p></li></ul><p>Some of the rough edges include: git sync being limited to repos you clone from GitHub (with Github sign-in), large vaults are kinda slow to clone, and the app just crashing sometimes. Also, no AI yet, but coming soon.</p><p>The iOS app is available today on <a href="https://testflight.apple.com/join/7aPD4GAB">TestFlight</a>. And since Tolaria is open source, you can also check out the source code and compile it yourself!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://testflight.apple.com/join/7aPD4GAB&quot;,&quot;text&quot;:&quot;Download from TestFlight&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://testflight.apple.com/join/7aPD4GAB"><span>Download from TestFlight</span></a></p><p>Also, I also created a brand new Discord server to talk about all things Tolaria. I will also use it to post changelogs and announcements, and I will engage personally with the community. You can join below:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://discord.gg/gbMyQWJ64w&quot;,&quot;text&quot;:&quot;Join Tolaria's Discord&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://discord.gg/gbMyQWJ64w"><span>Join Tolaria's Discord</span></a></p><p>Finally, a couple of FAQs:</p><h3>What about Android?</h3><p>Because the app is built in React Native, Android is coming soon. I just haven&#8217;t had much time to test it yet, and I&#8217;d rather ship it when I&#8217;m confident it works well. But of course, you are welcome to try it from the source, and submit PRs to make it better.</p><h3>Why React Native?</h3><p>You might have seen that Shopify <a href="https://shopify.engineering/back-to-native">recently announced</a> it&#8217;s moving its mobile apps from React Native back to native Swift and Kotlin. They had gone all-in on React Native in 2020, and they explain that coding agents have made building each feature much cheaper, so native is now viable and keeps them closer to platform capabilities.</p><p>So could I have gone native? Maybe yes, but what really moved the needle for me were over-the-air (OTA) updates. With OTA, I can push fixes and improvements straight to users, without waiting on reviews each time. Now that agents can ship very fast, that felt table-stakes to me. And yes, there is also some code we can share between the desktop and mobile versions, but it&#8217;s not a lot anyway, so it was not a primary factor in the decision.</p><p>Let me know your thoughts, and on to the next updates &#128071;</p><div><hr></div><h2>&#9729;&#65039; Cloud dev environments</h2><p>Last month I wrote about my agents moving from local machines to the cloud. This month, the whole development environment followed.</p><h3>1) Three coding agents, two of which in the cloud</h3><p>Before, my coding agent ran on my Mac Mini with Codex, doing one thing at a time. Simple as that! In September, it had become already obvious that this was extremely inefficient:</p><ul><li><p>Doing one thing at a time was no longer enough, given the various work threads: desktop, web, and mobile.</p></li><li><p>Mobile access was cumbersome, and so was access for other agents (e.g. Grok Bot)</p></li><li><p>Long-tail reliability issues were real: I got a brief power outage while a was away, stalling work days; macOS sometimes <em>really</em> wants to restart; Starlink goes down, etc.</p></li></ul><p>So, since early October, I have moved most of the work to two Linux machines on Hetzner: one of them runs Codex, and the other runs Claude Code. I also still use the Mac mini for the iOS mobile work and builds.</p><p>Having both an OpenAI and Anthropic <em>stack</em> is useful for many reasons, like being able to immediately test new models, and use tools that are specific to one of the two stacks, like <a href="https://verity.md/">Verity</a>, which I use with CC.</p><p>This setup also completely untethered coding from my machines, and I can now drive work from my &#8220;PM&#8221; Grok Bot agent, who in turn SSH into the coding machines.</p><h3>2) Welcome Linear</h3><p>I also <strong>moved from Todoist to Linear</strong> for tracking work.</p><p>All the work the agents pick up now lives in Linear, which provides cleaner (and deeper) abstractions for product dev work, and also better agent integrations.</p><p>This is still early, so I don&#8217;t have a lot to say about it, but the integration has been seamless so far, and I am learning how to use it best.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4ZMH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4ZMH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 424w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 848w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 1272w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4ZMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png" width="728" height="263.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba5413e0-f81f-4335-9741-9765d914db06_2668x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:527,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:307099,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/221142028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4ZMH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 424w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 848w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 1272w, https://substackcdn.com/image/fetch/$s_!4ZMH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5413e0-f81f-4335-9741-9765d914db06_2668x966.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>3) 4x faster CI with <a href="https://circleci.com/">CircleCI</a></h3><p>On the CI side, <strong>we moved from GitHub Actions to</strong> <strong><a href="https://circleci.com/">CircleCI</a></strong>, and the main pipeline went from about 15&#8211;16 minutes to ~4, which is roughly 4&#215; faster!</p><p>Locally, every push still goes through the same Husky gates, performed on the CircleCI sidecar chunks, largely in parallel: CodeScene (10/10), Codacy (zero new findings), unit tests, and Playwright smoke tests.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u0Y7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 424w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 848w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 1272w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u0Y7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png" width="728" height="237" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:474,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:153894,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/221142028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u0Y7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 424w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 848w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 1272w, https://substackcdn.com/image/fetch/$s_!u0Y7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673c3f0c-71d6-4833-a791-49d1f8675efc_2952x962.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></div></figure></div><h3>4) Using <a href="https://verity.md/tolaria">Verity</a></h3><p>I started using <a href="https://verity.md/tolaria">Verity</a>, a new product from the team at <a href="https://codacy.com/tolaria">Codacy</a>, on my Claude Code machine.</p><p>When the coding agent completes a task, Verity checks the change for quality, security and whether it matches the product&#8217;s tech strategy, using AI review, static analysis and formal proofs in <a href="https://lean-lang.org/">Lean</a>. It either passes the change, or blocks and hands the fix to the agent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N0qT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N0qT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 424w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 848w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 1272w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N0qT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png" width="728" height="277" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:554,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:436877,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/221142028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N0qT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 424w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 848w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 1272w, https://substackcdn.com/image/fetch/$s_!N0qT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1662a744-5949-49e5-a9e1-68c1f116f479_3697x1406.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With respect to other tools, what sets it apart is the <strong>knowledge base</strong> concept. Every important decision gets recorded alongside my ADRs and docs, so future sessions learn from past ones and don&#8217;t repeat the same mistakes.</p><p>It has already blocked several changes, for legit reasons. I like it so far, and I like the dashboard it includes, where you can check runs, usage, the knowledge base itself, and more. Free during beta, with v1 launching in the coming weeks.</p><h4>5) Centralized access to tools</h4><p>With more agents doing more work (including Grok Bot, see more below), the way we used to handle credentials got really messy, with tokens scattered across machines, configs and bot settings.</p><p>I first moved agent access to tools into <strong>1Password</strong>, but it didn&#8217;t work super well so I developed a small <strong>custom vault service</strong>. Every agent has its own identity, looks up the logins it needs, and can create new ones. It&#8217;s a small thing on paper, but it made the whole setup feel a lot more manageable.</p><p>It&#8217;s also way easier now to spin up new agents on any agent host, as I can simply give it access to the vault.</p><div><hr></div><h2>&#129302; Growing our Grok Bot family</h2><p>Behind all of this, there&#8217;s a growing family of assistants.</p><p>In September I ported my non-coding agents to Grok Bot, and this month we expanded on it, spawning more of them for dedicated areas, and it has all been working very well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eO4B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eO4B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 424w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 848w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 1272w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eO4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png" width="334" height="633.7330037082818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1535,&quot;width&quot;:809,&quot;resizeWidth&quot;:334,&quot;bytes&quot;:194457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/221142028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eO4B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 424w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 848w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 1272w, https://substackcdn.com/image/fetch/$s_!eO4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b71b69f-bc63-43f7-82f2-bb7ba657c7ea_809x1535.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I don&#8217;t think it&#8217;s worth going into detail about what each bot does, but here are general lessons we have learned in the process:</p><ul><li><p><strong>Make spawning new agents as easy as possible</strong>. We developed the vault for credentials, and a small custom tool to automatically connect new bots to Slack. Unsurprisingly, the less friction there is in delegating and scaling work, the more work you will delegate and scale!</p></li><li><p><strong>Shared team bots + personal assistants work great</strong>. Everyone on our team has a personal bot that acts as chief of staff, plus we have shared bots for the areas where we collaborate. This seems like a good pattern that is working well for us.</p></li><li><p><strong>Mobile access matters a lot</strong>. If I had to pick just one reason why Grok Bot is winning for us, it would be mobile. Whatever agent host you use, make sure you create a good mobile experience (notifications, sync, voice notes, calls). Working with agents is more and more about doing many small things at random times, rather than sitting at your computer for long stretches, so mobile is an incredible enabler.</p></li></ul><p>So far I&#8217;m very happy with Grok Bot itself. A big reason is also that it now runs models other than Grok under the hood, like Opus 5.5, and the difference in quality shows.</p><div><hr></div><h2>&#128301; What&#8217;s next</h2><p>Beyond mobile, two big things are coming next: Tolaria on the web, and inside your agents.</p><h3>1) Tolaria on the web</h3><p>Many teams have asked for a simpler, managed version of Tolaria. This doesn&#8217;t mean changing how the desktop app works: it stays fully offline-first, vaults are still cloned locally as Git repos, and so on.</p><p>What can change is the <strong>hosting</strong>.</p><p>Today, to share a vault with your team, you need GitHub or another Git host. That works, but it gets messy when it comes to managing permissions and onboarding people. A GitHub repo also has a pretty much all-or-nothing permission model: someone either has access to the whole thing, or they don&#8217;t. For code that&#8217;s fine, but for docs it&#8217;s limiting, especially once external contributors are involved.</p><p>So the question for me becomes: can we retain the core principles of Tolaria, while also bringing it <strong>closer to how Google Docs works</strong>, where you can share specific documents with colleagues and partners?</p><p>A web version of Tolaria, that also hosts your file, is the natural place for that. Like the rest of Tolaria, it will be <strong>open-source and self-hostable</strong>. But we&#8217;ll also offer a simple managed option you can pay for, priced very cheaply.</p><p>Work is already underway!</p><h3>2) Tolaria inside your agents</h3><p>Last week I wrote about <a href="https://refactoring.fm/p/how-to-design-a-good-mcp-server">how to design a good MCP server</a>, and the backdrop to that piece is that more and more work is obviously happening inside agent hosts.</p><p>I expect docs to follow the same path: more and more people will add to and edit their Tolaria vaults through agents, in their favorite agent environment, rather than inside Tolaria itself.</p><p>It&#8217;s already true for me, by the way! Tolaria is at the center of my workflow and the source of my knowledge base, yet, the more my agents get good at working on it, the less I use it directly.</p><p>So we want to build good plugins for all the major agent hosts (Grok Bot, Claude, ChatGPT, Codex). Also, not just tools for chatting with the agent, but also some UI and things you can do right inside the host. Today, Tolaria already ships a local MCP server with 12 tools, which register itself automatically. A few ideas we&#8217;re exploring for what comes next, none decided yet:</p><ul><li><p>Live, editable note cards rendered inside the agent chat.</p></li><li><p>A hosted remote MCP, so ChatGPT and Claude can reach your vault (possible with the web version!)</p></li></ul><p>We&#8217;re going to invest big here, because more and more work is shifting to those surfaces.</p><p>I&#8217;d love your help with this. If you use Tolaria through agents today, hit reply and tell me how. And if you try the mobile app, tell me what you think, rough edges included.</p><div><hr></div><p>And that&#8217;s it for today! I wish you a great week</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[How to Design a Good MCP Server 🔌]]></title><description><![CDATA[Taking from successful examples at Notion, Stripe, Block, Sentry, and more!]]></description><link>https://refactoring.fm/p/how-to-design-a-good-mcp-server</link><guid isPermaLink="false">https://refactoring.fm/p/how-to-design-a-good-mcp-server</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Thu, 15 Oct 2026 08:06:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e2e3ac1f-658d-4890-ba05-15fcac1955dd_2046x1366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, Luca here! Welcome to the </em>&#10024;&#65039;&#65039;&#65039;&#65039;&#65039;&#65039;&#65039;<em> <strong>monthly free essay</strong></em> &#10024;&#65039;&#65039;&#65039;&#65039;&#65039;&#65039;&#65039;<em> from Refactoring.</em></p><p><em>Every week I write an article to 170K+ engineers about how to make good software together. To get access to all our articles, resources, and our <a href="https://refactoring.fm/p/refactoring-community">private community</a>, subscribe to the <a href="http://refactoring.fm/subscribe?">full version</a>.</em></p><div><hr></div><p>More and more products these days show up inside agent hosts like ChatGPT, Claude, Grok Bot, as plugins that the model can use. In many cases, agents also act proactively and recommend plugins that fit their current job.</p><p>This means, as many predicted, that agents are becoming <a href="https://x.com/skirano/status/2105353473118404648">important distribution platforms</a>, with many users discovering new products from inside them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MqjY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MqjY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 424w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 848w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MqjY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png" width="436" height="535.3605442176871" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1444,&quot;width&quot;:1176,&quot;resizeWidth&quot;:436,&quot;bytes&quot;:141586,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/219986578?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MqjY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 424w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 848w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 1272w, https://substackcdn.com/image/fetch/$s_!MqjY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b38a572-2e1c-4f8d-a3d6-dea12e18bff7_1176x1444.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Such plugins, under the hood, are <strong>powered by MCP servers</strong>, which wrap and expose the tool's functionality.</p><p>On paper, these look easy to build. In practice, less so.</p><p>I bet everyone who has played with agents for a while has found themselves routinely battling with MCPs that are either broken, or incomplete, or don&#8217;t work as intended. I surely have, and I keep seeing <strong>embarrassing stories</strong> popping up on the internet about it.</p><p>Just last week, Figma <a href="https://x.com/badlogicgames/status/2105234146499203255">got backlash</a> for having hardcoded the list of allowed clients in their MCP server, effectively disabling popular tools like Pi and OpenCode. One of the creators of the MCP protocol himself <a href="https://x.com/GayaniFigma/status/2105295629941350454">chimed in</a> to note that this is not how the protocol should work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YKLE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YKLE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 424w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 848w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 1272w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YKLE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png" width="460" height="363.3220338983051" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:932,&quot;width&quot;:1180,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:252735,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/219986578?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YKLE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 424w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 848w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 1272w, https://substackcdn.com/image/fetch/$s_!YKLE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ead9229-bef2-400a-a922-89c6cfb25c3a_1180x932.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Why does this happen? I believe many teams just underestimate what it takes to create good MCP servers. They think about them as simple API wrappers, assign the task to an intern, and call it done.</p><p>Last year I wrote <a href="https://refactoring.fm/p/how-to-design-apis-for-an-ai-world">How to Design APIs for an AI World</a>, because it was already clear that APIs needed to be adapted for when the caller was an agent rather than deterministic software. Fast forward to today, a lot has changed about how agents interact with software, so I am writing a sequel that 1) dives deeper, and 2) covers more of the product surface.</p><p>To do this well, I am also looping in <a href="https://www.linkedin.com/in/luigipederzani/?isSelfProfile=false">Luigi Pederzani</a> and the guys at <a href="http://manufact.com/?utm_source=refactoring">Manufact</a>, who I have known for a long time. They are the authors of the open-source framework <a href="https://github.com/mcp-use/mcp-use?utm_source=refactoring">mcp-use</a> and have been working on MCPs from the very early days, so they are the most knowledgeable people I know about this space.</p><p>I will also be pulling real examples from products that are doing this right, like Notion, Block, Stripe, and Sentry, so you&#8217;ll leave this article with practical references that you can take inspiration from. </p><p>So here is the agenda:</p><ul><li><p>&#129513; <strong>Jobs instead of endpoints</strong> &#8212; deciding which tools should exist in the first place.</p></li><li><p>&#129517; <strong>Designing for an agent caller</strong> &#8212; descriptions, improvisation, errors, and UI.</p></li><li><p>&#128260; <strong>The production lifecycle</strong> &#8212; what is different from running a normal backend.</p></li><li><p>&#9878;&#65039; <strong>Self-host vs managed</strong> &#8212; figuring out when each one makes sense.</p></li><li><p>&#9989; <strong>Checklist</strong> &#8212; what to do with your team next week.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><p><em>Disclaimer: I am thankful to <a href="https://manufact.com/?utm_source=refactoring">Manufact</a> for partnering on this and sharing how they see MCP design and production in the wild. I am a fan of what they build and you should check it out.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://manufact.com/?utm_source=refactoring&quot;,&quot;text&quot;:&quot;Learn more about Manufact&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://manufact.com/?utm_source=refactoring"><span>Learn more about Manufact</span></a></p><p><em>As always, I will only write my unbiased opinion on the practices and tools covered, Manufact included.</em></p><div><hr></div><h2>&#129513; Jobs instead of endpoints</h2><p>So, where do you start?</p><p>In my experience, the most common mistake is simply taking the endpoints you already have and turning each of them into a tool. REST (or GraphQL) APIs are usually built around <em>resources</em> and CRUD verbs, which work great for software that knows exactly what it wants, and can express it as atomic operations.</p><p>An agent, instead, is trying to <strong>complete a job</strong> on behalf of a user, like &#8220;file this bug with a reproduction and an assignee&#8221;, or &#8220;summarize the blockers of this sprint&#8221;.</p><p>If jobs <em>depart</em> too much from what single API endpoints do, the model spends tokens (and time) finding the right paths, chains five calls where one would do, and may still fail the workflow the user actually wanted.</p><p>Instead, it&#8217;s useful to work top-down, starting with the end in mind. List the handful of <strong>end-to-end workflows</strong> people actually ask agents to do with your product, and then design one tool, or a tight chain of tools, for each of them.</p><p>This also gives you a rule of thumb for granularity:</p><ul><li><p><strong>Too fine-grained</strong> &#8212; and you pay for multi-hop agent loops (LLM seconds times N) on top of a confused tool choice.</p></li><li><p><strong>Too coarse</strong> &#8212; like one mega-tool with a kitchen-sink schema, and arguments get brittle, recovery gets hard, and auth gets messy.</p></li></ul><p>A good default is tools that finish a job in one or two calls, batching related reads when you can and keeping multi-step flows for the domains that truly need them. When you do need them, make the intermediate state explicit in the responses, so the model can continue without guessing.</p><p>A useful example is Notion, because they shipped both versions.</p><p>In the Notion API, the content of a page is a tree of <em>blocks</em> (paragraphs, headings, to-dos and so on), and their first, open-source MCP server <a href="https://www.notion.com/blog/notions-hosted-mcp-server-an-inside-look">mapped each endpoint 1:1 to a tool</a>, so agents had to work with blocks too. Blocks are a great abstraction for an API: they are granular and composable, and they give apps that render or sync Notion content precise control over every detail.</p><p>An agent, however, usually has a bigger job in mind, like writing up a meeting recap or adding a section to a plan, where the natural unit is the page. Notion&#8217;s own takeaway was that 1:1 mapping &#8220;<em>created suboptimal experiences for AI agents</em>.&#8221;</p><p>So, on their new <a href="https://developers.notion.com/guides/mcp/mcp-supported-tools">hosted server</a>, they eventually changed the abstraction. There is no tool to create, update or delete individual blocks anymore: pages go in and out as Notion-flavored Markdown, and one page-level call replaces a chain of block calls:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oUVq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oUVq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 424w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 848w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oUVq!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png" width="1200" height="557.967032967033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:677,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:265333,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/219986578?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oUVq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 424w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 848w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 1272w, https://substackcdn.com/image/fetch/$s_!oUVq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf13648d-0168-4497-8058-e00672ada9c1_2418x1124.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">How the Notion MCP server evolved from mirroring API endpoints to tools reflecting broader jobs.</figcaption></figure></div><p>The work of turning Markdown into nested blocks, or finding the right block to change, moved inside the server.</p><p>Block tells a similar story in their <a href="https://engineering.block.xyz/blog/blocks-playbook-for-designing-mcp-servers">MCP playbook</a>: the first version of their internal Linear MCP had 30+ tools that mirrored the API, and a question like &#8220;what issues is bob@example.com working on&#8221; took four to six calls.</p><div><hr></div><h2>&#129517; Designing for an agent caller</h2><p>Once you know which tools should exist, the next question is how they should behave.</p><p>The thing to keep in mind here is that your caller is different in many ways from the software that typically hits your API. We covered this for APIs in general <a href="https://refactoring.fm/p/how-to-design-apis-for-an-ai-world">last year</a>, and most of those ideas apply to MCP, with possibly even less forgiveness.</p><p>To me, here are the most important ideas to remember:</p><h3>1) Descriptions are runtime</h3><p>Developers read your API docs once and internalize the patterns, while agents re-read tool names and descriptions at every turn, inside a limited context window, and decide what to call based on that alone.</p><p>So, you should 1) name tools the way a user would phrase the request, and 2) use the description for the stuff that actually drives behavior: constraints, preconditions, and when <em>not</em> to use the tool. I would also put description edits through review and some testing, because changing a sentence there can change what the model does as much as changing code.</p><p>Sentry&#8217;s MCP server does this well, for example, in its <a href="https://github.com/getsentry/sentry-mcp/blob/main/packages/mcp-core/src/tools/catalog/search-errors.ts">search_errors tool</a>:</p><div class="callout-block" data-callout="true"><p><code>Search Sentry error events: exceptions and crashes with stack traces. Use for error counts, statistics, trends, and individual error events.</code></p><p></p><p><code>NOT for log messages, including error/warning logs (use search_logs), requests or latency (use search_traces), or grouped issue lists (use search_issues).</code></p></div><p>The model learns what the tool is for, and what to use instead.</p><h3>2) The caller improvises</h3><p>Agents may invent argument shapes, call tools out of order, retry in odd ways and forget that setup has already happened, and the host will often retry on their behalf.</p><p>So the principles we discussed for AI-facing APIs are your defense here, which in practice means strict schemas where it matters, safe defaults, and idempotent writes on anything risky. For high-stakes actions, you can refuse with a clear message and offer a human-in-the-loop path when the domain needs it.</p><p>Stripe does this well for APIs: every POST accepts an <a href="https://docs.stripe.com/api/idempotent_requests">Idempotency-Key</a>, and a retry with the same key returns the first response instead of creating a second object. On MCP tools, you can do the same with an idempotency key argument, and declare how each tool behaves with the protocol&#8217;s <a href="https://modelcontextprotocol.io/specification/draft/schema#toolannotations">tool annotations</a>:</p><div class="callout-block" data-callout="true"><p><code>annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false }</code></p></div><p>Clients can use these hints to decide when to ask for confirmation, as Block&#8217;s Goose <a href="https://engineering.block.xyz/blog/blocks-playbook-for-designing-mcp-servers">does</a>.</p><h3>3) Errors should teach the next attempt</h3><p>A key difference between agents and deterministic software is that the former can (and will try to) recover from errors by itself. So you should help with it.</p><p>This means a bare <code>{&#8220;code&#8221;: 400}</code>  is fine for deterministic software, where a developer will eventually read the logs and fix the call, while an agent benefits from errors that are more descriptive and tell it what to do next, like the expected format, an example, or a different tool to use instead.</p><p>Block&#8217;s playbook shows a good one from Goose, for files over 400KB:</p><div class="callout-block" data-callout="true"><p><code>File &#8216;{}&#8217; is too large ({:.2}KB). Maximum size is 400KB to prevent memory issues. If needed, use shell commands like &#8216;head&#8217;, &#8216;tail&#8217;, or &#8216;sed -n&#8217; to read a subset of the file.</code></p></div><p>It says what went wrong, why, and what to try instead.</p><p>It also pays to log which errors agents hit most, because many of them will point to the tool's surface and hint at what you can improve. Half of your failures might be &#8220;invalid priority&#8221; because the schema says <code>high</code> and the server expects <code>P1</code>.</p><h3>4) The job can come with its own UI</h3><p>Lately, MCP servers can do more than expose tools.</p><p>With <a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP Apps</a>, a tool can point to an HTML resource that the host renders in a sandbox, so your product can show its own interface right inside the conversation.</p><p>This matters for jobs where the user wants to see and touch the result. In a design tool, for example, the user may open a project, select a screen, ask the AI to change it, and see the result in the same canvas. Doing that through text alone would mean describing objects back and forth, while here the app can tell the agent exactly what the user selected.</p><p>ChatGPT goes a step further with MCP Extensions, which turn an MCP server into a plugin with specific entry points: a launcher in the sidebar, a tab inside a conversation, and handlers that open files with a given extension in your own viewer. These are host-specific, and some of them (like file entry points) are desktop-only for now. Luigi wrote a <a href="https://manufact.com/blog/openai-mcp-extensions">good walkthrough</a> of this.</p><div><hr></div><h2>&#128260; The production lifecycle</h2><p>The second intuition to update is about what happens after launch. Shipping an MCP server feels like shipping a small backend service, and in many ways it is, but keeping it healthy also involves work that a regular backend doesn&#8217;t have.</p><p>Differences mostly show up in three places:</p><h3>1) Managing hosts</h3><p>Your MCP will be called by ChatGPT, Claude, and a long tail of other clients, each with its own behavior and update cycle, and the same server can produce very different outcomes across them.</p><p>Manufact has an interesting <a href="https://manufact.com/blog/mcp-evals-coding-agents?utm_source=refactoring">testing write-up</a> that walks through an issue-tracker example where Codex manages to work around server bugs and pass, while Claude fails the same suite because of sneaky defects in the tools. If you only test with your favorite client, it is easy to ship bugs like these without ever seeing them, so make golden prompts on a few real hosts part of normal product QA.</p><h3>2) Updating the protocol</h3><p>In about 18 months, MCP has changed a lot: from HTTP+SSE to Streamable HTTP, then tighter OAuth rules, and then the <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/">2026-07-28 revision</a>, which the maintainers describe as the largest since launch.</p><p>Just in recent changes, sessions and the initialize handshake are gone, every request is self-contained, and auth has been changed substantially.</p><p>Being MCP a client-server protocol, you need to incorporate changes ASAP, because even when your own server code doesn&#8217;t change, the one in the clients will!</p><h3>3) Distributing to directories</h3><p>Distribution through agents comes with its own process, too.</p><p>ChatGPT app review, the Claude Connectors directory, Cursor Marketplace, Muse and Grok custom connectors all want <strong>slightly different assets</strong> and reviewer access. Each platform has its own packaging, review, and update flow, so you should track the requirements for each destination, keep the endpoint stable, and test the experience after every change.</p><p>Put together, this is closer to keeping a mobile app healthy across OS versions and app stores than to maintaining an API behind an SDK you control. None of this is rocket science, but it&#8217;s a significant (and growing) surface to keep track of.</p><div><hr></div><h2>&#9878;&#65039; Self-host or managed?</h2><p>So, all that said, should you run all of this yourself? It depends on how much of the lifecycle above actually applies to you:</p><ul><li><p><strong>Self-hosting</strong> &#8212; is fine when the MCP is internal (e.g. stdio), used by one team or IDE, the blast radius is low, you are okay owning SDK upgrades when the protocol changes, and you are not listed in marketplaces.</p></li><li><p><strong>Managed</strong> &#8212; a hosted platform pays off when you ship a remote MCP as part of your product across many directories (ChatGPT, Claude, Cursor, ...), you want cross-client test suites against real hosts and checks before each submission, and all of that work sits on your critical path without being what makes your product special.</p></li></ul><p>As a quick plug, the second scenario is what the team at <a href="https://manufact.com?utm_source=refactoring">Manufact</a> is building for. Their MCP cloud lets you connect a repo and deploy, test against clients, monitor usage, all with <a href="https://github.com/mcp-use/mcp-use">mcp-use</a> as open-source framework underneath.</p><p>If you are already hosting your server elsewhere, they also run cross-client tests and publishing-readiness checks without moving the deployment. I love their approach and you can learn more about it <a href="https://docs.manufact.com/dashboard/testing?utm_source=refactoring">here</a>.</p><div><hr></div><h2>&#9989; Checklist for next week</h2><p>If you have been thinking about developing (or improving?) your own MCP server, and want something concrete for the team to begin with, here is a quick checklist:</p><ol><li><p><strong>List the most important agent workflows</strong> &#8212; that should exist (say &lt; 7), and delete the endpoint-dump tools that do not serve them.</p></li><li><p><strong>Rewrite tool names and descriptions</strong> &#8212; as if they were prompts, and put description changes through review.</p></li><li><p><strong>Add actionable errors</strong> &#8212; and idempotent writes to the risky tools.</p></li><li><p><strong>Pick three hosts</strong> &#8212; and run a golden-prompt test of the full experience, UI and permissions included.</p></li><li><p><strong>Assign an owner</strong> &#8212; for MCP health, with a re-check after every major MCP, Claude or ChatGPT release.</p></li><li><p><strong>Decide self-host vs managed</strong> &#8212; for deploy, test, monitor and publish, and write down the reason.</p></li></ol><div><hr></div><h2>&#128172; Join our community!</h2><p>Hey, thank you for making it this far! If you liked this piece, consider subscribing to the full version of Refactoring. Paid members get exclusive access to our <a href="https://refactoring.fm/p/refactoring-community">private community</a> of 1500+ tech leaders, where every month we pick one theme and dig into it together.</p><p>In October the theme is <strong>management in the age of AI</strong>, and on <strong>Monday, October 19</strong> we have our next live Mastermind on <a href="https://community.refactoring.club/c/events/rethinking-the-manager-s-role-october-mastermind">rethinking the manager's role</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Get access to the Community&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://refactoring.fm/subscribe?"><span>Get access to the Community</span></a></p><div><hr></div><p>And that&#8217;s it for today! I wish you a great week.</p><p>Sincerely<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[Do You Need Staging in 2026? 🚚]]></title><description><![CDATA[Revisiting my classic 2022 article, after four years, and AI!]]></description><link>https://refactoring.fm/p/do-you-need-staging-in-2026</link><guid isPermaLink="false">https://refactoring.fm/p/do-you-need-staging-in-2026</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 07 Oct 2026 07:54:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!q-x4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there!</p><p>About four years ago I published <a href="https://refactoring.fm/p/do-you-need-staging">Do you really need a Staging environment?</a> &#8212; the first article of mine to really go viral. Front page of Hacker News, more than 2,000 likes on Linkedin, and hundreds of comments across social media.</p><p>Many of such comments were just... angry! In fact, even if the title was framed as a question, I argued that, in most cases, staging environments did more harm than good. And many people didn&#8217;t like that.</p><p>Fast forward to today a lot of things have changed. Teams ship more code, faster, and more often. Does this make staging (and/or equivalent intermediate envs) more or less valuable? I see you saying &#8220;it depends&#8221; &#8212; so it depends on what?</p><p>So today I want to revisit the original thesis, figure out what still holds, vs what needs to change.</p><p>Here is what we will cover:</p><ul><li><p>&#11013;&#65039; <strong>What I argued in 2022</strong> &#8212; a short callback to refresh our memory.</p></li><li><p>&#9989; <strong>What still holds</strong> &#8212; parity, batching, and when shared staging still pays off.</p></li><li><p>&#129302; <strong>What AI changes</strong> &#8212; more throughput, worse env lies, safety net in prod.</p></li><li><p>&#128737;&#65039; <strong>Guardrails for dev</strong> &#8212; guides, gates, and guards upstream of merge.</p></li><li><p>&#128674; <strong>Ephemeral preview envs</strong> &#8212; review on isolated, prod-shaped envs.</p></li><li><p>&#128300; <strong>Observability and controls</strong> &#8212; recover fast when something slips.</p></li><li><p>&#127919; <strong>Final checklist</strong> &#8212; what &#8220;good&#8221; looks like now, without the sermon.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><p><em>Disclaimer: I am thankful to</em> <em><a href="https://upsun.com/upsun.com/?utm_source=refactoring-club&amp;utm_medium=sponsored_newsletter&amp;utm_campaign=202610_GRWTH_AWARE_Do-you-need-staging-in-2026_BLOG_RFCTG">Upsun</a></em> <em>for partnering on this piece and for pushing me to revisit this topic properly in 2026. I am a fan of what they build around Git-native environments, and you should check them out.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://upsun.com/?utm_source=refactoring-club&amp;utm_medium=sponsored_newsletter&amp;utm_campaign=202610_GRWTH_AWARE_Do_you_need_staging_in_2026_BLOG_RFCTG&quot;,&quot;text&quot;:&quot;Learn more about Upsun&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://upsun.com/?utm_source=refactoring-club&amp;utm_medium=sponsored_newsletter&amp;utm_campaign=202610_GRWTH_AWARE_Do_you_need_staging_in_2026_BLOG_RFCTG"><span>Learn more about Upsun</span></a></p><p><em>However, as always I will only write my honest opinion on the practices and tools covered, Upsun included.</em></p><div><hr></div><h2>&#11013;&#65039; What I argued in 2022 (briefly)</h2><p>The original piece tried to get clear about when a shared staging / pre-prod environment helps, vs when it mostly adds cost and delay.</p><p>The two problems I saw (and still see) the most often are:</p><ol><li><p><strong>Staging is often unreliable</strong> &#8212; because keeping it at parity with prod (i.e. data and infra) is hard and expensive. So most teams cut corners: a fraction of the database, different instance sizes, and just some of the services.</p></li><li><p><strong>It makes releases many times slower</strong> &#8212; an extra release level means waiting for the env, batching several features &#8220;because we are releasing anyway,&#8221; deploys that become morning-only (or only &#8220;at the start of the week&#8221;), and the classic &#8220;<em>whose change broke staging?&#8221;</em> moments.</p></li></ol><p>The way out already existed in 2022: small diffs, strong automated tests, feature flags, canary / progressive delivery, and real investment in observability in production. This way problems in prod are smaller, and you are fast at catching them anyway, even without staging.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q-x4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q-x4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 424w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 848w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!q-x4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg" width="1456" height="974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:974,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115664,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/218773833?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!q-x4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 424w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 848w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!q-x4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aff5793-1350-4009-b5a1-192529ad0f15_1686x1128.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The original pic from 2022 &#8212; still pretty much true!</figcaption></figure></div><p>On top of this, bonus points if you setup two of my favorite things:</p><ul><li><p><strong>Preview links for QA</strong> &#8212; envs that spawn on the fly for features that need dedicated product review.</p></li><li><p><strong>Remote dev environments</strong> &#8212; that live in the cloud and can inherently be closer to prod than a developer laptop.</p></li></ul><p>This is the gist of what I wrote back then &#8212; if you want the longer version (including when staging still earns its keep), here is the original:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d54cef76-8407-4185-9cb0-493b0eae031e&quot;,&quot;caption&quot;:&quot;Most companies I know use staging or pre-production environments to test recent changes before they are released to real users.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Do you really need a Staging environment? &#128674;&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:6835984,&quot;name&quot;:&quot;Luca Rossi&quot;,&quot;bio&quot;:&quot;I write everyday about how to make great software and work well with humans, to 60K+ friends.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6107486-b701-4109-8f21-f450fed6e277_652x690.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:1000}],&quot;post_date&quot;:&quot;2022-05-19T05:35:39.638Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fde9e275a-7d23-46d6-b628-01322a4b881d_1686x1128.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://refactoring.fm/p/do-you-need-staging&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:55432182,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:55,&quot;comment_count&quot;:7,&quot;publication_id&quot;:64099,&quot;publication_name&quot;:&quot;Refactoring&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!CR5A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div><hr></div><h2>&#9989; What still holds</h2>
      <p>
          <a href="https://refactoring.fm/p/do-you-need-staging-in-2026">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Run Good Agents in Production 🚦]]></title><description><![CDATA[The third part of our series about orchestration and governance]]></description><link>https://refactoring.fm/p/how-to-run-good-agents-in-production</link><guid isPermaLink="false">https://refactoring.fm/p/how-to-run-good-agents-in-production</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 30 Sep 2026 10:03:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/14c008a1-9712-4759-ab77-8fbe367b4948_1762x1166.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, Luca here! Welcome to a new </em>&#128274;<em> <strong>weekly essay</strong></em> &#128274;<em> from Refactoring.</em></p><p><em>Every week I <a href="https://refactoring.fm/s/essays?sort=top">write an article</a> to 170K+ engineers about how to make good software together. To get access to all our articles, resources, and our <a href="https://refactoring.fm/p/refactoring-community">private community</a>, subscribe to the <a href="http://refactoring.fm/subscribe?">full version</a>. </em></p><div><hr></div><p>Lately, I have become more and more interested in how teams are using AI inside real production workflows.</p><p>Sure, your Claude skills are cool, and so is your AGENTS.md, but I want to see how this tech graduates into stuff we run on our servers, reliably, all the time, and creating value.</p><p>This is also not the first time I have written about this:</p><ul><li><p>In May, I published <a href="https://refactoring.fm/p/how-to-orchestrate-ai-workflows">How to Orchestrate AI Workflows</a>, which is a primer for moving from AI loops to more structured orchestration.</p></li><li><p>Earlier this month I published <a href="https://refactoring.fm/p/getting-started-with-ai-governance">Getting Started with AI Governance</a>, to talk about security, control, and how &#8220;<em>if you want the car to go fast, you need brakes!</em>&#8221;</p></li></ul><p>So today I want to go deeper into what it means to <strong>create good AI workflows at scale</strong>, based on conversations I had with the people who are doing this for real. I took a lot from my recent <a href="https://refactoring.fm/p/the-best-ideas-from-ldx3-and-productlab">chat with Jan</a>, from friends I met during recent travels, and especially from <a href="https://fr.linkedin.com/in/ludovic-dehon">Ludovic</a> and the guys at <a href="https://kestra.io/two-zero">Kestra</a>, that I am looping in again after the huge success of the first piece we wrote together!</p><p>Here is the agenda:</p><ul><li><p>&#128065;&#65039; <strong>Observability</strong> &#8212; what to watch on agentic runs, plus a practical checklist.</p></li><li><p>&#128737;&#65039; <strong>Boundaries</strong> &#8212; how keep sensitive data where it lives, and separating workers from orchestration.</p></li><li><p>&#129489;&#8205;&#9992;&#65039; <strong>Human in the loop</strong> &#8212; when to put a gate, and how to resume without replaying an hour of work.</p></li><li><p>&#128268; <strong>How to get started</strong> &#8212; prefer governed flows as tools for the agents you already trust.</p></li><li><p>&#128218; <strong>Resources</strong> &#8212; a few places to go deeper on the practices above.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><p><em>Disclaimer: I am thankful to <a href="https://fandf.co/4Axy8bX">Kestra</a> for partnering on this and providing ideas and insights about the orchestration industry. I am a fan of what they build and you should check it out.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fandf.co/4Axy8bX&quot;,&quot;text&quot;:&quot;Learn more about Kestra&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fandf.co/4Axy8bX"><span>Learn more about Kestra</span></a></p><p><em>However, as always, I will only write my honest opinion on the practices and tools covered, Kestra included.</em></p><div><hr></div><h2>&#128065;&#65039; Observability</h2><p>A surprisingly high number of the teams I spoke with built some AI observability tools in-house.</p><p>To me this feels like when, around 2022, I ran the first surveys about what tools teams used to measure engineering metrics, and about ~50% of respondents had patched something together themselves, e.g. pulling numbers from Github and putting them on Grafana.</p><p>Likewise, today many teams are logging basic info themselves. For every run, this is typically token spend and the final answer of the agent. This is good! You get your hands dirty, learn what you really need, and wrap your head around the idea of measuring this stuff.</p><p>However, just like with engineering metrics, these setups fail as soon as you need to drill down into specific steps of the agent runs. Which, as long as your runs are <em>short</em>, might not be a big deal, but as soon as you have a long (and expensive!) recurring job failing halfway through, you may want more control over what happened and why.</p><p>In my experience, good observability for such workflows means you can reliably get the following information, ideally from the same system:</p><ol><li><p><strong>Intermediate step outputs</strong> &#8212; not only the final blob. Each meaningful step should leave something inspectable: a fetched record, a classification, a draft that was about to be sent.</p></li><li><p><strong>Tokens and cost per run</strong> &#8212; these are the basics everyone measures, and for good reason. This should be ideally broken down per step / model / tool.</p></li><li><p><strong>Tool and MCP calls</strong> &#8212; which servers, which tools, with what inputs and outputs.</p></li><li><p><strong>Who or what triggered the run</strong> &#8212; a human (manual trigger), a schedule, a webhook, or another agent session. Origin and session tags matter when you audit later.</p></li><li><p><strong>State at failure</strong> &#8212; which step failed, what was already committed, what is safe to retry.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MOAM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MOAM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 424w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 848w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!MOAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png" width="1456" height="903" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:903,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/218024608?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MOAM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 424w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 848w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!MOAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193a4e4d-4cb5-46cc-a47d-49ff32670af5_1722x1068.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The five main things you want to observe in an AI workflow</figcaption></figure></div><p>If these still feel a bit abstract, here are a few questions you can ask yourself (or your team!) about your setup:</p>
      <p>
          <a href="https://refactoring.fm/p/how-to-run-good-agents-in-production">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Best Ideas from LDX3 and ProductLab 🏆]]></title><description><![CDATA[My personal highlights from attending two big conferences last month]]></description><link>https://refactoring.fm/p/the-best-ideas-from-ldx3-and-productlab</link><guid isPermaLink="false">https://refactoring.fm/p/the-best-ideas-from-ldx3-and-productlab</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 23 Sep 2026 07:02:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vjuo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, Luca here! Welcome to a </em>&#128274;<em> <strong>weekly essay</strong></em> &#128274;<em> from Refactoring.</em></p><p><em>Every week I <a href="https://refactoring.fm/s/essays?sort=top">write an article</a> to 170K+ engineers about how to make good software together. To get access to all our articles, resources, and our <a href="https://refactoring.fm/p/refactoring-community">private community</a>, subscribe to the full version below: </em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Run better engineering teams&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="http://refactoring.fm/subscribe?"><span>Run better engineering teams</span></a></p><div><hr></div><p>I am back from two weeks of travel, during which I took some time off but also attended two great conferences: <a href="https://leaddev.com/leaddev-new-york/">LDX3</a> in New York, and <a href="https://productlab.app/">ProductLab</a> in Berlin.</p><p>Conferences, for me, are a great way to say hi to friends and to check the pulse on the trends and sentiment in tech. This time made no exception: I learned a lot by attending talks and workshops, and simply by talking with people.</p><p>So this week&#8217;s edition covers my personal highlights from such talks and conversations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vjuo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vjuo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 424w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 848w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vjuo!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png" width="1200" height="798.6263736263736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:969,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:2427015,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/216741812?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vjuo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 424w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 848w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!vjuo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7bb3db9-9ace-4170-b536-1881a7e6025f_2110x1404.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here is the agenda for today:</p><ul><li><p>&#128666; <strong>Doing migrations right</strong> &#8212; Will Larson on Imprint&#8217;s delivery journey, framed as a set of migrations.</p></li><li><p>&#128483;&#65039; <strong>Guiding people through change</strong> &#8212; Meg Adams&#8217; diagnostic tools for having hard conversations.</p></li><li><p>&#129517; <strong>The Manager&#8217;s Path in the Age of AI</strong> &#8212; Camille Fournier on what still belongs to managers in 2026.</p></li><li><p>&#128202; <strong>DX quarterly numbers</strong> &#8212; Justin Reock&#8217;s latest AI impact data, plus how I think about these metrics.</p></li><li><p>&#127897;&#65039; <strong>How n8n is embracing AI</strong> &#8212; highlights from my conversation with Jan Oberhauser, founder of n8n, in Berlin.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>1) &#128666; Doing migrations right</h2><p>LDX3 opened with a great keynote by <a href="http://lethain.com/">Will Larson</a>, who described the <em>delivery</em> journey of his team at Imprint: from manual gates everywhere, to CI/CD, to agentic workflows.</p><p>Will&#8217;s talk was extremely practical (we need more stories like this), and framed these steps as <strong>migrations</strong>. We know a lot about migrating code, and most of the same logic can be applied to processes and workflows.</p><p>Here are the parts of Will&#8217;s approach that stuck with me:</p><ul><li><p><strong>Understanding people&#8217;s problems</strong> &#8212; there&#8217;s a reason why people do things the current way, even if it looks flawed. To build something better, you need to understand current problems deeply, which is hard!</p></li><li><p><strong>Getting buy-in</strong> &#8212; Will stressed how, even if there was clear top-down input about the direction, the implementation was a collaborative effort where people were involved at all stages. At some point, Will wanted to migrate from Jira to Linear, and started by involving the people who were the biggest Jira fans. He knew that if he could address their concerns, the rest of the team would be easier to migrate to.</p></li><li><p><strong>Draw hard lines</strong> &#8212; inclusion and collaboration matters, but once a direction is taken, resources need to go to supporting that direction. In picking AI coding agents, Will settled on making Claude Code the recommended coding tool: people who wanted to use something else could do it, but would not receive support from the platform team.</p></li><li><p><strong>Sweat the details</strong> &#8212; with any migration there is always a long tail of stuff to be fixed and edges to be smoothed until things truly work for everyone. Keep working on it even when it seems that &#8220;most of the work is done&#8221;.</p></li></ul><div><hr></div><h2>2) &#128483;&#65039; Guiding people through change</h2><p>During LDX3, I attended a workshop by my friend <a href="http://megkadams.com/">Meg Adams</a>, who I also <a href="https://refactoring.fm/p/building-psychologically-safe-teams">interviewed last year</a>, about having good conversations with people and guiding them through change.</p>
      <p>
          <a href="https://refactoring.fm/p/the-best-ideas-from-ldx3-and-productlab">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Getting started with AI governance 🔒]]></title><description><![CDATA[A primer on how you should think about governing people, agents, tools, and actions.]]></description><link>https://refactoring.fm/p/getting-started-with-ai-governance</link><guid isPermaLink="false">https://refactoring.fm/p/getting-started-with-ai-governance</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 16 Sep 2026 13:03:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CR5A!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Hey there, Luca here!</span></p><p><span>Lately I have been talking with both software engineers </span><em><span>and</span></em><span> security people about this moment in </span><strong><span>AI rollout</span></strong><span>, and it&#8217;s interesting how they feel it from opposite ends.</span></p><p><span>At first glance, there seems to be a real tradeoff between making AI useful, and keeping it safe:</span></p><ul><li><p><span>On one side, the best stories about AI impact always involve </span><strong><span>connecting it to pretty much everything</span></strong><span> you got: tickets, docs, CRM, Slack, telemetry, and more.</span></p></li><li><p><span>On the other side, this creates a </span><strong><span>big surface for threat</span></strong><span> that </span><a href="https://embracethered.com/blog/posts/2026/breaking-claude-code-opus-5-and-automode/"><span>even the latest models are extremely vulnerable to</span></a><span>.</span></p></li></ul><p><span>As of today, most agent setups I see are still completely ungoverned. What can this agent touch (MCP servers, browser, data, ...)? Who connected it? What customer data can actually leave the building?</span></p><p><span>Many teams are conflicted about putting real governance in place because that&#8217;s </span><strong><span>perceived as a </span></strong><em><strong><span>brake</span></strong></em><span>, in a moment in time where you are expected to </span><em><span>accelerate</span></em><span> instead.</span></p><p><span>I have a contrarian take on this, that I want to discuss today.</span></p><p><span>In 2006, Peter Summerlin, a professor in Landscape Architecture in Mississippi, ran </span><a href="https://web.archive.org/web/20060928021844/http://www.asla.org/awards/2006/studentawards/282.html"><span>a simple study</span></a><span> about kids&#8217; behavior in playgrounds:</span></p><blockquote><p><em><span>A simple study was conducted to discover </span><strong><span>the effects of a fence around a playground</span></strong><span> and the consequent impact it would have on preschool children. Teachers were to take their children to a local playground in which there was no fence during their normal recess hour. The kids were to play as normal. The same group was to be taken to a comparable playground in which there was a defined border designated by a fence.</span></em></p><p><em><span>In the first scenario, the children remained huddled around their teacher, fearful of leaving out of her sight. The later scenario exhibited drastically different results, with the children feeling free to explore within the given boundaries.</span></em></p></blockquote><p><span>So, in playgrounds with fences, </span><strong><span>kids actually used </span></strong><em><strong><span>more</span></strong></em><strong><span> space</span></strong><span>.</span></p><p><span>I believe good governance </span><em><span>can</span></em><span> be an accelerant. Like kids, once people know where fences are, people can be empowered to do more </span><em><span>within</span></em><span> them. But that&#8217;s only if governance is </span><em><span>good, </span></em><span>which is a big if!</span></p><p><span>Today I will try to explore what this looks like, in the context of AI. Here is what we will cover:</span></p><ul><li><p><span>&#128737;&#65039; </span><strong><span>Bounded freedom</span></strong><span> &#8212; why governance speeds AI rollout, instead of killing it.</span></p></li><li><p><span>&#129521; </span><strong><span>What you should actually govern</span></strong><span> &#8212; people, agents, data, tools, and actions.</span></p></li><li><p><span>&#128274; </span><strong><span>AI operates on a subset of human trust</span></strong><span> &#8212; the analogy between human and AI governance only goes so far.</span></p></li></ul><p><span>Let&#8217;s dive in!</span></p><div><hr></div><p><em><span>To explore this, today I am also bringing in Becky Brooks from</span></em><span> </span><em><a href="https://mcpmanager.ai/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=sept_article"><span>MCP Manager</span></a>. They work at the forefront of this topic, and have helped<span> me a lot in making my mind up.</span></em></p><p><em><span>I am grateful to have them as a partner on this piece, and you should check out their </span><a href="https://mcpmanager.ai/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=sept_article"><span>MCP gateway</span></a><span>, which companies use to manage how data and tools flow to and from AI.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://mcpmanager.ai/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=sept_article&quot;,&quot;text&quot;:&quot;Learn more about MCP Manager&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://mcpmanager.ai/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=sept_article"><span>Learn more about MCP Manager</span></a></p><p><em><span>In any case, I will only write my unbiased opinion about the practices and tools covered, MCP Manager included.</span></em></p><div><hr></div><h2><span>&#128737;&#65039; Bounded freedom</span></h2><p><span>A lot of ambitious teams that I know </span><em><span>delay</span></em><span> governance and compliance, with the idea of going AI-native first, and cleaning up later. In my experience, this order is backwards.</span></p><p><span>Without clarity, people react in two possible ways:</span></p><ul><li><p><strong><span>They freeze</span></strong><span> &#8212; they are unsure about being punished for this or that, and they just go the safe route, doing with AI much less than they would be able to.</span></p></li><li><p><strong><span>They go underground</span></strong><span> &#8212; I was on a train once, and a guy in the seat in front of me was using his company laptop with one hand, and ChatGPT on his personal phone with the other hand, copy-pasting stuff between the two. You don&#8217;t want that to happen, obviously.</span></p></li></ul><p><span>There is a </span><a href="https://cloudsecurityalliance.org/artifacts/the-state-of-ai-security-and-governance"><span>study by Google Cloud</span></a><span> from late 2025 that confirms this. Teams with clear governance in place get much farther, and faster, on agentic adoption than those without:</span></p><ul><li><p><span>Teams with </span><strong><span>full governance</span></strong><span> &#8594; 46% adoption</span></p></li><li><p><span>Teams with </span><strong><span>partial governance</span></strong><span> &#8594; 25% adoption</span></p></li><li><p><span>Teams with </span><strong><span>&#8220;still in development&#8221;</span></strong><span> governance &#8594; 12% adoption</span></p></li></ul><p><span>Of course, correlation is not causation, but it still makes it hard to look at governance as only a tax.</span></p><p><span>And when you think about it, that&#8217;s already what happens in specific domains, like coding. We talk about </span><em><span>guardrails</span></em><span> for AI coding all the time, and I even published my own approach with </span><a href="https://refactoring.fm/i/200102476/guides-gates-and-guards"><span>guides, gates, and guards</span></a><span>, which is, admittedly, quite strict.</span></p><p><span>Having strict guardrails is what allows me to be </span><strong><span>more liberal</span></strong><span> with the tasks I give to my agents, and what they can ship.</span></p><p><span>So if good governance is guardrails for data, tools, and people, what does this look like? Let&#8217;s try to figure out.</span></p><div><hr></div><h2><span>&#129521; What you should actually govern</span></h2><p><span>Working from first principles, what is it that you should actually govern? To me, it looks like four things:</span></p><ol><li><p><strong><span>People</span></strong><span> &#8212; who may use which AI client or gateway (by role, team, seniority). E.g. engineers get the coding setup, interns do not get production CRM tools, etc.</span></p></li><li><p><strong><span>Agents / clients</span></strong><span> &#8212; which AI surfaces are approved at all. Company Claude yes, personal ChatGPT no, and so on.</span></p></li><li><p><strong><span>Data &amp; tools</span></strong><span> &#8212; what the agent can see (and call). Drive folders, Slack channels, Jira projects, databases, CRM, MCP servers.</span></p></li><li><p><strong><span>Actions</span></strong><span> &#8212; what it may </span><em><span>do</span></em><span> once it is connected. Read, write, delete, open a PR, message a customer.</span></p></li></ol><p><span>It&#8217;s interesting to note that this looks exactly like the same line of reasoning we should apply to people, even without AI. And I would argue that we should start with </span><strong><span>governance for people first</span></strong><span>, and address AI later, because the opposite is impossible.</span></p>
      <p>
          <a href="https://refactoring.fm/p/getting-started-with-ai-governance">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[My agents are moving to the cloud ☁️]]></title><description><![CDATA[How I moved most orchestration to Grok Bot]]></description><link>https://refactoring.fm/p/my-agents-are-moving-to-the-cloud</link><guid isPermaLink="false">https://refactoring.fm/p/my-agents-are-moving-to-the-cloud</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Tue, 08 Sep 2026 07:04:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rtq-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, Luca here! Welcome to a &#10024; <strong>monthly free essay</strong></em> <em>&#10024; from Refactoring.</em></p><p><em>Every week I <a href="https://refactoring.fm/s/essays?sort=top">write an article</a> to 170K+ engineers about how to make good software together. To get access to all our articles, resources, and our <a href="https://refactoring.fm/p/refactoring-community">private community</a>, subscribe to the full version below: </em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Run better engineering teams&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="http://refactoring.fm/subscribe?"><span>Run better engineering teams</span></a></p><div><hr></div><p>Hey there! Welcome to a new edition of my monthly updates on my AI coding workflow.</p><p>Once a month I publish an article about how I develop <a href="https://tolaria.md/">Tolaria</a>, including an overall recap plus the latest updates, and some useful resources. I only ship these when there is something real to say, so you will not get the same post every month just with a different date on top!</p><p>I consider part of my work (combined between Tolaria &amp; Refactoring) to always try the latest and greatest, so you will only get thoughts that come from real usage and experiments.</p><p>So here is the agenda for today:</p><ul><li><p>&#128260; <strong>Workflow recap</strong> &#8212; for those who missed the previous episodes.</p></li><li><p>&#128167; <strong>Tolaria updates</strong> &#8212; product updates from this month, and what&#8217;s coming next.</p></li><li><p>&#9729;&#65039; <strong>Agents move to the cloud</strong> &#8212; a general trend plus my personal experience of gradually moving away from my Mac Mini (and my laptop).</p></li><li><p>&#129302; <strong>Moving to Grok Bot</strong> &#8212; from a single local orchestrator agent to a panel of five, hosted in the cloud.</p></li><li><p>&#10145;&#65039; <strong>What&#8217;s next</strong> &#8212; what I am excited to improve for next time.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128260; Workflow recap</h2><p>For those who missed the previous episodes, here are some pointers:</p><ul><li><p><a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">Product management</a> &#8212; how I do <em>traffic control</em> between issues, PRs, and product requests, and orchestrate the overall product backlog.</p></li><li><p><a href="https://refactoring.fm/i/200102476/guides-gates-and-guards">AI Coding</a> &#8212; my own approach to scaling coding with agents, via guides, gates, and guards. Mostly remained unchanged from last month.</p></li><li><p><a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">Tools I use</a> &#8212; deeper dive into how I use the tools from the alliance, and others too.</p></li><li><p><a href="https://refactoring.fm/p/summer-ai-coding-updates">Summer AI Coding Updates</a> &#8212; last month&#8217;s edition (forking our editor, custom performance gates, and notes about the latest GPT models).</p></li></ul><p>Also, this series (and the whole development of Tolaria) is made possible by the great tools I use everyday, that also sponsor the project, which are:</p><h4>1) <a href="http://codescene.com/">CodeScene</a> &#128300;</h4><p>It guarantees great code health across the codebase. My coding agent uses their <a href="https://codescene.com/product/code-health-mcp">CodeHealth MCP</a> as a guardrail, enforcing 10/10 health. I have been using it from day one of Tolaria &#8212; very recommended!</p><h4>2) <a href="https://codacy.com/tolaria">Codacy</a> / <a href="http://verity.md/tolaria">Verity</a> &#128274;</h4><p><span>It&#8217;s quality &amp; security as gates: an all-in-one PR reviewer. Codacy also launched </span><a href="http://verity.md/tolaria"><span>Verity</span></a><span> (beta), which helps Claude Code</span><strong> </strong><span>fix quality, security and intent issues on every run, and builds a knowledge base of decisions to make every session smarter than the last. That&#8217;s basically what I have been doing manually with ADRs, so I am excited to see where this is going!</span></p><h4>3) <a href="https://getunblocked.com/">Unblocked</a> &#128209;</h4><p>I use Unblocked as context engine, both for my coding agent to use, and for me to ask questions to. I am also testing their latest <a href="https://getunblocked.com/unblocked-code/">Unblocked Code</a> coding agent as a straightforward way to get small tweaks done.</p><h4>4) <a href="http://circleci.com/">CircleCI</a> &#128295;</h4><p>I use CircleCI to run local validation remotely, via their <a href="https://circleci.com/blog/chunk-sidecars/">chunk sidecars</a>, and I am also migrating the whole remote CI to it. I love their focus on speed and reliability, which is important to me in order for validation not to become too big of a bottleneck for the coding agents.</p><p>Now on to the new stuff, but first... product updates. Because my workflow is only as good as what I ship with it &#128071;</p><div><hr></div><h2>&#128167; Tolaria updates</h2><p>This month for Tolaria is lighter on new features and heavier on two bets that I am still working on. These are the <strong>mobile apps</strong> and a <strong>hosted version</strong> of Tolaria. These are also two of the things people are asking the most for (mobile is #1 far and away), so I&#8217;ll give some updates.</p><h3>1) Mobile</h3><p>By now I have a working iPad prototype already, with the UI rebuilt in React Native. It&#8217;s a universal app, so it also works on Android tablets (at least in the simulator, because I don&#8217;t have one to try it on).</p><p>I started with the tablet first for two reasons: 1) the UI is easier to map almost 1:1, and 2) selfishly, I do a lot of work from my iPad so I need an iPad version of Tolaria.</p><p>What&#8217;s still missing/unfinished are mainly the Git and AI integrations, with Git being particularly tricky (will elaborate on it over the next few weeks!)</p><p>Once the tablet version is ready, though, the smartphone version is quite straightforward. The UI will be simplified a bit, but technically speaking it&#8217;s not a big deal.</p><h3>2) Hosted Tolaria (exploration)</h3><p>I am also thinking about releasing a web version of Tolaria, that is self-hostable but also available with a managed option, so the vault is reachable without the need for a local native app.</p><p>This would be good for many reasons:</p><ol><li><p>Makes sharing files easier, opening up to web sharing a-la Google Docs</p></li><li><p>Obviously makes vaults accessible from anywhere (also reducing the need for mobile native apps)</p></li><li><p>Could turn into a side business model for Tolaria, with the managed version being a paid option.</p></li></ol><p>About the third point: Tolaria is run and developed as a <em>sidekick</em> to our Refactoring business, and we also have good sponsors (thank you &#10084;&#65039;) so I am under zero pressure to profit further from it, but a hosted version 1) could be genuinely useful for some people (they asked for it) and 2) of course it would cost money to run, so it should be paid.</p><p>This is still in exploration stage, so I am happy to hear your thoughts and ideas about it!</p><div><hr></div><h2>&#9729;&#65039; Agents move to the cloud</h2><p>By now, I think we have all seen the half-open laptop meme. As you can see in my previous posts, for a long time, I have run all my product development on my machines, and in particular:</p><ul><li><p>Orchestration via OpenClaw first, and Hermes later.</p></li><li><p>Coding via Codex instances on my Mac Mini, and occasionally on my Macbook.</p></li></ul><p>I believe that as 1) we understand better what agents need, and 2) agents themselves become more capable and can use computers more broadly, we are necessarily going to move away from local environments and increasingly ship these in cloud VMs, at least for agents doing actual work.</p><p>In a way, this is the same thing that happened with regular applications. We are not hosting websites and apps in our basement anymore (at least not the majority of us?!) &#8212; we are using the cloud for that. <a href="https://refactoring.fm/i/59708130/2-treat-your-servers-like-cattle-not-pets">Cattle vs pets</a>, and all that jazz.</p><p>I believe the same will happen with AI agents, because the benefits are just overwhelming. I don&#8217;t think local agents will <em>disappear,</em> because it will always be good to run a good agent on the computer you actually use, but when it comes to deploying many of these boys, there&#8217;s no way we&#8217;ll be doing these on our machines. So <em>most</em> of the agentic work will turn to the cloud.</p><p>For me, this migration had already started slowly, with experiments here and there, but got a decisive acceleration when I tried <strong><a href="https://x.ai/bot">Grok Bot</a></strong> this month.</p><p>Grok Bot has been a revelation because of how well-made, convenient, and useful it is, and I migrated all my agent work (except coding) to it.</p><p>If you are unfamiliar with it, Grok Bot is an agent environment built by the team at Cursor, where you can spin new agents that are automatically hosted in the cloud, on Linux VMs. On their machines, the agents can do anything they want: install stuff, use tools, use their browser, and so on. Mind you, this is nothing inherent new or that you couldn&#8217;t setup yourself, but it&#8217;s just 100x more convenient than setting things up manually with SSH, Tailscale, Termius, containers, and so on.</p><p>So, once you try it, it&#8217;s pretty obvious all agent environments should work this way &#8212; and I bet they will. Because having agents hosted in the cloud makes them replicable, disposable, makes it easy to run many of them concurrently, gives you good mobile access out of the box, and a loong tail of quality of life improvements.</p><p>So here is how Grok Bot changed my agents setup:</p><div><hr></div><h2>&#127867; From Brian to... Brian &amp; Friends</h2><p>If you followed the previous episodes, you know that I have been running just one main agent, as a second version of myself, for all the orchestration work that is not coding. It&#8217;s called Brian, and it&#8217;s my &#8220;Chief of Staff&#8221;.</p><p>Over time, Brian clearly started doing too many things, taking care of: product work for Tolaria, all kinds of work for Refactoring, and various scheduling and traffic control for my own life.</p><p>Grok Bot allowed me to easily spin off Brian&#8217;s work into multiple agents, so that now I have five of them:</p><h3>1) Brian</h3><p>Stays as Chief of Staff.</p><p>He is the default agent I reach out to for anything misc, and is on top of everything that happens that I need to be aware of.</p><p>Every morning he sends me a brief about what I need to take care of during the day, writes me a recap at the end of the day, and occasionally sends stuff my way during the day when something urgent needs my attention.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rtq-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rtq-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 424w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 848w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 1272w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!rtq-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png" width="1456" height="1442" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1442,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1758398,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/214283186?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rtq-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 424w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 848w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.png 1272w, https://substackcdn.com/image/fetch/$s_!rtq-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf464d2-e2d8-4b1a-bf20-fba392385760_1868x1850.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">Brian sends me daily (ok, 2-3 times per day) reports about things I need to do, fetching from tasks, email, calendar, slack, etc</figcaption></figure></div><p>Now, however, he is also being helped by his friends &#128071;</p><h3>2) Karn</h3><p>Runs product management for Tolaria.</p><p>It has access to all the product signal that comes from PostHog, Sentry, Github, Canny, emails I receive about Tolaria, and people talking about it on social media. Like Brian before it, it does traffic control, triages and dedupes items, specs them, and puts them on the coding kanban board.</p><p>He also sends me a brief every day with the key decisions I need to make about Tolaria, including tasks I need to review &#128071;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EZTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EZTc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 424w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 848w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 1272w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!EZTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png" width="1456" height="1481" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/143b792c-d766-42b1-8525-db216bf14464_1544x1570.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1481,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:925886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/214283186?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EZTc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 424w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 848w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.png 1272w, https://substackcdn.com/image/fetch/$s_!EZTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F143b792c-d766-42b1-8525-db216bf14464_1544x1570.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">Daily brief about what I need to do for Tolaria (the bare minimum)</figcaption></figure></div><h3>3) Edith</h3><p>Is my Editor-in-Chief.</p><p>While I insist on writing all actual articles by hand, Edith intervenes at the beginning and at the end of the process, by doing:</p><ul><li><p><strong>Research</strong> &#8212; for any new article, it pulls related ideas from past articles I wrote, interesting new articles I should read, podcast interviews, and more. It is phenomenally helpful in compressing and improving the research work.</p></li><li><p><strong>Feedback</strong> &#8212; after I write a full draft, it gives feedback on everything from basic grammar to inconsistencies in the structure, contradictions, and so on. It is good at <em>challenging</em> what I write so I can reflect more on it.</p></li></ul><p>It is also &#8220;in charge&#8221; of the newsletter publishing calendar, so it makes sure the various drafts are ready at the right time, podcast interviews are lined up, articles done in collaboration with others are shared in advance, and so on.</p><h3>4) Sponsy</h3><p>Helps with Sponsorships.</p><p>At Refactoring, sponsorships are led by Matteo, my closest collaborator, and they involve <em>a ton</em> of operations. Sponsorships deals have a whole lifecycle, like standard sales deals, plus they spawn tasks that are specific to the newsletter work, like:</p><ul><li><p>Collecting the copy to include in the newsletter</p></li><li><p>Sending previews</p></li><li><p>Reporting numbers after ~1 week</p></li><li><p>and more!</p></li></ul><p>Sponsy helps a lot with mapping the status of the various deals, what needs to happen every day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N_kl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N_kl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 424w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 848w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!N_kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png" width="1456" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:865146,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/214283186?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N_kl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 424w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 848w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!N_kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cffff4a-3fb4-4300-a1a0-d1988ab32605_2272x1320.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">Daily report sent by Sponsy on our team slack &#8212; under my name for now because we just patched this together!</figcaption></figure></div><h3>5) Grow</h3><p>Grow is the newest addition to the bot <em>stack</em> (or should I say team?!). It tracks a bunch of metrics for the newsletter health (open rate, growth, click rate, ...) and helps with operations related to the paid ads campaigns we run.</p><p>In particular, it does a lot of work that would otherwise be manual: for example, importing new subscribers from campaigns into Substack, and assigning the correct tags to them so we can create email sequences.</p><p>It also sends daily reports about how campaigns are going, like:</p><blockquote><p><em>Closed week: 163 Substack Meta regs (vs 203 prior, &#8722;40 / &#8722;20%). Received-mail unique 7d open 40.0% (60/150) vs 44.8% prior (&#8722;4.8pp). Morning was 36.1%; afternoon refresh after more people received mail (raw 60/163; 13 not received yet). Paid converts: 2 (vs 3 prior).</em></p></blockquote><div><hr></div><h2>&#128301; What&#8217;s next</h2><p>This setup is about one month old and is by no means perfect, but it just shows how much promise there is in creating fleets of small-scoped agents to scale work.</p><p>To make this viable, though, it needs to be <em>easy</em> to create and steer these guys, which I think is what Grok Bot is uniquely succeeding at.</p><p>When agents are successful at 1) doing their thing, plus 2) reporting to you, you can legitimately do most of your work in a chat environment, or with voice notes, without using the tools yourself. Which is basically what you see in the <a href="https://openai.com/index/gpt-6-astra/?video=1222553704">GPT 6 Astra launch video</a>.</p><p>I think this is a good direction to point ourselves at, as a <em>proxy</em> for good delegation. So, good questions you may ask yourself are:</p><ul><li><p>&#8220;<em>How can I use my computer less?</em>&#8220;</p></li><li><p>&#8220;<em>How can I do more work from my phone, just sending voice instructions?&#8221;</em></p></li></ul><p>In a way, it&#8217;s like when you see pictures of the desk of the President of United States, and there is no computer. How does the guy (ok, the <em>previous</em> guys) get things done? He just talks to people. People come and tell him what needs to happen, what decisions he needs to make, who he needs to speak with, and he does. He doesn&#8217;t need tools.</p><p>This might be an extreme, but I think you see my point.</p><div><hr></div><h2>&#128204; Bottom line</h2><p>And that&#8217;s it for today! Here are the main takeaways:</p><ul><li><p>&#9729;&#65039; <strong>Most agent work goes to the cloud</strong> &#8212; local agents won&#8217;t disappear on the computer you actually use, but deploying the bulk of them on your Mac Mini (or laptop) stops making sense. Same arc as applications in the cloud.</p></li><li><p>&#129302; <strong>Grok Bot made the jump easy</strong> &#8212; cloud Linux VMs, install what you need, with browser included. I moved all non-coding agent work there because it is just much more convenient than the SSH / Tailscale / Termius stack.</p></li><li><p>&#127867; <strong>Team of small agents &gt; One mega agent</strong> &#8212; work feels better now that I have a small fleet of focused agents instead of Brian doing all of the work.</p></li><li><p>&#128301; <strong>Aim at less computer, more chat</strong> &#8212; when agents do the work <em>and</em> report back, more of your day can live in chat or voice notes. So a proxy for good delegation becomes: how can I use my computer less?</p></li></ul><p>I wish you a great week!</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[Mental marathoners 🏃‍♂️]]></title><description><![CDATA[How to think about AI in order to become a better version of yourself.]]></description><link>https://refactoring.fm/p/mental-marathoners</link><guid isPermaLink="false">https://refactoring.fm/p/mental-marathoners</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 02 Sep 2026 07:02:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/81484f9f-ce68-4566-ad4a-91f188dd9863_1840x1224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A couple of weeks ago, I read <a href="%5Bhttps://www.theatlantic.com/ideas/2026/06/ai-open-ai-anthropic/687689/%5D(https://www.theatlantic.com/ideas/2026/06/ai-open-ai-anthropic/687689/)">The People Who Will Thrive in the AI Age</a>, by David Brooks.</p><p>I loved it, celebrated it as the <a href="%5Bhttps://refactoring.fm/i/211041423/the-people-who-will-thrive-in-the-ai-age%5D(https://refactoring.fm/i/211041423/the-people-who-will-thrive-in-the-ai-age)">best piece I read that week</a>, and since then I have kept thinking about various ideas that built up on it, and that I want to share today<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>First of all, let&#8217;s start with the title: what does <em>thrive</em> mean?</p><p>Each of us has (or should find) their own version of success, but a broad one that I particularly like is: <strong>becoming better versions of ourselves</strong>. I like it because a lot of the good things in life are <em>downstream</em> from growing as a person. You become better, and better things eventually come to you. That&#8217;s true in work, relationships, health, and pretty much anywhere.</p><p>Of course, that&#8217;s not the <em>only</em> way good things can come to you. Many come by chance, or luck if you may, but if you want to find an angle that is actually <strong>under your control</strong>, you can hardly go wrong by trying to <em>upgrade</em> <em>yourself</em> over and over.</p><p>And here is the problem with AI: I don&#8217;t feel that as a tool, by default, it helps with that. Pretty much the opposite. If you blindly use AI to the best of its capabilities, chances are you gradually <strong>get </strong><em><strong>worse</strong></em><strong> at several things</strong>.</p><p>So, when I think about my usage of AI, that&#8217;s the angle I try to use. How can I make it so that 1) AI helps me at producing more and better work, while 2) making me better as a professional (and a human being)?</p><p>We&#8217;ll be exploring this today:</p><ul><li><p>&#9878;&#65039; <strong>What AI takes from us</strong> &#8212; for everything tech gives, something else you now have to nurture.</p></li><li><p>&#127939;&#8205;&#9794;&#65039; <strong>Mental marathoners</strong> &#8212; when intelligence is cheap, stretching yourself becomes your edge.</p></li><li><p>&#129521; <strong>What makes us marathoners</strong> &#8212; instead of riding as passengers.</p></li><li><p>&#129517; <strong>How do you know you are on the right track</strong> &#8212; better work, learning, taste, energy.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#9878;&#65039; What AI takes from us</h2><p>The fact that AI makes us <em>worse</em> at some things may seem counterintuitive, especially coming from a work tool, but it&#8217;s not really surprising if we look at the broader trajectory of technology.</p><p>In fact, progress is not strictly linear and incremental. For everything that tech has given us, there are also things we now need to intentionally safeguard and nurture, more than we used to in the past, in order not to lose them:</p><ul><li><p>An obvious one is <strong>physical health</strong> &#8212; regular, commercial gyms were not a thing until the 70s, when our lives gradually became more sedentary and all of a sudden fitness became something you had to be <em>intentional</em> about.</p></li><li><p>Another one is <strong>attention span</strong> and our ability to focus &#8212; today, we kinda all agree they are <em>under attack</em>, but we hardly ever thought about them before the social media era.</p></li></ul><p>So what is AI going to take from us?</p><p>This is a tough question, because AI is likely the <em>broadest</em> tech improvement we have seen in our lifetimes. By simplifying it a bit, it delivers two main things: <strong>intelligence</strong> and <strong>knowledge</strong>.</p><p>Knowledge is, obviously, about knowing things, while intelligence in this context is the ability to reason on a problem and apply logic to come up with a solution. Most work (and life) tasks require some combination of knowledge and intelligence to be done.</p><p>Now, we may nitpick about the definition of AGI, but, as of today already, we have to admit AI does a better job than people for probably &gt;90% of such tasks. That&#8217;s the reality, folks. And that&#8217;s because, even in those rare cases where an expert still has an edge (better knowledge), or you can reason through a problem better than a frontier model (better intelligence), AI still most often wins because of how cheaper and faster it does the thing. Even when the work done by AI is just, say, 80% as good as a human expert, it may still win because it&#8217;s 80% faster and cheaper, and that&#8217;s a desirable tradeoff.</p><p>Should we be excited about this, because of the opportunities it brings, or scared, because we feel increasingly disposable? It depends.</p><p>Personally, I believe this is fine as long as we use AI in a way that puts us, as individuals, on a trajectory of <strong>personal growth</strong>, instead of regression.</p><p>Is this even possible? I believe so. Chess and Go are great examples of this: AI surpassed humans long ago, but it also allowed humans to get immensely better by watching AI play, and now both games are more popular than ever.</p><p>But what does it take to get there? Let&#8217;s talk about volition and... marathons &#128071;</p><div><hr></div><h2>&#127939;&#8205;&#9794;&#65039; Mental marathoners</h2><p>In his article, David says that when intelligence is plentiful, <em>volition</em> becomes valuable. In this case, it&#8217;s volition to stretch your own abilities and become a better version of yourself. David calls the people who are willing to go through this: <strong>mental marathoners</strong>.</p><p>I like the marathon picture for this, because marathons do not fit a practical purpose, outside that of <em>stretching</em> what you can achieve as a human. When it comes to health, you can (and it&#8217;s probably easier to) get in great shape <em>without</em> extreme 40km runs, and of course, when it comes to pure utility, a car covers that distance just fine.</p><p>So, just like marathoners run because they <em>feel the need</em> to run and challenge themselves, <em>mental marathoners</em> are supposedly those who feel a <strong>need for cognition</strong>, and are going to use AI to get better and sharper, as opposed to being passive <em>passengers</em> of this tech.</p><p>Now, where David and I disagree is in framing such a need as an innate <em>trait</em> &#8212; you either have this hunger or you don&#8217;t. I don&#8217;t think this is the case, and in general I don&#8217;t find this to be a <em>productive</em> way of looking at things. The productive way, instead, is by asking: what can we do to become <em>hungrier</em> for cognition? Or why don&#8217;t we feel like it right now?</p><p>In other words, assuming we are not <em>either</em> born hungry or not, what can we do to become hungrier? This is an interesting question because it is relevant at all levels:</p>
      <p>
          <a href="https://refactoring.fm/p/mental-marathoners">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Giving agents dynamic autonomy 🚥]]></title><description><![CDATA[A practical case study based on the team at Unblocked]]></description><link>https://refactoring.fm/p/giving-agents-dynamic-autonomy</link><guid isPermaLink="false">https://refactoring.fm/p/giving-agents-dynamic-autonomy</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 26 Aug 2026 06:36:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZK5K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, <a href="https://refactoring.fm/about">Luca</a> here! Welcome to a </em>&#128274;<em> <strong>weekly essay</strong> </em>&#128274;<em> from Refactoring.</em></p><p><em>Every week I write an article to 170K+ engineers about how make good software together, and interview a world-class tech leader. I also build and maintain <a href="https://refactoring.fm/p/introducing-tolaria">Tolaria</a> in the open, publishing my workflows and learnings here.</em></p><div><hr></div><p><span>Recently I have started researching and publishing </span><a href="https://refactoring.fm/p/how-trm-rebuilt-product-development-for-ai"><span>more case studies</span></a><span> about how real companies are doing product development with AI. That&#8217;s because I feel that many people are like: &#8220;</span><em><span>enough with the thought leadership</span></em><span>!&#8221; &#8212; and that includes me!</span></p><p><span>This time I am doing a deep dive into the AI workflows of the team at </span><a href="https://getunblocked.com/"><span>Unblocked</span></a><span>, which I have known for a long time. I sat down with </span><a href="https://ca.linkedin.com/in/dennispi"><span>Dennis</span></a><span> and </span><a href="https://www.linkedin.com/in/brandonwaselnuk"><span>Brandon</span></a><span>, who walked me through some of their most interesting processes.</span></p><p><span>The team at Unblocked is especially relevant because they got </span><strong><span>skin in the game</span></strong><span>. They ship a product that turns the team&#8217;s code, docs, tickets, and conversations, into actionable context for agents. So they dogfood all of this every day. That&#8217;s a strong incentive to work as close as possible to the frontier, rather than doing things &#8220;as we have always done&#8221; (cit.)</span></p><p><span>I also love that a lot of what they do is public: they maintain an </span><a href="https://github.com/unblocked/cookbook"><span>open-source cookbook</span></a><span> with several recipes (skills), which you can fork and copy.</span></p><p><span>So here is the agenda for today:</span></p><ul><li><p><span>&#127898;&#65039; </span><strong><span>Dynamic autonomy</span></strong><span> &#8212; scoring runs for risk and confidence, and behaving accordingly.</span></p></li><li><p><span>&#129514; </span><strong><span>Case study #1: vibe check</span></strong><span> &#8212; one skill, two triggers, three exits.</span></p></li><li><p><span>&#128680; </span><strong><span>Case study #2: AI-assisted incidents</span></strong><span> &#8212; humans drive, cleanup can go further</span></p></li><li><p><span>&#128216; </span><strong><span>Creating a cookbook around it</span></strong><span> &#8212; interactive vs headless, and how the score moves</span></p></li><li><p><span>&#128202; </span><strong>Delivery numbers</strong><span> &#8212; what the metrics say so far.</span></p></li></ul><p><span>Let&#8217;s dive in!</span></p><div><hr></div><p><em><span>Disclaimer: I am a fan of what Unblocked is building and I am grateful to have it as a partner on this piece. You should check it out!</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://getunblocked.com/&quot;,&quot;text&quot;:&quot;Learn more about Unblocked&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://getunblocked.com/"><span>Learn more about Unblocked</span></a></p><p><em><span>However, I will only write my unbiased opinion about the practices and tools covered, Unblocked included.</span></em></p><div><hr></div><h2><span>&#127898;&#65039; Dynamic autonomy</span></h2><p><span>One of the most popular ideas about AI workflows is the so-called </span><strong><span>autonomy slider</span></strong><span> &#8212; that is, for any given process you should design how much leeway to give to the AI, vs how much humans should intervene (and when, and where).</span></p><p><span>Autonomy is, of course, a spectrum. If perfect autonomy looks like a </span><em><span>loop</span></em><span>, we talk about </span><em><span>humans-in-the-loop</span></em><span> to express that some parts are designed for humans to interrupt the AI and do things.</span></p><p><span>One of the most interesting ideas I got from Dennis and Brandon is about making this autonomy slider </span><em><span>dynamic</span></em><span>: a lot of their workflows are designed to have runs </span><strong><span>scored for risk and confidence</span></strong><span>. Such a score </span><em><span>guides</span></em><span> how much autonomy the agent gets at that time, and where a human has to step in.</span></p><p><span>This is a flexible concept that can be applied to many different workflows: shipping code, processing bug reports, intercepting incidents, and more.</span></p><p><span>In fact, most of these include extremely </span><em><strong><span>diverse</span></strong></em><strong><span> situations</span></strong><span>, so it&#8217;s tricky to </span><em><span>hard-code</span></em><span> human gates into the workflows themselves. You constantly risk having either:</span></p><ul><li><p><span>Safe work unnecessarily waiting in queue, or</span></p></li><li><p><span>Risky work getting through when it should have been stopped and inspected first.</span></p></li></ul><p><span>To make an example, let&#8217;s say a bug report spawns from a customer success chat, or from Datadog telemetry. The AI evaluates two questions:</span></p><ul><li><p><span>How confident is the AI about this job being real, and being able to do it?</span></p></li><li><p><span>How risky is this change?</span></p></li></ul><p><span>This leads to a score that drives the next action:</span></p><ul><li><p>&#128308; <strong>High risk, low confidence</strong> &#8212; just write a ticket and hand it to a human.</p></li><li><p><span>&#128993; </span><strong><span>In the middle, roughly 50 to 70%</span></strong><span> &#8212; Slack a person who can answer more questions about the work itself, with the context already attached.</span></p></li><li><p>&#128994; <strong>Low risk, high confidence</strong> &#8212; write the code directly and open a PR.</p></li></ul><p><span>The same idea is used on PRs. A change that is evaluated as low-risk can go through without a human review, while a high-risk one puts a human reviewer in the loop.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZK5K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZK5K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 424w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 848w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 1272w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZK5K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png" width="1456" height="918" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:918,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211774,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/212519094?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZK5K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 424w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 848w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 1272w, https://substackcdn.com/image/fetch/$s_!ZK5K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe659eb28-6a17-4a86-80be-8d8da531a73d_1564x986.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>So, let&#8217;s get more into the details of this.</span></p><div><hr></div><h2><span>&#129514; Case study #1: vibe check</span></h2><p><span>The first process Brandon walked me through was something they call </span><strong><span>vibe check</span></strong><span>.</span></p>
      <p>
          <a href="https://refactoring.fm/p/giving-agents-dynamic-autonomy">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Case for Hiring Junior Engineers 🌱]]></title><description><![CDATA[Let's flip the narrative that you only need seniors now.]]></description><link>https://refactoring.fm/p/the-case-for-hiring-junior-engineers</link><guid isPermaLink="false">https://refactoring.fm/p/the-case-for-hiring-junior-engineers</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 12 Aug 2026 07:19:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iy_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>One of the dominant narratives in software today is that AI is making junior engineers redundant.</span></p><p><span>It goes like this: since AI can </span><em><span>approximate</span></em><span> well what a junior engineer is able to produce, there is </span><strong><span>no point in hiring anyone who is not senior</span></strong><span>. In fact, senior engineers are the only ones capable of </span><em><span>steering</span></em><span> these tools.</span></p><p><span>From what I can see, this story is real, in the sense that many people believe it. I know many companies who have frozen junior hiring, and others who are explicitly steering towards small, senior-heavy teams.</span></p><p><span>I believe this is a mistake. And I don&#8217;t mean it from an ethical angle (the poor junior engineers!) &#8212; I mean from a practical, business one.</span></p><p><span>It&#8217;s also a mistake I have seen being done many times, well before AI, pretty much based on the same arguments. If anything, AI </span><em><span>supercharged</span></em><span> some of the same fallacies that have been around for decades.</span></p><p><span>Also, I am not alone in this. If you have been following Refactoring, you know the junior engineers topic is a recurring one both in the newsletter and in podcast interviews. Over time, I discussed it with </span><a href="https://refactoring.fm/p/every-engineer-is-a-manager-now-with"><span>Chris Lattner</span></a><span>, </span><a href="https://refactoring.fm/p/in-praise-of-normal-engineers"><span>Charity Majors</span></a><span>, </span><a href="https://refactoring.fm/p/diversity-ai-and-junior-engineers"><span>Meri Williams</span></a><span>, and more.</span></p><p><span>So today I will put everything together and make the definitive case for hiring junior engineers on your team in 2026! Here is the agenda:</span></p><ol><li><p><span>&#127947;&#65039;&#8205;&#9794;&#65039; </span><strong><span>Juniors are required to do more now</span></strong><span> &#8212; let&#8217;s acknowledge where this is all coming from.</span></p></li><li><p><span>&#9878;&#65039; </span><strong><span>Junior vs senior engineers</span></strong><span> &#8212; the difference is messier than you think</span></p></li><li><p><span>&#128301; </span><strong><span>First vs second-order effects</span></strong><span> &#8212; thinking of your team as a system when it comes to process, hiring, and growth.</span></p></li><li><p><span>&#127793; </span><strong><span>How to make it work</span></strong><span> &#8212; because juniors just don&#8217;t turn into seniors automatically.</span></p></li></ol><p><span>Let&#8217;s dive in!</span></p><div><hr></div><h2><span>&#127947;&#65039;&#8205;&#9794;&#65039; Juniors are indeed required to do more now</span></h2><p><span>Let&#8217;s start by acknowledging the obvious: all engineers, not just junior ones, are required to do </span><em><span>more</span></em><span> now.</span></p><p><span>More of what? For junior engineers, the job looks </span><em><span>qualitatively</span></em><span> very different, and requires a lot of things from them *earlier* in their careers than it used to.</span></p><p><span>Think of:</span></p><ul><li><p><strong><span>Code reviews</span></strong><span> &#8212; because of AI, junior engineers need now to review code from the get-go. Which in turn requires more... &#128071;</span></p></li><li><p><strong><span>Critical thinking</span></strong><span> &#8212; engineers need to constantly question the why and how provided by AI.</span></p></li><li><p><strong><span>Systems thinking</span></strong><span> &#8212; people are given bigger pieces of work from the start, which requires them to employ non-obvious design chops.</span></p></li></ul><p><span>This is what many people see and makes them say: &#8220;</span><em><span>yeah, junior engineers are screwed</span></em><span>&#8221;.</span></p><p><span>I don&#8217;t think that&#8217;s the case, because there&#8217;s more to junior engineers than coding &#128071;</span></p><div><hr></div><h2><span>&#9878;&#65039; Junior vs senior engineers</span></h2><p><span>Anyone who has worked for some time in teams with mixed levels of expertise knows that the frontier, or boundaries, between a junior and a senior engineer is not clear-cut. It&#8217;s jagged.</span></p><p><span>Engineers do not grow </span><em><span>linearly</span></em><span>, simply becoming more capable over time. As humans, we also </span><em><span>lose</span></em><span> things over time. In my experience, there are things at which senior engineers are, on average, </span><em><span>worse</span></em><span> than junior engineers.</span></p><p><span>Many senior engineers are, vs junior engineers:</span></p><ul><li><p><span>More resistant to change</span></p></li><li><p><span>More biased towards doing things the &#8220;old way&#8221; (tech choices, processes, you name it)</span></p></li><li><p><span>Less energetic and hard-working</span></p></li><li><p><span>Less willing to do the boring but necessary work that exists in all teams</span></p></li></ul><p><span>Conversely, junior engineers may lack part of what is needed to steer AI towards quality and safety, but are often better at using it as a whole. They have no bias and adapt faster because, simply put, </span><strong><span>they have less to unlearn</span></strong><span>.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iy_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iy_0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 424w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 848w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iy_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png" width="1456" height="987" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:987,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/210602503?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iy_0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 424w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 848w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!iy_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe769dbfe-186f-440f-b11a-6c0a37004fbf_1888x1280.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>They have an easier time keeping their intuition up to date about how to use agents, orchestrate them, and create autonomous loops. Are these loops designed for quality and sustainability? Probably not! But, on the contrary, I know many 15-years-of-exp developers who simply </span><em><span>refuse</span></em><span> to build loops at all, because they want to retain control over every single LOC, which is wrong just as well.</span></p><p><span>That&#8217;s all to say that </span><strong><span>the comparison between juniors and seniors is complicated</span></strong><span>, and is wildly dependent on individuals.</span></p><p><span>Furthermore, so far we have only talked about </span><em><span>production</span></em><span> &#8212; the things that engineers actually make. But that&#8217;s only the immediate, first-order output of your team.</span></p><p><span>Team success is also driven by processes, cost, hiring &amp; retention, individuals&#8217; growth, and all kinds of system-level factors that are often neglected in this conversation.</span></p><p><span>What is your team going to look like one year from now? What about two years? How does that change based on the level of seniority mix you design your team for? I know companies that are more or less intentionally refusing to plan for longer than a quarter, because of AI uncertainty and all. But I don&#8217;t think that can be an excuse. As Eisenhower said: &#8220;Plans are useless, but planning is indispensable&#8221;.</span></p><p><span>So let&#8217;s try to loop all of this in &#128071;</span></p><div><hr></div><h2><span>&#128256; Second-order effects of mixing seniority</span></h2><p><span>Out of the various parts of your team life that are &#8220;not coding&#8221;, there are three that are particularly relevant when it comes to seniority levels, and it&#8217;s process, hiring, and growth.</span></p><h3><span>1) Process</span></h3><p><span>In my experience, the teams that are best at designing and enforcing good dev process are those with a healthy mix of seniority. In fact, both extremes are often bad:</span></p><ul><li><p><strong><span>Junior-heavy teams</span></strong><span> &#8212; often would love good process, but don&#8217;t know what it looks like.</span></p></li><li><p><strong><span>Senior-heavy teams</span></strong><span> &#8212; know what good process looks like, but they can bridge gaps with individual experience and knowledge, so have less incentive to make things explicit and robust.</span></p></li></ul><p><span>Mixed, diverse teams have both the senior folks who can </span><em><span>design</span></em><span> process, and the junior ones to benefit.</span></p><p><span>Needless to say, process, guardrails, devex, and all that jazz today is 10x more important than in the past, because that&#8217;s also how you scale AI work (the &#8220;harness&#8221;!).</span></p><h3><span>2) Hiring</span></h3><p><span>Senior engineers are hard to find and hire: you are competing for a limited pool of talent, and the pipeline is long and expensive. No way around it.</span></p><p><span>Conversely, junior engineers come from predictable, controllable hiring channels, like universities, bootcamps, and the likes. They are both cheaper </span><em><span>and</span></em><span> faster to hire.</span></p><h3><span>3) Growth</span></h3><p><span>Junior engineers can grow into the specific mix of duties and skills that your company needs, often compensating for the lack of experience with this special fit that is hard to replicate by hiring a senior. Even worse, a senior engineer who is already invested in a set of technologies and practices may have little interest in steering towards how your team does things.</span></p><p><span>Junior engineers are also easier to keep engaged, growing, and happy for a long time, simply because the bar for work that makes them grow is lower than for a senior. In any company there is a </span><em><span>ceiling</span></em><span> to what an engineer can learn, and senior folks just leave when they stop growing. In a healthy mixed team, senior departures are compensated by juniors who have risen through the ranks, and eventually replaced the former.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VbsU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VbsU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 424w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 848w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 1272w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VbsU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:298468,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/210602503?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VbsU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 424w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 848w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 1272w, https://substackcdn.com/image/fetch/$s_!VbsU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1450742d-6990-4e5c-95af-ad64e260aeea_1880x940.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><span>&#127793; How to Make It Work</span></h2><p><span>So, as </span><a href="https://refactoring.fm/p/growing-the-development-forest-with"><span>Martin Fowler put it on the podcast</span></a><span>, one of the most important qualities of junior engineers is to eventually turn into senior engineers. That said, this doesn&#8217;t happen automatically.</span></p><p><span>While there exists, indeed, a dream scenario in which junior engineers grow, become senior, and *rotate* your headcount to compensate other senior departures, in circle-of-life fashion, there is also a nightmarish scenario in which juniors are thrown in the trenches, abuse AI in ways they don&#8217;t understand, nobody checks on them, and the product and tech eventually goes to shit.</span></p><p><span>When this cycle breaks, it&#8217;s because junior engineers </span><strong><span>don&#8217;t have enough feedback loop</span></strong><span> to 1) ensure their work is high quality, and 2) learn and grow from doing it.</span></p><p><span>The way to create this feedback loop, to me, looks like two-fold:</span></p><ul><li><p><strong><span>Invest in an amazing harness</span></strong><span> &#8212; create guardrails, rules, gates, and </span><em><span>encode</span></em><span> everything that can ensure quality </span><em><span>automatically</span></em><span>. This benefits just about everyone: senior engineers, AI, and junior engineers who can learn from those same rules.</span></p></li><li><p><strong><span>Pair juniors with seniors</span></strong><span> &#8212; let young folks experiment and work fast, but pair them with seniors to provide judgment and systems thinking. It&#8217;s still early days for this and everyone needs to find their own formula, but e.g. I loved Rick Clegg&#8217;s talk about </span><a href="https://leaddev.com/hiring/guardrails-not-gates-scaling-juniors-in-the-ai-era"><span>what they do at Wise</span></a><span> about it.</span></p></li></ul><div><hr></div><h2><span>&#128218; Resources</span></h2><p><span>I got plenty of resources about this if you want to deep-dive more:</span></p><ul><li><p><strong><a href="https://leaddev.com/hiring/guardrails-not-gates-scaling-juniors-in-the-ai-era"><span>Scaling Juniors in the AI Era</span></a></strong><span> &#8212; the aforementioned talk by Rick Clegg from Wise about using automate guardrails to let junior engineers ship faster with AI.</span></p></li><li><p><strong><a href="https://frederickvanbrabant.com/blog/2026-07-24-you-dont-hire-juniors-to-do-menial-chores/"><span>You Don&#8217;t Hire Juniors to Do Menial Chores</span></a></strong><span> &#8212; great piece by Frederick Van Brabant about how juniors help innovation: they bring fresh takes to many things, and stress-test your assumptions because they have not yet learned all your bad habits.</span></p></li><li><p><strong><a href="https://refactoring.fm/p/diversity-ai-and-junior-engineers"><span>Diversity, AI, and Junior Engineers</span></a></strong><span> &#8212; my interview with the awesome Meri Williams, where we talked a lot about growing engineers.</span></p></li><li><p><strong><a href="https://refactoring.fm/p/in-praise-of-normal-engineers"><span>In Praise of Normal Engineers</span></a></strong><span> &#8212; the incredible article that Charity Majors wrote for Refactoring, where she argues we should hire the &#8220;right&#8221; people instead of the &#8220;best&#8221; ones, and invest in 10x teams, instead of 10x engineers.</span></p></li></ul><div><hr></div><h2><span>&#128204; Bottom line</span></h2><p><span>And that&#8217;s it for today! Here are the main takeaways:</span></p><ul><li><p><span>&#9878;&#65039; </span><strong><span>The junior vs senior frontier is jagged, not linear</span></strong><span> &#8212; engineers don&#8217;t simply get better at everything over time. Seniors gain experience but often become more resistant to change and harder to keep engaged, while juniors adapt faster, have less to unlearn, and are often better at embracing AI workflows.</span></p></li><li><p><span>&#128260; </span><strong><span>Mixed-seniority teams build the best processes</span></strong><span> &#8212; senior-heavy teams have less incentive to make knowledge explicit and systematic, while junior-heavy teams don&#8217;t know what good looks like. You need both. Also, robust, explicit process is exactly what scales AI work.</span></p></li><li><p><span>&#128176; </span><strong><span>Junior hiring is cheaper, faster, and more sustainable</span></strong><span> &#8212; instead of competing for a scarce pool of senior talent, you can hire juniors from predictable channels and grow them into the specific shape your company needs, creating a circle-of-life rotation that compensates senior departures.</span></p></li><li><p><span>&#128737;&#65039; </span><strong><span>Invest in the harness, not just the horse</span></strong><span> &#8212; the way to make junior engineers thrive is to build amazing guardrails (automated quality gates, rules, standards) and pair them with seniors who provide judgment and systems thinking.</span></p></li><li><p><span>&#128302; </span><strong><span>Refusing to hire juniors is a bet against your own future</span></strong><span> &#8212; if you only hire senior engineers today, you are optimizing for short-term output while starving the pipeline that will sustain your team for years to come.</span></p></li></ul><div><hr></div><p>See you next week!</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[Summer AI Coding Updates ☀️]]></title><description><![CDATA[Monthly updates to my AI workflows, Tolaria development, and more!]]></description><link>https://refactoring.fm/p/summer-ai-coding-updates</link><guid isPermaLink="false">https://refactoring.fm/p/summer-ai-coding-updates</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 05 Aug 2026 07:01:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!stRw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there! Welcome to a new edition of my monthly updates on my AI coding workflow.</p><p>Once a month I publish an article about <strong>how I develop <a href="http://tolaria.md/">Tolaria</a></strong>, including an overall recap plus the latest updates, and some useful resources.</p><p>I consider part of my work (combined between Tolaria &amp; Refactoring) to always try the latest and greatest, and work at the frontier of what&#8217;s possible, so you will only get thoughts that come from real usage and experiments.</p><p>Also, this is the first month since we launched the <a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">Tolaria Alliance</a>, which has been a huge success so far! This is what allows Tolaria to stay free and open source, and this series (and the whole development of Tolaria) is made possible by the great tools I use everyday, which are:</p><ul><li><p><strong><a href="http://codescene.com/">CodeScene</a> </strong>&#8212; to guarantee great code health across the codebase.</p></li><li><p><strong><a href="https://codacy.com/">Codacy</a> </strong>&#8212; to guarantee code quality and security.</p></li><li><p><strong><a href="https://getunblocked.com/">Unblocked</a> </strong>&#8212; to help agents (and myself) fetch information across the codebase, ADRs, Github issues, and commit history.</p></li><li><p><strong><a href="http://circleci.com/">CircleCI</a> </strong>&#8212; to allow fast and scalable local validation, and remote CI (migrated this month!)</p></li></ul><p>That said, here is the agenda for today:</p><ul><li><p>&#128260; <strong>Workflow recap </strong>&#8212; for those who missed the previous episodes.</p></li><li><p>&#128167; <strong>Tolaria updates </strong>&#8212; what happened on the product side.</p></li><li><p>&#128256; <strong>Forking open source</strong> &#8212; and the future of it</p></li><li><p><strong>&#128655; Creating custom gates </strong>&#8212; to give agents stricter constraints.</p></li><li><p>&#129302; <strong>On using GPT 5.6</strong> &#8212; and the latest models</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128260; Workflow recap</h2><p>First of all, if you missed the previous editions, here are some pointers:</p><ul><li><p><a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">Product management</a> &#8212; how I do <em>traffic control</em> between issues, PRs, and product requests, and orchestrate the overall product backlog.</p></li><li><p><a href="https://refactoring.fm/i/200102476/guides-gates-and-guards">AI Coding</a> &#8212; my own approach to scaling coding with agents, via guides, gates, and guards. Mostly remained unchanged from last month.</p></li><li><p><a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">Tools I use</a> &#8212; a deeper dive into how I use the tools from the alliance, and others, too.</p></li><li><p><a href="https://refactoring.fm/i/193368488/adrs">ADRs, and more</a> &#8212; in the initial workflow article I discussed how I do docs, which has scaled nicely so far.</p></li></ul><p>Now on to the new stuff, but first... product updates. Because what is my workflow worth if you don&#8217;t see what I shipped with it?!</p><div><hr></div><h2><strong>&#128167; </strong>Tolaria updates</h2><p>This month Tolaria has followed a bit of a <a href="https://en.wikipedia.org/wiki/Barbell_strategy">barbell strategy</a>, where the two extremes are:</p><ul><li><p>&#128296; <strong>Basics</strong> &#8212; hardening performance and quality of life features for the editor, which remains the most crucial experience to nail.</p></li><li><p>&#127770; <strong>Moonshots</strong> &#8212; trying (possibly overly) ambitious ideas, and see what sticks.</p></li></ul><p>I will talk more in detail later about performance, because I have thought a lot not only on <em>what</em> to do about it, but also <em>how </em>to create a mini workflow so that it doesn&#8217;t degrade over time.</p><h3>1) Basics &#128296;</h3><p>Basics include small features like block selection and navigation (a-la Notion), and the ability to collapse any heading and list item (a-la Bear). I constantly &#8220;borrow&#8221; features from other editors and note apps I love, but at least I credit them &#128516;</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b244ec52-b78d-45f3-be4e-2a9ca24d72d1&quot;,&quot;duration&quot;:null}"></div><p>Of course, you will also find a long tail of more improvements, like being able to open vaults in separate windows, more MCP tools, more granular controls for AI agents, and just a lot of stuff!</p><h3>2) Moonshots &#127770;</h3><p>Talking of moonshots, you can now create <strong>HTML blocks</strong> inside Tolaria.</p><p>This wouldn&#8217;t be <em>that</em> ambitious, if not for the fact that you can also <strong>reference properties</strong> from any note inside the HTML, and use a simple set of formulas to render lists, format values, and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!stRw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!stRw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 424w, https://substackcdn.com/image/fetch/$s_!stRw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 848w, https://substackcdn.com/image/fetch/$s_!stRw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!stRw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!stRw!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg" width="1200" height="579.3956043956044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:703,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:514012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/209650772?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!stRw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 424w, https://substackcdn.com/image/fetch/$s_!stRw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 848w, https://substackcdn.com/image/fetch/$s_!stRw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!stRw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d4c4ff0-fd4f-4386-81cc-6dddc4cf4ef5_4096x1977.jpeg 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This builds on the same system that <strong>allows spreadsheets to reference note properties</strong>, which was working well, so I said why not?! It plants the seeds for making Tolaria a platform where you can <strong>build mini apps</strong> that take information in real time from your notes.</p><p>It&#8217;s very cool if you ask me, and I am eager to see what you will build with it!</p><p>As I anticipated, though, what I am the proudest of is our performance work, which deserves a separate chapter &#128071;</p><div><hr></div><h2>&#9889; Performance &amp; forking open source</h2>
      <p>
          <a href="https://refactoring.fm/p/summer-ai-coding-updates">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[A Case Study in AI Product Development 🔬]]></title><description><![CDATA[How TRM built a custom internal harness for product and engineering work.]]></description><link>https://refactoring.fm/p/a-case-study-in-ai-product-development</link><guid isPermaLink="false">https://refactoring.fm/p/a-case-study-in-ai-product-development</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 29 Jul 2026 07:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sCNl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Hey there, Luca here!</span></p><p><span>When I write about AI coding, you can typically find three types of articles:</span></p><ol><li><p><strong><span>Commentary on recent research</span></strong><span> &#8212; as we did </span><a href="https://refactoring.fm/p/acceleration-whiplash"><span>several</span></a><span> times recently.</span></p></li><li><p><strong><span>My own experiments</span></strong><span> &#8212; these days, mostly about building Tolaria.</span></p></li><li><p><strong><span>Case studies</span></strong><span> &#8212; about how other teams work.</span></p></li></ol><p><span>The third type is the hardest to write. There are very few companies that accept to put themselves out there and talk about </span><em><span>practices</span></em><span>, not just tools or tokens. That is why I was happy when I met </span><a href="https://www.linkedin.com/in/rahulr0609/"><span>Rahul</span></a><span> and the team at </span><a href="http://trmlabs.com/"><span>TRM Labs</span></a><span>, and they agreed to share how they are redesigning their product development workflow.</span></p><p><span>For context, over the last few months, I have argued that AI is changing the </span><strong><span>cost structure</span></strong><span> of development. So, since coding is now cheaper, we need to find a way to make everything else cheaper too.</span></p><p><span>TRM reached the same conclusion and did something interesting: they rebuilt their shipping workflow and encoded it into a </span><strong><span>custom internal harness</span></strong><span> called </span><strong><span>Cortex</span></strong><span>, which they are now open-sourcing.</span></p><p><span>Today we&#8217;ll explore how they have been thinking about it. So here is the agenda:</span></p><ul><li><p><span>&#127937; </span><strong><span>Inner loop vs outer loop</span></strong><span> &#8212; a useful mental model to translate faster coding into actual faster delivery.</span></p></li><li><p><span>&#128256; </span><strong><span>From handoffs to outcomes</span></strong><span> &#8212; how TRM redesigned its product workflow around the work rather than the roles.</span></p></li><li><p><span>&#129520; </span><strong><span>Cortex as a harness</span></strong><span> &#8212; how reviewable artifacts, deterministic gates, and repository context make the workflow reliable.</span></p></li><li><p><span>&#129514; </span><strong><span>Starting small</span></strong><span> &#8212; how TRM moved from a greenfield experiment to a regulated production system.</span></p></li><li><p><span>&#9989; </span><strong><span>Healthy code and healthy people</span></strong><span> &#8212; why increasing automation doesn&#8217;t mean removing human judgment.</span></p></li></ul><p><span>Let&#8217;s dive in!</span></p><div><hr></div><p><em><span>I want to thank </span><a href="https://www.linkedin.com/in/rahulr0609"><span>Rahul</span></a><span> and the team at </span><a href="http://trmlabs.com/"><span>TRM Labs</span></a><span> for partnering on this piece. You can learn more about their work below:</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://trmlabs.com/&quot;,&quot;text&quot;:&quot;Learn more about TRM Labs&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="http://trmlabs.com/"><span>Learn more about TRM Labs</span></a></p><div><hr></div><h2><span>&#127937; Inner loop vs Outer loop</span></h2><p><span>Most AI coding tools optimize what we call the </span><strong><span>inner loop</span></strong><span>: you describe a feature, watch the agent write the code, and get something working a few minutes later. This is where AI has delivered the most visible improvements, but it&#8217;s just a small part of how software gets shipped.</span></p><p><span>Other than the inner loop, there is an </span><strong><span>outer loop</span></strong><span>, that covers the broader cycle: deciding what is worth doing, shaping and reviewing the solution, releasing it, and learning from production.</span></p><p><span>As of today, it&#8217;s been obvious how AI can help with the </span><em><span>inner loop</span></em><span>, but much less so with the </span><em><span>outer loop</span></em><span>. And if you don&#8217;t do </span><em><span>both</span></em><span>, constraints move to other parts of the workflow, like:</span></p><ul><li><p><span>&#128269; </span><strong><span>Reviews</span></strong><span> &#8212; agents create more PRs than people can reasonably inspect.</span></p></li><li><p><span>&#128203; </span><strong><span>Shaping product</span></strong><span> &#8212; the team can build faster than it can decide what good work looks like.</span></p></li><li><p><span>&#127919; </span><strong><span>Customer signal</span></strong><span> &#8212; shipping the wrong thing faster is still waste.</span></p></li></ul><p><span>At a small scale, this is the same </span><a href="https://refactoring.fm/p/acceleration-whiplash"><span>acceleration whiplash</span></a><span> I have experienced with Tolaria. Starting work is cheap, but my ability to review it, decide what is good enough, and create the next piece of work does not scale at the same rate.</span></p><p><span>To fix this, the TRM team stopped treating </span><em><span>engineering speed</span></em><span> as the goal and started looking at </span><strong><span>end-to-end throughput </span></strong><span>instead &#128071;</span></p><div><hr></div><h2><span>&#128256; From handoffs to outcomes</span></h2><p><span>Like most companies, TRM had a product shipping </span><em><span>framework</span></em><span>. This can be more or less formalized, but chances are your team has a </span><em><span>shared language</span></em><span> for how an idea moves from customer feedback to production.</span></p><p><span>At TRM, such a framework had </span><strong><span>nine stages</span></strong><span> and was mostly organized around roles. A Product Owner prepared the spec, a Technical Product Manager helped translate it; a Technical Anchor owned the implementation, and various artifacts moved from one person to another.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-OLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-OLv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 424w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 848w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 1272w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-OLv!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png" width="1200" height="309.8901098901099" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:376,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-OLv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 424w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 848w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 1272w, https://substackcdn.com/image/fetch/$s_!-OLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8184233-250a-47c7-98d5-ee83f03efc15_2048x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>The process was designed around the assumption that every artifact had to be created by one specialist and handed to the next.</span></p><p><span>AI weakens that assumption. For example:</span></p><ul><li><p><span>A PM can now explore technical feasibility and create a working prototype.</span></p></li><li><p><span>Or, on the other end, an engineer can investigate the customer context and draft a product spec.</span></p></li></ul><p><span>Does this mean the intermediate artifacts disappear? I don&#8217;t think so. If anything, specs, plans, or decision records can become even more important when agents do the implementation, to trace execution and record history. But it&#8217;s likely that individual artifacts no longer need to belong *exclusively* to an individual role.</span></p><p><span>So, TRM rebuilt the framework around six outcomes, organized into three groups:</span></p><ol><li><p><span>&#128301; </span><strong><span>Sense and Decide</span></strong><span> &#8212; collect signals, understand the problem, and decide whether it is worth solving.</span></p></li><li><p><span>&#9999;&#65039; </span><strong><span>Shape and Make</span></strong><span> &#8212; turn the problem into a reviewable direction, then build it.</span></p></li><li><p><span>&#128227; </span><strong><span>Communicate and Learn</span></strong><span> &#8212; release the change, observe its impact, and feed what was learned into the next cycle.</span></p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sCNl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sCNl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 424w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 848w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sCNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png" width="522" height="472.8320251177394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1154,&quot;width&quot;:1274,&quot;resizeWidth&quot;:522,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sCNl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 424w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 848w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!sCNl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcdf5bd1-2bce-4b88-ae47-2e5e43c373b9_1274x1154.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>These are broad areas that change the job of the people involved:</span></p><ul><li><p><span>&#127919; </span><strong><span>PMs and EMs expand their scope</span></strong><span> &#8212; they can test feasibility and prototype ideas without waiting for engineering capacity.</span></p></li><li><p><span>&#129489;&#8205;&#128187; </span><strong><span>Engineers get closer to the problem</span></strong><span> &#8212; they can retrieve customer signal, shape solutions, and work across more of the stack.</span></p></li><li><p><span>&#127912; </span><strong><span>Specialists turn judgment into platforms</span></strong><span> &#8212; designers, security engineers, and other experts create rules and constraints that make good decisions easier for everyone else.</span></p></li></ul><p><span>I really care about the last point, and I think it&#8217;s how specialist work is evolving today. Deep specialists are more and more an </span><em><span>overkill</span></em><span> for regular production tasks &#8212; they have a bigger impact when they bottle their taste into design systems, components, security policies, workflows, and </span><em><span>platform</span></em><span> in general.</span></p><p><span>So TRM laid down the process and then created a harness around it &#128071;</span></p>
      <p>
          <a href="https://refactoring.fm/p/a-case-study-in-ai-product-development">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The State of AI Impact in Engineering]]></title><description><![CDATA[What data from 500+ teams is revealing about velocity gains.]]></description><link>https://refactoring.fm/p/the-state-of-ai-impact-in-engineering</link><guid isPermaLink="false">https://refactoring.fm/p/the-state-of-ai-impact-in-engineering</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 22 Jul 2026 12:06:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fd2h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Hi there! Today&#8217;s article is written together with my friend </span><a href="https://www.linkedin.com/in/justinreock"><span>Justin Reock</span></a><span>, Deputy CTO at </span><a href="http://getdx.com/"><span>DX</span></a><span>. Justin already co-authored a great article about </span><a href="https://refactoring.fm/p/vibe-coding-workflows"><span>vibe-coding workflows</span></a><span> last year, which ended up becoming one of the top 5 Refactoring articles ever, so we have a high bar to clear!</span></p><p><span>One of the things I like the most about the DX team is that they run an incredible amount of research. They run surveys all year round, and keep a pulse of where the industry is going around several topics &#8212; especially </span><strong><span>AI and developer experience</span></strong><span>.</span></p><p><span>They recently released the </span><a href="https://getdx.com/report/state-of-ai-impact-in-engineering-q2-report/?utm_source=refactoring"><span>Q2 2026 AI impact report</span></a><span>, the latest in a quarterly series tracking how AI is reshaping engineering teams. I regularly check out these reports, and one thing I noticed is how they gradually moved from discussing </span><strong><span>adoption</span></strong><span> to discussing </span><strong><span>impact</span></strong><span>.</span></p><p><span>The feeling is that AI is everywhere now, and the main challenge for engineering leaders is not to spearhead adoption anymore, but rather justify the exponentially-increasing AI budgets, by demonstrating what AI is actually delivering.</span></p><p><span>I got preview access to the report, and today we will comment on a few key highlights.</span></p><p><span>So here is the agenda:</span></p><ul><li><p><span>&#128202; </span><strong><span>Speed is real but uneven</span></strong><span> &#8212; what 500+ teams reveal about where AI gains concentrate, and who&#8217;s being left behind.</span></p></li><li><p><span>&#129521; </span><strong><span>Orgs are not multiplying AI output</span></strong><span> &#8212; developer experience is declining even as velocity climbs.</span></p></li><li><p><span>&#128300; </span><strong><span>Code is easier to change but harder to trust</span></strong><span> &#8212; a surprising divergence between maintainability and confidence.</span></p></li><li><p><span>&#128694;&#8205;&#9794;&#65039;&#8205;&#10145;&#65039; </span><strong><span>Spend is outrunning returns</span></strong><span> &#8212; AI budgets are up 28x, but innovation ratio is flat.</span></p></li><li><p><span>&#129517; </span><strong><span>What this means for engineering leaders</span></strong><span> &#8212; how to shift from tool adoption to system optimization.</span></p></li></ul><p><span>Let&#8217;s dive in!</span></p><div><hr></div><p><em><span>I want to thank Justin and the DX team for partnering on this! I am a big fan of their work and you should check out the full report here.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://getdx.com/report/state-of-ai-impact-in-engineering-q2-report/?utm_source=refactoring&quot;,&quot;text&quot;:&quot;Download the full report&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://getdx.com/report/state-of-ai-impact-in-engineering-q2-report/?utm_source=refactoring"><span>Download the full report</span></a></p><div><hr></div><h2><span>&#128202; Speed is real but uneven</span></h2><p><span>Across the 500+ respondents, </span><strong><span>over 50% of the code is now generated by AI</span></strong><span>. This metric has accelerated rapidly, increasing from 34% in Q1 2026.</span></p><p><span>Median weekly throughput rose 37% over four quarters (1.42 to 1.94 PRs/eng/week), and deployment frequency is up double digits across most segments. However, gains are concentrated among </span><strong><span>small organizations</span></strong><span> (less than 100 engineers) and tech-sector teams, pulling away from larger and traditional-industry teams, and the gap is widening.</span></p><p><span>This echoes what we have seen in other reports recently, from the </span><a href="https://refactoring.fm/p/acceleration-whiplash"><span>Acceleration Whiplash</span></a><span>, to the </span><a href="https://refactoring.fm/p/the-era-of-the-software-factory"><span>State of Software Delivery</span></a><span> earlier this year.</span></p><p><span>The speed at which the tools keep improving makes gains compound for teams who invest into AI workflows, so the distribution of team productivity becomes a steeper and steeper power law, with the top percentiles pulling away from the pack.</span></p><div><hr></div><h2><span>&#129521; Orgs are not multiplying AI output</span></h2><p><span>DX measures developer experience with a proprietary index called DXI (</span><a href="https://refactoring.fm/p/the-era-of-the-software-factory"><span>we talked about it with Abi Noda</span></a><span>), which, over the last four quarters, has </span><em><span>dropped</span></em><span> on average from 67 to 65.</span></p><p><span>Again this is not an </span><em><span>even</span></em><span> drop: AI is </span><em><span>improving</span></em><span> some aspects of the devex (docs quality, code maintainability, onboarding speed) while making others worse: larger PRs, slower reviews, less incremental delivery. In aggregate, the </span><strong><span>net effect is negative</span></strong><span>.</span></p><p><span>Median PR sizes have nearly doubled during the same period &#8212; and of course increases in PR size are an early proxy for technical debt, bugs, review friction, and all kinds of nasty stuff.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fd2h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fd2h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 424w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 848w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 1272w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!fd2h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png" width="1360" height="878" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:878,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131121,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/207414394?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fd2h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 424w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 848w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 1272w, https://substackcdn.com/image/fetch/$s_!fd2h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1908ddbd-9fb3-4b56-adb6-09cca1434184_1360x878.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>So, </span><strong><span>velocity metrics</span></strong><span> alone will tell you things are improving, but </span><strong><span>devex metrics</span></strong><span> will tell you that the system (and developers) are strained, and we are far from a sustainable, positive flywheel.</span></p><p><span>My personal feeling about this is that so far we have mostly tried to </span><em><span>slap</span></em><span> AI onto the existing steps of the dev process, while running them the same way we always have. This might bring incremental gains, and even work well for some of the steps, but it completely breaks others, like </span><strong><span>code reviews</span></strong><span>.</span></p><p><span>It&#8217;s obviously foolish to think that AI can make developers write code 3x faster (as it already does), while assuming we&#8217;ll need to keep reviewing every single LOC manually.</span></p>
      <p>
          <a href="https://refactoring.fm/p/the-state-of-ai-impact-in-engineering">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[What LLM should you use for AI coding?]]></title><description><![CDATA[A guide to choosing and measuring different AI models]]></description><link>https://refactoring.fm/p/what-llm-should-you-use-for-ai-coding</link><guid isPermaLink="false">https://refactoring.fm/p/what-llm-should-you-use-for-ai-coding</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 15 Jul 2026 07:02:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/59d435a1-d1ee-4822-a73a-92ba03e62c68_2292x1526.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Quick heads up! <span>On </span><strong><span>July 22nd</span></strong><span> I am hosting a webinar on </span><strong><span>automated incident mgmt</span></strong><span> with AI, together with the folks at Augment Code.</span></em></p><p><em>That&#8217;s because I write a lot about my <a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">AI workflows with Tolaria</a>, but many people (rightfully) tell me that things are more complex </em>on<em><span> a real team. </span></em></p><p><em><span>So I invited the team at Augment to share </span><strong><span>how they transformed their own engineering org</span></strong><span>, redesigning their main dev workflows. It&#8217;s free for everyone and you can RSVP below!</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://streamyard.com/watch/CXnfrUnxMCwk&quot;,&quot;text&quot;:&quot;Learn more and RSVP!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://streamyard.com/watch/CXnfrUnxMCwk"><span>Learn more and RSVP!</span></a></p><div><hr></div><p>Hi there! A lot of people these days ask me what AI models I use for coding, which I usually explain in my <a href="https://refactoring.fm/p/introducing-the-tolaria-alliance">monthly recaps</a>.</p><p>Some people also ask me &#8220;why&#8221; I use one model vs another, and that&#8217;s a way more complicated question to answer. AI models are hard to evaluate, because there are several factors to consider, and because, despite what public benchmarks say, each team situation is unique.</p><p>So today let&#8217;s try to think from first principles about <strong>how you should choose what LLM to use for coding</strong>, factoring everything in. Also let&#8217;s try to find some <em>durable</em> angles, so that you can create a mental model for yourself that stays valid for more than a couple of weeks.</p><p>Here is the agenda for today:</p><ul><li><p>&#128314; <strong>Accuracy / Speed / Cost</strong> &#8212; the three dimensions of model selection. But they are messier than you might think.</p></li><li><p>&#128202; <strong>Public benchmarks are not enough</strong> &#8212; you can&#8217;t trust leaderboards, and how your codebase discipline sets your floor.</p></li><li><p>&#129514; <strong>How to evaluate AI models</strong> &#8212; a maturity path from &#8220;just don&#8217;t&#8221; to building your own eval.</p></li><li><p>&#128256; <strong>Model routing</strong> &#8212; not all tasks are equally hard, so stop paying frontier prices for all of them.</p></li><li><p>&#127968; <strong>Self-hosting: almost never</strong> &#8212; cloud-hosted cheap models beat your own hardware, every time.</p></li></ul><p>Let&#8217;s dive in</p><div><hr></div><h2>&#128314; Model Selection 101</h2><p>With some degree of simplification, today you have three macro choices:</p><ol><li><p><strong>Top frontier models</strong> &#8212; e.g. Fable 5 or GPT 5.6</p></li><li><p><strong>Large open weights models, hosted in the cloud</strong> &#8212; e.g. GLM 5.2 on OpenRouter</p></li><li><p><strong>Smaller open weights models, self-hosted</strong> &#8212; e.g. see DeepSeek 4 Flash via <a href="https://github.com/antirez/ds4">DwarfStar</a> by Antirez</p></li></ol><p>These choices are actually more nuanced than this, because e.g. within frontier models, you may tweak the level of reasoning, or intentionally pick a smaller model that is cheaper and faster, because you feel it is a better fit for your task.</p><p>In fact, when judging models, there are three dimensions to consider:</p><ul><li><p>&#128300; <strong>Accuracy</strong> &#8212; % of times the AI gets the thing right</p></li><li><p>&#9889; <strong>Speed</strong> &#8212; tokens per second</p></li><li><p>&#128184; <strong>Cost</strong> &#8212; cost per 1M tokens (multiplied by tokens required)</p></li></ul><p>To make things even messier, these dimensions are not orthogonal. For example:</p><ul><li><p>A model with higher accuracy may translate into fewer round trips, which may translate into fewer tokens being used.</p></li><li><p>With many models you can reduce the amount of reasoning to improve speed while reducing accuracy.</p></li></ul><p>So, in most cases, performance is tricky to evaluate. Top frontier models guarantee max accuracy, but <strong>do you really need it</strong>?</p><p>Most people have anecdotal experience of small tasks for which fast + cheap models delivered the same level of accuracy. But how do you recognize them?</p><p>Also, it&#8217;s trickier than that, because even for bigger tasks you might find that a faster model, while less accurate, iterates faster over mistakes, leading to a lower cost overall. That&#8217;s what Jamie Turner, founder at Convex, was already <a href="https://refactoring.fm/p/how-to-design-your-tech-stack-for">saying last year</a>:</p><blockquote><p><em><strong>We optimize for fast feedback loops over perfect output. It&#8217;s better to get 80% correct code in 2 seconds than 95% correct code in 2 minutes.</strong></em></p></blockquote><p>Jamie made the case for optimizing for a quick feedback loop, so that developers don&#8217;t lose their train of thoughts while waiting for slow responses, even at the expense of a few more errors.</p><p>This is even more compelling when you factor in that with the current crop of LLMs, <strong>accuracy and cost are not in a linear relationship</strong>: a model that is 80% as accurate as the top frontier one might cost 1/10th of it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QuqF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QuqF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 424w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 848w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QuqF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png" width="1456" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121623,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/206850127?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QuqF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 424w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 848w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!QuqF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f51d5fb-b6ee-4dee-8ee2-5393c22536ed_1678x1076.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image 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">Many open models cost 1/10th of frontier ones, while being 80% as accurate in real-world tasks</figcaption></figure></div><p>Two good examples are GLM 5.2 and Grok 4.5. They both score pretty close to the top OpenAI and Anthropic models, while costing a small fraction of them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8EGM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8EGM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 424w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 848w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8EGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png" width="728" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:954,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:1095996,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/206850127?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8EGM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 424w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 848w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!8EGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9626ee9-800d-40df-a55e-6fa66d0e3dee_2540x1664.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image 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">GLM 5.2 scores very well against frontier labs models</figcaption></figure></div><p>Looking at these numbers is a good way to start some kind of <em>quantitative</em> reasoning around models, but I don&#8217;t think it&#8217;s enough &#128071;</p><div><hr></div><h2>&#128202; Public benchmarks are not enough</h2><p>I have grown skeptical of public benchmarks, for two reasons:</p>
      <p>
          <a href="https://refactoring.fm/p/what-llm-should-you-use-for-ai-coding">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🏢 Customer work vs product work]]></title><description><![CDATA[How to navigate the big conflict in B2B SaaS]]></description><link>https://refactoring.fm/p/customer-work-vs-product-work</link><guid isPermaLink="false">https://refactoring.fm/p/customer-work-vs-product-work</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 08 Jul 2026 07:00:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KDOH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a086a0-7264-4a27-bff8-11f651ab1562_1520x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><span>Hey, </span><a href="https://refactoring.fm/about">Luca</a><span> here! Welcome to a </span></em><span>&#128274;</span><em><span> </span><strong>weekly essay</strong><span> </span></em><span>&#128274;</span><em> from Refactoring.</em></p><p><em><span>Every week I </span><a href="https://refactoring.fm/s/essays?sort=top">write an article</a><span> to 170K+ engineers about how make good software together, and </span><a href="https://refactoring.fm/podcast">interview a world-class tech leader</a><span>. I also build and maintain </span><a href="https://refactoring.fm/p/introducing-tolaria">Tolaria</a><span> in the open, publishing my workflows and learnings here.</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://refactoring.fm/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>I happen to know many startups who develop B2B products for large companies. I worked <a href="http://translated.com/">in one</a>, invested <a href="https://commerceclarity.com/">in another one</a>, and have friends who work in others.</p><p>An evergreen problem about these products is organizing work in a way that successfully takes into account:</p><ol><li><p>Roadmap / long-term product strategy</p></li><li><p>Impromptu requests from key customers</p></li></ol><p>This is tricky from all points of view: business, tech, and team organization. I have thoughts about this, so let&#8217;s start from first principles. Really the very basics.</p><p>We build tech to solve problems to customers, that pay us in return for it. At any given time we can have many of such customers. Based on this, the type the work we can do to solve such problems lays on a spectrum from <em>bespoke</em> to <em>one-size-fits-all</em>:</p><ul><li><p><strong>100% bespoke</strong> &#8212; is consultancy work.<strong> </strong>You just solve the problem, IP is of the client, zero reuse.</p></li><li><p><strong>100% one-size-fits-all</strong> &#8212; is product work.<strong> </strong>You develop <em>features</em> that can be used by all (or many of) the customers of your product.</p></li></ul><p>These types of work are <em>very</em> different but, fortunately, in most real-life situations it&#8217;s obvious where your work should land on the spectrum.</p><p>First of all, a lot of the ambiguity is cleared up upfront, by deciding the type of business you want to build. Knowing that you want to build an agency vs a B2B SaaS takes a lot of cards off the table:</p><ul><li><p>If you run an agency, the problems you solve change all the time, and there is most often not a clear path to building reusable pieces.</p></li><li><p>Conversely, if you ran a B2B SaaS with e.g. thousands of customers, any of these customers <em>might</em> want something custom, but it&#8217;s obvious that it&#8217;s not worth to build it just for them.</p></li></ul><p>About the latter, though, what if these customers are not thousands, but hundreds &#8212; or maybe just tens &#8212; and each of them is very valuable to you?</p><p>That&#8217;s where things get messy. Welcome to enterprise B2B SaaS.</p><p>So here is the agenda for today:</p><ul><li><p>&#9878;&#65039; <strong>Customer work vs product work</strong> &#8212; why enterprise B2B creates a unique tension between different types of work, and how you should think about them.</p></li><li><p>&#8265;&#65039; <strong>Is it worth to do bespoke customer work?</strong> &#8212; the right questions to ask yourself before committing to custom work for a single customer.</p></li><li><p>&#127933; <strong>How to design team structure</strong> &#8212; use dedicated roles like solution engineers of FDEs to shield your roadmap from customer requests.</p></li><li><p>&#128207; <strong>How to design tech strategy</strong> &#8212; empower solution engineers with great platform, so they move fast and build things close to product shape.</p></li><li><p>&#128256; <strong>How to converge</strong> &#8212; treat customer work as validated product input, and create avenues to merge it back over time.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#9878;&#65039; Customer work vs product work</h2><p>If a customer of yours is paying you $100K for a yearly contract, instead of e.g. $2K, and you have, say, only 12 of those customers, all of a sudden their requests, however absurd, look... different.</p><p>This customer has <em>leverage</em> &#8212; and you have probably spent a lot to acquire them, so it can make complete business sense to do something specific to make them (and only them) happy.</p><p>We said this is a spectrum, but for the sake of simplicity let&#8217;s call this type of work &#8220;<strong>customer work</strong>&#8220;, as opposed to more general &#8220;<strong>product work</strong>&#8220;, which is done in the service of everyone.</p><p>The problem with customer work vs product work is that they have completely different <em>shapes</em>, when it comes to fundamental factors like:</p><ul><li><p><em>When</em> and <em>how</em> such work spawns</p></li><li><p>How urgent it is</p></li><li><p>How big it is</p></li><li><p>How it fits your overall strategy</p></li></ul><p>One of the goals of your standard <strong>product workflow</strong> is to <em>control </em>for these factors, in order to normalize them. So items you plan for are: comparable in size, planned in timely fashion, all fit your strategy, and so on.</p><p>Customer work spawns, by definition, from external forces, which makes all of the above out of your control. It also doesn&#8217;t land with the same level of <em>discipline</em> that you might put into your product process, so it&#8217;s work that is often: urgent, big, and unrelated to your plans.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S1jd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S1jd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 424w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 848w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 1272w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S1jd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png" width="1456" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177149,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/205507399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S1jd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 424w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 848w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 1272w, https://substackcdn.com/image/fetch/$s_!S1jd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa815e1c7-f704-4e2d-97c7-b8be2ff53edc_2128x1004.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This leads to questions:</p><ul><li><p>When is it worth to do these things?</p></li><li><p>How should I design my company accordingly? Speaking of team, tech, and process?</p></li></ul><p>Let&#8217;s start with the first one.</p><div><hr></div>
      <p>
          <a href="https://refactoring.fm/p/customer-work-vs-product-work">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Introducing the Tolaria Alliance! 🦸‍♂️]]></title><description><![CDATA[A small set of tools that power my Tolaria coding workflow, and also fund my work!]]></description><link>https://refactoring.fm/p/introducing-the-tolaria-alliance</link><guid isPermaLink="false">https://refactoring.fm/p/introducing-the-tolaria-alliance</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 01 Jul 2026 11:47:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-_GB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is a special edition of Refactoring and I am so excited about it!</p><p>By now, <strong>developing <a href="https://tolaria.md/">Tolaria</a></strong> is a big chunk of my working time (about 40%, to be precise). I like this balance and I am happy I can regularly write articles about AI coding coming from my own experience, as opposed to pure research.</p><p>I also don&#8217;t want to end up writing <em>only</em> about that, and so far I have kept a schedule of about <strong>once a month</strong>. This feels like is a good cadence: it&#8217;s feel overwhelming for readers, and gives me time to produce actual <em>updates</em> to the workflow, as opposed to posting always the same things.</p><p>So, today I am covering a few workflow updates, but most of all I am introducing a <strong>new set of partnerships</strong> I am very proud of.</p><p>So let&#8217;s dive in!</p><div><hr></div><h2>&#128167; The State of Tolaria</h2><p>First of all you may wonder: how is Tolaria doing? Pretty well, if you ask me.</p><p>From a growth perspective, it has now almost <strong>18K stars</strong> on Github, <strong>100K+ downloads</strong>, and thousands of daily active users.</p><p>From a product perspective, this month we delivered a ton of updates, including some massive ones, like the support for <strong>native spreadsheets</strong>. </p><p>You can now create and edit spreadsheets inside Tolaria with Excel-compatible formulas in a completely open and portable format, which is basically CSV with a frontmatter on top.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-_GB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-_GB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 424w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 848w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 1272w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-_GB!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png" width="1200" height="774.7252747252747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:2493531,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-_GB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 424w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 848w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 1272w, https://substackcdn.com/image/fetch/$s_!-_GB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefae0d0d-d7db-467a-892d-75f88b89d2ee_2590x1672.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>We also improved a lot of the editor experience, adding </span><strong>collapsible headings</strong><span>, block navigation, better spacing and typography, all while making everything </span><strong>faster than ever</strong><span>. If you haven&#8217;t tried it in a while, you definitely should!</span></p><p>I really enjoy developing (and using!) Tolaria, so the question recently has rather become: how do I make this work sustainable, while keeping everything free and open?</p><p>Enter our tech alliance!</p><div><hr></div><h2>&#129464;&#8205;&#9794;&#65039; Creating our own Tech Alliance</h2><p>The tools I use to develop Tolaria are no secret &#8212; you can figure out most of them by looking at the repo, the <a href="https://github.com/refactoringhq/tolaria/blob/main/AGENTS.md">AGENTS</a> file, hooks, and my own articles.</p><p>So, over the last month I reached out to the ones I use the most to figure out if we could work together to make the development of Tolaria more sustainable on my end via open source sponsorships, in return for me spreading the word about how I use such tools, and providing good feedback on how to improve them.</p><p>The result is an <strong>alliance</strong> that as of today includes four tools: <strong><a href="https://codescene.com/">CodeScene</a></strong>, <strong><a href="https://circleci.com/">CircleCI</a></strong>, <strong><a href="https://codacy.com/">Codacy</a></strong>, and <strong><a href="https://getunblocked.com/https://getunblocked.com/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=tolaria">Unblocked</a></strong>.</p><p>These partnerships allow Tolaria to stay free and open forever, and even give us the opportunity to accelerate by hiring a great product engineer (<em>if you think you are a great fit, please reach out and say hi!</em>).</p><p>So today I will tell you more about my workflow, which includes these tools &#8212; but first an ethical statement: I will only <em>ally </em>(and stay allied) with tools I personally use and believe are the best way to do what they do. As you will see these are <em>non overlapping</em>: each has its own job, so they really make for my <strong>tech stack</strong>. Over time we will also expand on this and create exclusive deals for Refactoring subscribers!</p><p>Before we talk about the tools, it&#8217;s worth refreshing how I think about <em>controls</em> for code written by AI. I have written about it in this recent piece &#128071;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6d92a9d5-baf3-4000-acc6-ec5fa9b10dd6&quot;,&quot;caption&quot;:&quot;Hey, Luca here! Welcome to a &#128274; weekly essay &#128274; from Refactoring.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;My AI Coding Workflow&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:6835984,&quot;name&quot;:&quot;Luca Rossi&quot;,&quot;bio&quot;:&quot;I write everyday about how to make great software and work well with humans, to 60K+ friends.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6107486-b701-4109-8f21-f450fed6e277_652x690.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:1000}],&quot;post_date&quot;:&quot;2026-06-03T07:02:23.762Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba3740b9-b1f0-462d-8744-8cd1d81d6a81_1714x1138.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://refactoring.fm/p/my-ai-coding-workflow-b09&quot;,&quot;section_name&quot;:&quot;&#129525; Essays&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:200102476,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:71,&quot;comment_count&quot;:0,&quot;publication_id&quot;:64099,&quot;publication_name&quot;:&quot;Refactoring&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!CR5A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>In a nutshell, I <em>steer </em>AI output in three main ways:</p><ul><li><p><strong>&#8618;&#65039; Guides </strong>&#8212; instructions in the AGENTS file and skills. Not 100% reliable: the AI may or <em>may not</em> follow them.</p></li><li><p><strong>&#128260; Gates </strong>&#8212; deterministic checks that don&#8217;t let bad code move forward if some conditions are not met.</p></li><li><p><strong>&#8617;&#65039; Guards</strong> &#8212; fallback procedures that typically run once a day to fix what goes through the cracks.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hd-o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hd-o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 424w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 848w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 1272w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!hd-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png" width="1456" height="691" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:691,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:524294,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hd-o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 424w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 848w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 1272w, https://substackcdn.com/image/fetch/$s_!hd-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4e77db0-5966-4432-a71b-fb513f6c6473_1914x908.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>Out of these, the most important part is the </span><strong>gates</strong><span>, because they have the (deterministic) power to stop bad code, so the more I can express this way, the better. Most of the tools below are integrated this way.</span></p><p><span>So let&#8217;s go &#128071;</span></p><div><hr></div><h2>&#129658; Code Health &#8212; with <a href="https://codescene.com/">CodeScene</a></h2><p><a href="https://codescene.com/">CodeScene</a> probably needs no introduction because I have written about it many times here. I am a big fan of <a href="https://se.linkedin.com/in/adam-tornhill-71759b48">Adam Tornhill</a>&#8216;s work, which to me is about two big things:</p><ul><li><p>A proprietary algorithm to calculate code health, that considers 20+ factors.</p></li><li><p>The &#8220;hotspot&#8221; approach, which looks at git history and suggests refactoring targets prioritizing files that are changed the most often.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-9Dp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-9Dp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 424w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 848w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-9Dp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png" width="1456" height="955" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:955,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1192160,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-9Dp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 424w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 848w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.png 1272w, https://substackcdn.com/image/fetch/$s_!-9Dp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52031750-52f6-4df1-95f0-5460d57455b5_2666x1748.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">It&#8217;s nice to see code dependencies and clusters at a glance</figcaption></figure></div><p>I integrate CodeScene as a hard gate in local hooks: new code can&#8217;t be committed if it&#8217;s not a 10/10. For modifying old code, the AI needs to follow the boy scout rule: leave the code better than it found it. So it measures the code health <em>before</em> touching the file, and <em>after</em>, and the score needs to be the same or higher.</p><p>After any commit that improves the overall codebase health, the AI also increases the thresholds, to create a positive flywheel.</p><p>After four months working like this, now the code has perfect health, and the <a href="https://github.com/refactoringhq/tolaria/blob/main/.codescene-thresholds">current threshold</a> is literally 10/10!</p><div><hr></div><h2>&#128274; Security and Quality &#8212; with <a href="https://codacy.com/">Codacy</a></h2><p><a href="https://codacy.com/">Codacy</a> works on code quality too, but from a different angle: rather than <em>scoring</em> files, it surfaces <strong>individual issues</strong>.</p><p>Issues come with severity levels and belong to various categories, like security, performance, compatibility, code being error prone, and more.</p><p>Codacy has an MCP that I use to steer my Codex locally, and to implement an actual blocking <em>gate </em>before it pushes any code. All new code has to be issue-free, and when touching old code, the AI also needs to fix existing problems, other than making the business changes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qe5H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qe5H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 424w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 848w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 1272w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!qe5H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png" width="1456" height="705" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:705,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139823,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qe5H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 424w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 848w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 1272w, https://substackcdn.com/image/fetch/$s_!qe5H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8652d69-8deb-4d24-8f91-8cba91703730_1954x946.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I am also working with the Codacy team on their new product <strong><a href="https://verity.md/tolaria">Verity</a> </strong>(you can join the <a href="https://verity.md/tolaria#pricing">beta for free here</a>), that aims to steer agents&#8217; work by creating a knowledge base of past decisions.</p><p>This is interesting to me because I do that with ADRs, and would love to create more reliable controls against code that violates them. Verity is promising about that, and should also track token efficiency and a bunch of process metrics that I am interested in improving over time.</p><div><hr></div><h2><span>&#9989; Validation &#8212; with </span><a href="https://circleci.com/">CircleCI</a></h2><p>A few months ago I made a change in how I run our test suite, creating local hooks with Husky so that AI agents can immediately see if controls fail, instead of waiting for the remote CI.</p><p>This was very effective at improving the agents&#8217; work, at the expense of completely hogging my machine every time. Some parts of the test suite are particularly heavy (e.g. playwright), and running them in local means the whole thing takes time &#8212; about 15 mins &#8212; and parallelizing things is out of question, because resources are not enough. It&#8217;s tricky to run even just 2 worktrees at the same time: things sometimes literally crash.</p><p>I talked with <a href="https://www.linkedin.com/in/robzuber/">Rob Zuber</a> from <a href="https://circleci.com/">CircleCI</a> about this, and they implemented a great solution: local hooks that are run remotely, in what they call <a href="https://circleci.com/blog/chunk-sidecars/">Chunk Sidecars</a>.</p><p>Sidecars are preconfigured environments that run alongside your local workflow, and validate changes as they happen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tPlB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tPlB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 424w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 848w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!tPlB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png" width="1456" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:834833,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tPlB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 424w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 848w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!tPlB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F448719bf-44ac-41a3-9a7f-a99230869258_2152x1300.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This allows to 1) free up your machine resources, and 2) make things faster by introducing real concurrency.</p><p>This way I have been able to reduce the suite run time <strong>from 15 to 4 mins</strong>, while also being able to spawn more worktrees safely. A massive win!</p><div><hr></div><h2>&#128214; Fetching knowledge &#8212; with <a href="https://getunblocked.com/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=tolaria">Unblocked</a></h2><p><a href="https://getunblocked.com/?utm_source=refactoring&amp;utm_medium=newsletter&amp;utm_campaign=tolaria">Unblocked</a> is a context engine: it takes information from several sources (e.g. Github, Notion, Slack, Datadog, ...) so you can ask questions about it.</p><p>I have known Dennis, Claire, and the team at Unblocked for a long time, but didn&#8217;t think of using it for Tolaria until just recently, because I thought that Unblocked would shine when you have <em>many</em> information sources, and we legitimately don&#8217;t have many.</p><p>I was wrong.</p><p>I plugged it about one month ago, connecting it to Github and Sentry. Sentry is useful to triangulate issues, but the Github connection would basically be worth by itself, because it indexes the code, the ADRs, and all the history of changes.</p><p>I have been asking questions about how we do this and that and checking side by side with Codex (which instead just greps and fetches things on the go) and the difference in speed and accuracy is just obvious.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4tT5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4tT5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 424w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 848w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 1272w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!4tT5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png" width="1456" height="948" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:948,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1335937,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/204247813?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4tT5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 424w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 848w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 1272w, https://substackcdn.com/image/fetch/$s_!4tT5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd7f01a1-c83f-4da2-a9a7-347a42429fbe_1856x1208.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even more importantly, Codex itself uses Unblocked via the MCP to understand past decisions and fetch relevant ADRs.</p><p>Big props to the Unblocked guys because this was an easy win and largely plug-and-play!</p><div><hr></div><h2>&#128301; What&#8217;s next</h2><p>Now that Tolaria has sustainable funding, I am going to invest even more on it. Again, I am exploring hiring a strong product engineer, so if you think you can be a good fit, feel free to reach out and say hi!</p><p>As for future work, the most important thing ahead is the <strong>mobile version</strong>.</p><p>I already have a working prototype for iPad, but there are still a lot of rough edges. Also, the iPad version is the easy part: for smartphones we need to completely reinvent the UI &#8212; I have been working on it &#128170;</p><div><hr></div><p>And that&#8217;s it for today! I wish you a great week</p><p><span>Sincerely &#128075;</span><br><span>Luca</span></p>]]></content:encoded></item><item><title><![CDATA[Acceleration whiplash 📉]]></title><description><![CDATA[Some thoughts on the recent industry research by Faros]]></description><link>https://refactoring.fm/p/acceleration-whiplash</link><guid isPermaLink="false">https://refactoring.fm/p/acceleration-whiplash</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 24 Jun 2026 07:42:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mw6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Hey! Luca here &#8212; welcome to a new edition of Refactoring.</span></p><p><span>To figure out what&#8217;s really happening in software engineering, I usually do three things:</span></p><ol><li><p><strong><span>I try things myself</span></strong><span> &#8212; recently by working on Tolaria.</span></p></li><li><p><strong><span>I speak with people who know better</span></strong><span> &#8212; on the podcast and in the community.</span></p></li><li><p><strong><span>I go through relevant research</span></strong><span> &#8212; to go big picture and get a grasp of the state of the industry.</span></p></li></ol><p><span>Good research is hard to find, but a few weeks ago I was sent a copy of </span><a href="https://fandf.co/3S1Vftn"><span>this report</span></a><span> by the guys at </span><a href="https://faros.ai/"><span>Faros</span></a><span> (thank you for that &#128591;), which was very interesting for two reasons:</span></p><ul><li><p><strong><span>Quantitatively</span></strong><span> &#8212; it&#8217;s one of the largest reports I have ever seen about AI coding: it surveyed 22K+ developers across 4K+ teams.</span></p></li><li><p><strong><span>Qualitatively</span></strong><span> &#8212; it&#8217;s very thorough. It doesn&#8217;t stop at measuring </span><em><span>activity</span></em><span>, but tries to understand the downstream impact of AI on all the stages of the SDLC.</span></p></li></ul><p><span>It also paints an interesting trajectory when compared with other similar works from the past months, like the State of Software Delivery, which we covered just recently, and DORA&#8217;s State of AI Assisted Development from the end of last year.</span></p><p><span>So today I will report and comment on the main findings, trying to interpret them and connect the dots with the other things I have been observing lately.</span></p><p><span>Here is the agenda, with my main takeaways:</span></p><ol><li><p><span>&#127937; </span><strong><span>Finishing work is hard</span></strong><span> &#8212; starting is now easy, and shipping is hard.</span></p></li><li><p><span>&#128269; </span><strong><span>Reviews are utterly broken</span></strong><span> &#8212; it&#8217;s now obvious that we need to do something about them.</span></p></li><li><p><span>&#128293; </span><strong><span>Poor quality is reaching prod</span></strong><span> </span><strong><span>(anyway)</span></strong><span> &#8212; production is suffering, big time.</span></p></li><li><p><span>&#129716; </span><strong><span>The way forward</span></strong><span> &#8212; some words of hope to close this on a high note!</span></p></li></ol><p><span>Let&#8217;s dive in!</span></p><div><hr></div><p><em><span>I want to thank the guys at </span><a href="https://faros.ai/"><span>Faros</span></a><span> for giving me preview access to these results and partnering on this. If you want to download the full report, you can find it below &#128071;</span></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fandf.co/3S1Vftn&quot;,&quot;text&quot;:&quot;Check out the full report&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fandf.co/3S1Vftn"><span>Check out the full report</span></a></p><div><hr></div><h2><span>&#127937; Finishing work is hard</span></h2><p><span>Before we get to the first idea, there is an important preamble to be made.</span></p><p><span>We have said many times that </span><strong><span>AI is an amplifier</span></strong><span>, and that the *average* numbers of these reports don&#8217;t say a lot because they mix up the good teams that are getting a lot out of AI, with the average/bad ones that are not getting anything, or sometimes even negative results.</span></p><p><span>Now, Faros literally opens the report by saying that </span><em><span>no</span></em><span> &#8212; </span><strong><span>this is not the case anymore</span></strong><span>:</span></p><blockquote><p><em><span>Across every downstream stage, the signal is the same: volume is up, quality is down, and the gap between the two is widening as adoption deepens. High-performing teams are experiencing the same downstream degradation as the median and average ones.</span></em></p></blockquote><p><span>Words of hope! But what does it mean that </span><strong><span>volume is up and quality is down</span></strong><span>?</span></p><p><span>If we look at software dev as a pipeline, this means three things:</span></p><ol><li><p><span>More work gets started, but</span></p></li><li><p><span>The amount of work that gets shipped is pretty much the same, and</span></p></li><li><p><span>The quality of such work is noticeably lower</span></p></li></ol><p><span>Let&#8217;s go through all of this, starting with the most important point to me: </span><strong><span>starting work is now easier, but finishing it is harder than ever</span></strong><span>.</span></p><p><span>In particular, developers do </span><em><span>more work</span></em><span> indeed, by virtue of working on more things at the same time:</span></p><ul><li><p><span>+67% PRs touched / day</span></p></li><li><p><span>+18% separate tasks</span></p></li><li><p><span>+33% tasks completed, as measured by opening a final PR about them.</span></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WVJu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WVJu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 424w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 848w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!WVJu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png" width="1456" height="642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1280258,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/202940735?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WVJu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 424w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 848w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 1272w, https://substackcdn.com/image/fetch/$s_!WVJu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe71d1d26-10aa-4985-b06d-046426af6a18_3052x1346.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>The problem is that such work doesn&#8217;t get to production just as fast. In fact, teams are noticeably </span><em><span>slower</span></em><span> at the last mile &#8212; shipping:</span></p><ul><li><p><span>+26% in-progress tasks stalled for 7+ days</span></p></li><li><p><span>+14% work </span><em><span>restarts</span></em><span> per developer (tasks returning in progress after moving to another stage)</span></p></li><li><p><span>-12% deployments per week</span></p></li></ul><p><span>Qualitatively this is the same trend that both the State of Software Delivery and the latest DORA report found, but </span><strong><span>quantitatively worse</span></strong><span>. In fact, the numbers about coding activity and those about deployment frequency are respectively better and worse than previous reports, pointing at even more polarization.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mw6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mw6_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 424w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 848w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!mw6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png" width="1456" height="845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:845,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:952629,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/202940735?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mw6_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 424w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 848w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!mw6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4ed021-d765-4269-ae24-2e7f529828f7_2394x1390.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>One of the most visible results of this trend is </span><strong><span>lead time</span></strong><span> skyrocketing to a +480%, fueled by an avg +80% waiting time between each of the pipeline steps.</span></p><p><span>This is not surprising if we remember that:</span></p><div class="callout-block" data-callout="true"><p><code>Lead Time = Work In Progress / Throughput</code></p></div><p><span>So if WIP grows and throughput stays the same, lead time is bound to grow. But why does the throughput stay the same? Where&#8217;s the bottleneck?</span></p><p><span>Enter the elephant in the room: </span><strong><span>code reviews</span></strong><span> &#128071;</span></p><div><hr></div><h2><span>&#128269; Reviews are completely broken</span></h2>
      <p>
          <a href="https://refactoring.fm/p/acceleration-whiplash">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to make AI better at product 🎨]]></title><description><![CDATA[Exploring ideas based on experiments and research.]]></description><link>https://refactoring.fm/p/how-to-make-ai-better-at-product</link><guid isPermaLink="false">https://refactoring.fm/p/how-to-make-ai-better-at-product</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 17 Jun 2026 07:43:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RY7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, <a href="https://refactoring.fm/about">Luca</a> here! Welcome to a &#10024; <strong>monthly free essay &#10024;</strong> from Refactoring!</em></p><p><em>Every week I write an article about how to ship fast and make good software, and interview a world-class tech leader. I also build and maintain <a href="https://tolaria.md/">Tolaria</a> in the open, publishing my workflows and learnings here.</em></p><div><hr></div><p>Last week, Claude Code&#8217;s Boris Cherny got trending on X for saying this at the annual Anthropic conference:</p><blockquote><p><em>I don&#8217;t prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. <strong>My job is to write loops</strong>. And this is transition we&#8217;re going to see for the rest of the year</em></p></blockquote><p>So, &#8220;my job is to write loops.&#8221;</p><p>Peter Steinberger (creator of OpenClaw) and several others picked up on it and agreed &#128071;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7v80!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7v80!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 424w, https://substackcdn.com/image/fetch/$s_!7v80!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 848w, https://substackcdn.com/image/fetch/$s_!7v80!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 1272w, https://substackcdn.com/image/fetch/$s_!7v80!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7v80!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png" width="1274" height="506" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e418c386-0fbd-4582-8e0b-555506855923_1274x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137937,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/202099950?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7v80!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 424w, https://substackcdn.com/image/fetch/$s_!7v80!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 848w, https://substackcdn.com/image/fetch/$s_!7v80!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 1272w, https://substackcdn.com/image/fetch/$s_!7v80!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe418c386-0fbd-4582-8e0b-555506855923_1274x506.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But before you roll your eyes and think here it goes another <em>fad</em>, new buzzwords, <em>loop engineering</em>, and so on, I&#8217;ll go out and say that I like this direction.</p><p><em>Loop engineering</em> looks strictly better than <em>prompt engineering</em> because it forces you into <strong>systems thinking</strong>, as opposed to just focusing on what&#8217;s needed to deliver the current task. A loop is supposed to run indefinitely, so the focus shifts to reliability, sustainability, and how to make sure things stay good &#8212; vs <em>diverge</em> and go to shit.</p><p>But how do you ensure that?</p><p>I wrote about this several times lately, including <a href="https://refactoring.fm/p/my-ai-coding-workflow-b09">last week</a>, where I covered how I steer AI work with the 3Gs: <em>guides</em>, <em>gates</em>, and <em>guards</em>. These are not super new concepts: they build on what other smart people are doing, and they are my attempt to contribute to this global conversation.</p><p>But a problem I find in this conversation (which I am guilty of) is that it largely <strong>focuses on the tech side</strong> of things, while treating other disciplines as second-class citizens.</p><p>Namely, <strong>product</strong>.</p><p>When you hear people saying that software dev is now a factory, and the bottleneck is your product taste, review, validation, etc, what they are implying is that they have no idea about how to scale those things. In the AI race, product is behind engineering &#8212; big time!</p><p>The last time we discussed this on Refactoring has been when we published <a href="https://refactoring.fm/p/the-state-of-product-development">The State of Product Development</a>, where we saw that only 9% of teams used AI to help product with specs (yay), vs 90%+ for coding. Since then I released Tolaria, started doing a lot of product dev myself, and tried a lot of different solutions and workflows to scale myself properly, both in tech and product.</p><p>So today I want to focus on product, taking pages from what works for <em>coding</em>, and exploring how we can make the same progress there.</p><p>To discuss this, I am also bringing in again <a href="https://www.linkedin.com/in/doug-peete-95230b">Doug Peete</a> from <a href="https://na2.hubs.ly/H068xQb0">Atono</a>, who has a privileged vantage point by working with thousands of product teams, and is <a href="https://na2.hubs.ly/H068xQs0">working actively</a> to fix this. We also talked a lot about AI &amp; product in our <a href="https://refactoring.fm/p/the-state-of-product-development-22a">recent podcast interview</a>.</p><p>So here is the agenda:</p><ul><li><p><strong>&#9876;&#65039; Product is harder than coding</strong> &#8212; an uncomfortable take we need to come to terms with.</p></li><li><p><strong>&#128203; Towards Product ADRs</strong> &#8212; building on a successful tech practice.</p></li><li><p><strong>&#128214; Glossary </strong>&#8212; a possible missing abstraction in how we develop product.</p></li><li><p><strong>&#128260; Product process</strong> &#8212; how to put everything together and work better with AI.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><p><em>Disclaimer: I am a fan of what <a href="https://na2.hubs.ly/H068xQb0">Atono</a> is building and I am grateful to have it as a partner on this piece. You should check it out!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://na2.hubs.ly/H068xQb0&quot;,&quot;text&quot;:&quot;Learn more about Atono&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://na2.hubs.ly/H068xQb0"><span>Learn more about Atono</span></a></p><p><em>However, I will only write my unbiased opinion about the practices and tools covered, Atono included.</em></p><div><hr></div><h2><strong>&#9876;&#65039; </strong>Why product is harder than coding</h2><p>Product is harder than coding, at least conceptually. I know this take will get many engineers angry, but think about it. For a product choice to be good, there is a lot to be taken into account:</p><ul><li><p><strong>&#128301; Strategy</strong><em> &#8212; </em>do customers want this? Do the <em>right</em> customers want this? How is this discoverable? Is this making things unnecessarily complex? How does it fit our business strategy?</p></li><li><p><strong>&#128300; Tactics</strong><em> </em>&#8212; where do we put this? what&#8217;s the right UX? does it need a shortcut? should this live in the right-click menu? ...</p></li></ul><p>A lot of these choices depend on aspects that we are not good at <em>codifying</em> into hard rules. It&#8217;s what we call <em>judgment</em> and <em>taste</em>.</p><p>Software engineering, on the other hand, is <em>structurally</em> easier, for two reasons:</p><ul><li><p>It&#8217;s <em>downstream</em> of product direction, so it has a narrower design space.</p></li><li><p>Its <em>deterministic</em> nature allows it to be tested for correctness and non-functional qualities (performance, cohesion/coupling, complexity) in a more reliable way than product.</p></li></ul><p>As a result, <em><strong>gates</strong></em><strong> for coding agents</strong> are effective at enforcing good code, even when they have relatively little context about product. Static analysis, TDD, code health tooling, are all devices that help AI agents write <em>good enough </em>code&#8212;granted, not the code that the most talented engineer on earth would write&#8212;but still passable for many situations.</p><p>So how do we make product a bit more like coding? To answer this question, I will take a page from the <em>least deterministic </em>part of my coding harness: ADRs.</p><div><hr></div><h2>&#127959;&#65039;<strong> </strong>ADRs</h2><p>As I have written many times, I instruct the AI to create <a href="https://adr.github.io/">ADRs</a> to store <strong>meaningful tech decisions</strong>. Each ADR has to include why that decision was made, what options were considered (and eventually discarded), and take care of <em>superseding</em> old ADRs about the same thing.</p><p>ADRs have been, so far, surprisingly successful. As I am writing this, Tolaria has 137 ADRs, and I see the AI using them all the time. It refers to them in specs, makes decisions that stay true to what exists, and reliably supersedes what&#8217;s not relevant anymore.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dJyV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dJyV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 424w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 848w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!dJyV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161176,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/202099950?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dJyV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 424w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 848w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!dJyV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea12949-334e-41d7-88a8-ec1b05eb5860_1898x1378.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So, as of today, for most features I am comfortable not giving a lot of (tech) design input, because I know AI will pick it up from past decisions. I still review new ADRs, but they are 95% good &#8212; I do it more for my personal curiosity than because it&#8217;s a good use of my time.</p><p>The ADR workflow is, interestingly, <strong>completely non-deterministic</strong>. It&#8217;s a way to <em>inject</em> good judgment into the AI not by creating rules, but by repeatedly showing how we have done things in the past.</p><p>This is why I am hopeful about doing something similar to product &#128071;</p><div><hr></div><h2><strong>&#128203; </strong>Towards Product ADRs</h2><p>If ADRs are for tech work, what&#8217;s the equivalent for product? Mimicking ADRs, a <em>Product Decision Record</em> might record:</p><ul><li><p><strong>&#128065;&#65039; Intent</strong> &#8212; what the user needs to accomplish.</p></li><li><p><strong>&#127912; Design</strong> &#8212; how we decided to do it.</p></li><li><p><strong>&#9878;&#65039; Tradeoffs</strong> &#8212; alternatives that have been discarded and why.</p></li></ul><p>If we roughly agree on this, the next question would be: what does actually deserve a PDR? To me, it&#8217;s any <strong>product decision we want to remember</strong> in case we meet a similar problem in the future. Anything genuinely <em>new</em> that we changed/added to the product, as opposed to reusing a proven pattern that we already understand well.</p><p>E.g. In Tolaria, I wouldn&#8217;t want to write a PDR to remember that we added &#8220;copy file link&#8221; as a right-click action to the current note &#8212; because there isn&#8217;t any novelty or interesting decision being made there.</p><p>Do PDRs map squarely to well-known product artifacts, like PRDs, Epics, or Stories? I don&#8217;t know about that either. Those other devices primarily exist to communicate <em>what</em> needs to be done. It&#8217;s great when they include more about the <em>why, </em>but it&#8217;s not clear to me whether e.g. a full PRD or user story should be stored as-is and work well as a PDR. Maybe!</p><p>The other reason why I tend to believe PDRs deserve a life on their own is that relevant <em>decisions</em> are largely <strong>independent of the size of the work</strong>. There might be a large Epic (e.g. integrating a new AI agent assistant into Tolaria) that doesn&#8217;t bring meaningful new product direction, and a small story that instead introduces new a interesting pattern.</p><p>Doug is experimenting with PDRs at Atono, calling them <a href="https://docs.atono.io/changelog#design-decisions-in-ai-context">design decisions</a> and attaching them directly to the stories they relate to &#8212; not as a separate doc for now. This doesn&#8217;t resolve the question of where a PDR lives when the decision is bigger than any single story, but looks good on the smaller end of the spectrum: when the decision is scoped to one piece of work, attaching it directly might hold up well in practice.</p><p>So, in general, even if there is a lot that we don&#8217;t know about their <em>shape</em>, we can agree that it&#8217;s valuable to record product decisions, in a similar way to what we do with architecture ones. And if we do, we should also agree that this is not enough &#128071;</p><div><hr></div><h2>&#128214; Product Glossary</h2><p>Other than ADRs, I maintain other tech docs in the Tolaria repo, which are called ARCHITECTURE.md and ABSTRACTIONS.md. Without getting into too much detail, these are <em><strong>recap</strong></em><strong> docs</strong>, that summarize the current state of our tech.</p><p>These are necessary, like views in a database, to avoid the AI to navigate eventually hundreds of ADRs (between those active and superseded) every time, just to <strong>reconstruct what exists</strong>. The recap docs give the AI the 10,000ft view, while individual ADRs are used to zoom into specific aspects.</p><p>What should this look like for product? Doug believes the right concept here is that of a <a href="https://na2.hubs.ly/H068xQs0">Glossary</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RY7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RY7P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 424w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 848w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!RY7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png" width="1456" height="1051" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1051,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247464,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/202099950?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RY7P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 424w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 848w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!RY7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d20d91-ec83-43b2-bbd8-23155b8f008f_1914x1382.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Glossary should list your main product abstractions: why they exist, what they are for, and how they are used. It maps your <em>domain language</em>, which in turn is shaped by your product surface.</p><p>An example from Tolaria may include concepts like:</p><ul><li><p><strong>The Sidebar</strong> &#8212; which gives users ways to <em>filter</em> notes in their workspace</p></li><li><p><strong>The Note List</strong> &#8212; to make users navigate the current selection of notes</p></li><li><p><strong>The Breadcrumb Bar</strong> &#8212; to display the most important actions a user can do over the current note.</p></li></ul><p>But also concepts that don&#8217;t map 1:1 to single interface elements, like the <strong>Git integration</strong>, or the <strong>Note organization workflow</strong> (capture / organize / archive).</p><p>It&#8217;s obvious these are not PDR candidates: they are long-lived abstractions that morph over time, and need a description that evolves with them. So, if anything, they are <em>derived</em> from a sum of product decisions.</p><p>Doug believes a shared glossary is the cornerstone that enables good <strong>AI-assisted stories and PRDs </strong>&#8212; because now the AI can ground them in your vocabulary, your past choices, and what exists. And he has data to back this up.</p><p>By talking with some of the teams we surveyed, which report <a href="https://refactoring.fm/i/190368764/ai-in-the-workflow">abysmal low AI adoption</a> for product specs (9%), it turns out a major cause is the amount of <em>rework</em> needed by generic AI specs. Making them good is just too much work, so most PMs keep writing specs manually. Doug and Atono have been testing glossary-backed AI stories internally and with customers, and they are seeing rework dropping from 60% to 20%.</p><p>(worth noting that 60% rework, as a baseline, is a ton. What if coding agents got things wrong 6 times out of 10? We would probably give up on them, which is what many PMs do with AI right now)</p><p>So the overall goal is to build foundational product knowledge: a map of what things mean in this specific product, which is not the same thing as a list of features.</p><p>So let&#8217;s say we have all of this in place, what does a new product process look like?</p><div><hr></div><h2>&#128260; Product process</h2><p>Any product work starts with <strong>capturing some </strong><em><strong>intent</strong></em> &#8212; what the user needs to accomplish, how it maps to the product strategy, how we know this is successful, and so on.</p><p>This is 100% human (for now!) and is more about the <em>why</em> than the <em>what</em>.</p><p>Our input on the <em>what</em> can progressively shrink the more we help the AI figure out good (draft?) specs that respect the current product surface (glossary + PDRs).</p><p>Then, based on the feature, the maturity level of your process, and how greedy vs safe you want it to be, you may either:</p><ul><li><p>Have the AI do a first pass, so that your judgement is informed by an actual prototype, or</p></li><li><p>Stop and tweak the draft spec before the AI goes forward.</p></li></ul><p>Then you review and iterate on implementation as long as needed, and finally <em>ship, </em>possibly including new PDRs and Glossary updates.</p><p>Over the next weeks I will try to incorporate some of this into the Tolaria workflow, possibly <em>retrofitting </em>some PDRs and glossary concepts from the past. Will let you know how it works!</p><div><hr></div><p>And that&#8217;s it for today! I wish you a great week</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[My AI Coding Workflow]]></title><description><![CDATA[Monthly update &#8212; as of June 2026!]]></description><link>https://refactoring.fm/p/my-ai-coding-workflow-b09</link><guid isPermaLink="false">https://refactoring.fm/p/my-ai-coding-workflow-b09</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 03 Jun 2026 07:02:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ba3740b9-b1f0-462d-8744-8cd1d81d6a81_1714x1138.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, <a href="https://refactoring.fm/about">Luca</a> here! Welcome to a </em>&#128274;<em> <strong>weekly essay</strong> </em>&#128274;<em> from Refactoring.</em></p><p><em>Every week I <a href="https://refactoring.fm/s/essays?sort=top">write an article</a> about how to ship fast and make good software, and <a href="https://refactoring.fm/podcast">interview a world-class tech leader</a>. I also build and maintain <a href="https://refactoring.fm/p/introducing-tolaria">Tolaria</a> in the open, publishing my workflows and learnings here.</em></p><p><em>Refactoring is read every week by 170,000+ engineers and managers from all over the world</em>!</p><div><hr></div><p>Hey! When I launched <a href="http://tolaria.md/">Tolaria</a> I promised I would publish ~monthly updates to my AI coding workflow. The last one was in April, so I am late!</p><p>In May I also published <a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">how I run Tolaria</a> as a project, but this was more about general <em>orchestration</em>, so I wanted to post an update that is more <strong>specific to coding</strong>.</p><p>I will start by saying that things are going... well.</p><p>Tolaria by now has a few thousands daily users, most whom are engineers. These are quite eager to report bugs, submit PRs, and suggest improvements on social media, Github discussions, email, and more &#8212; so keeping up with everything is quite a lot of work.</p><p>Still, I am happy with where we stand. As I write these, we got:</p><ul><li><p><strong>6 open issues</strong> &#8212; vs 417 closed.</p></li><li><p><strong>14 open PRs</strong> &#8212; vs 306 closed.</p></li><li><p><strong>1 day</strong> &#8212; average bug fix time.</p></li><li><p><strong>99.1% crash-free rate</strong> &#8212; as measured by Sentry.</p></li><li><p><strong>~28 commits / day</strong> &#8212; on average.</p></li><li><p><strong>2 hours a day</strong> &#8212; I work on Tolaria, give or take.</p></li></ul><p>I released Tolaria on April 22nd, so all of this happened in little more than a month, which is crazy when you think about it. From the day of the release, I added about ~1000 commits, and the codebase has grown a bit, but not massively: right now it&#8217;s 150K LOC, plus ~100K LOC of tests.</p><p>Most importantly, I don&#8217;t feel my velocity has decreased.</p><p>If anything, I am probably producing <em>more</em> output per unit of input than two months ago, so the <em>effectiveness</em> feels higher. Code quality also is higher, we are not drowning in regressions, and the rate at which bugs are reported feels stable.</p><p>So today I will cover the tweaks I made to my AI coding over the last ~2 months. To catch up with the full process, you can also go back to the previous articles here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;f62f1d1d-e7dc-4568-95ed-bf5c8080350a&quot;,&quot;caption&quot;:&quot;I admit I was one of those who didn&#8217;t believe Dario Amodei when he said last year that AI would soon write 90% of the code. Instead here we are. There are indeed teams I personally know who are having close to all of their code written by AI, and are having the time of their lives.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;My AI Coding Workflow&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:6835984,&quot;name&quot;:&quot;Luca Rossi&quot;,&quot;bio&quot;:&quot;I write everyday about how to make great software and work well with humans, to 60K+ friends.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6107486-b701-4109-8f21-f450fed6e277_652x690.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:1000}],&quot;post_date&quot;:&quot;2026-02-25T08:25:55.941Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b48c3e1-3c66-4975-8ec5-44d399f73dc2_2238x1490.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://refactoring.fm/p/my-ai-coding-workflow&quot;,&quot;section_name&quot;:&quot;&#129525; Essays&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:189024124,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:111,&quot;comment_count&quot;:13,&quot;publication_id&quot;:64099,&quot;publication_name&quot;:&quot;Refactoring&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!CR5A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;920af905-2609-4c4e-a224-fc49e4aface4&quot;,&quot;caption&quot;:&quot;About a month ago I wrote an article about my AI coding workflow, and it instantly became the most popular Refactoring article of all time.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Updates to my AI Coding Workflow&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:6835984,&quot;name&quot;:&quot;Luca Rossi&quot;,&quot;bio&quot;:&quot;I write everyday about how to make great software and work well with humans, to 60K+ friends.&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6107486-b701-4109-8f21-f450fed6e277_652x690.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:1000}],&quot;post_date&quot;:&quot;2026-04-08T07:12:58.916Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c31c0da-a80c-463b-8804-c108402a8d19_1200x800.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://refactoring.fm/p/updates-to-my-ai-coding-workflow&quot;,&quot;section_name&quot;:&quot;&#129525; Essays&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:193368488,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:57,&quot;comment_count&quot;:6,&quot;publication_id&quot;:64099,&quot;publication_name&quot;:&quot;Refactoring&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!CR5A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b19138f-e653-496f-a117-a85305715dba_400x400.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Here is the agenda for today:</p><ol><li><p>&#128677; <strong>Guides, Gates, and Guards</strong> &#8212; my mental model for the various types of AI instructions. The core of the article.</p></li><li><p>&#129302; <strong>From Claude to Codex</strong> &#8212; I moved to Codex and (for now) I am not going back.</p></li><li><p>&#128184; <strong>How much I am spending</strong> &#8212; monthly cost is now down &gt;90%</p></li><li><p>&#128301; <strong>What&#8217;s next / missing</strong> &#8212; what I am trying to improve right now</p></li></ol><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128677; Guides, Gates and Guards</h2><p>When it comes to the dev process, I think about the types of <em>inputs</em> that I can give to AI in three steps:</p><ol><li><p>&#8618;&#65039; <strong>Guides </strong>&#8212; rules and explainers of how to do things.</p></li><li><p>&#128260; <strong>Gates </strong>&#8212; deterministic checks that <em>block</em> bad things and force the AI to steer its output.</p></li><li><p>&#8617;&#65039; <strong>Guards </strong>&#8212; <em>fallback</em> procedures to improve what falls through the cracks.</p></li></ol><p>These steps are also somewhat sequential:</p><ul><li><p>Guides are the basic context that the AI uses to start the work</p></li><li><p>Gates get into play to steer the work while it&#8217;s in progress</p></li><li><p>Guards are the last line of defense against enshittification.</p></li></ul><p>Let&#8217;s look at all of them:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JuRD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JuRD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 424w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 848w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 1272w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!JuRD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png" width="1456" height="699" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:699,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94481,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/200102476?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JuRD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 424w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 848w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 1272w, https://substackcdn.com/image/fetch/$s_!JuRD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79146243-97aa-45f3-b970-6a58364edeb2_1708x820.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>1) Guides &#8618;&#65039;</h3><p>We can as well call them <em>rules</em>, but then we&#8217;d lose the 3G&#8217;s memorability!</p><p>These days you write guides for AI agents in two main ways:</p><ul><li><p><strong>AGENTS.md / CLAUDE.md </strong>&#8212; the core instructions that the agent <em>always</em> loads.</p></li><li><p><strong>Skills</strong> &#8212; specific instructions to do particular tasks. A skill gets <em>used </em>only when the task requires it.</p></li></ul><p>It&#8217;s worth noting that the <em>boundaries</em> between the two surfaces are not very clear. It&#8217;s often dubious whether you should create a separate skill or just slam everything into the AGENTS.md, and even benchmarks are inconclusive about the effectiveness of the various strategies.</p><p>I believe that&#8217;s because, at their core, they are the same thing: <strong>instructions</strong> to the agent.</p><p>My dev process is simple enough that I can afford to keep everything into the AGENTS.md, and not use any specific skill. I have tried a few and never felt things got noticeably better, so I opted for keeping things simple.</p><p>You can inspect the actual <a href="https://github.com/refactoringhq/tolaria/blob/main/AGENTS.md">file</a> &#8212; it&#8217;s not perfect, mind you, but gives you a more precise idea.</p><p>In my AGENTS.md, the most important instructions are about:</p><ul><li><p><strong>TDD </strong>&#8212; the agents has to write tests first and do the classic red &#8594; green &#8594; refactor.</p></li><li><p><strong>Boy scout rule</strong> &#8212; leave the code in a better shape than you found it. It should also measure the before/after quantitatively with CodeScene and Codacy.</p></li><li><p><strong>UI </strong>&#8212; always use shadcn/ui components when possible, and inspect our design language before implementing new UI (we got basic tokens for colors, typography, spacing, etc).</p></li><li><p><strong>Localization </strong>&#8212; extract and translate all the new strings in the supported languages. I use the <a href="https://laratranslate.com/about-lara?utm_term=lara%20translate&amp;utm_campaign=LARA+SEM+-+Brand&amp;utm_source=adwords&amp;utm_medium=ppc&amp;hsa_acc=4328324064&amp;hsa_cam=21903987592&amp;hsa_grp=170296292597&amp;hsa_ad=720960573760&amp;hsa_src=g&amp;hsa_tgt=kwd-2376217352548&amp;hsa_kw=lara%20translate&amp;hsa_mt=e&amp;hsa_net=adwords&amp;hsa_ver=3&amp;gad_source=1&amp;gad_campaignid=21903987592&amp;gbraid=0AAAAAohNJ6REfuYwwEVIav_w_li-_XboQ&amp;gclid=Cj0KCQjw2_TQBhCnARIsAF3-XhyyKQUq2sjYWJ6YdEl9XlOnk4BVQxxvTD-setBqq7cYgE_-emZFfxIaAl93EALw_wcB">Lara</a> CLI for this.</p></li></ul>
      <p>
          <a href="https://refactoring.fm/p/my-ai-coding-workflow-b09">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Insights from our first AI Club 🪄]]></title><description><![CDATA[Five stories from real-world engineering leaders]]></description><link>https://refactoring.fm/p/insights-from-our-first-ai-club</link><guid isPermaLink="false">https://refactoring.fm/p/insights-from-our-first-ai-club</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 27 May 2026 07:02:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!agkJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, <a href="https://refactoring.fm/about">Luca</a> here! Welcome to a </em>&#128274;<em> <strong>weekly essay</strong> </em>&#128274;<em> from Refactoring.</em></p><p><em>Every week I <a href="https://refactoring.fm/s/essays?sort=top">write an article</a> about how to ship fast and make good software, and <a href="https://refactoring.fm/podcast">interview a world-class tech leader</a>. I also build and maintain <a href="https://refactoring.fm/p/introducing-tolaria">Tolaria</a> in the open, publishing my workflows and learnings here.</em></p><p><em>Refactoring is read every week by 170,000+ engineers and managers from all over the world</em>!</p><div><hr></div><p>Two weeks ago we came together in the Refactoring Community for our very first monthly <strong><a href="https://refactoring.fm/p/introducing-the-ai-club">AI Club</a> </strong>session!</p><p>More than 30 people joined, and 5 volunteered to share recent learnings about using AI at work. Then everyone got the opportunity to ask questions and build on their ideas.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!agkJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!agkJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 424w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 848w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 1272w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!agkJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png" width="1080" height="386" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:386,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1042610,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/199175726?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!agkJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 424w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 848w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.png 1272w, https://substackcdn.com/image/fetch/$s_!agkJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b14ea68-9d64-4e6f-9f68-8bc37edf277a_1080x386.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">A partial screenshot of the group call for our first AI Club!</figcaption></figure></div><p>In this edition I will post a recap of the awesome ideas that were shared!</p><ol><li><p>&#128668; <strong>The &#8220;combine harvester&#8221; pattern for long AI tasks</strong></p></li><li><p>&#127769; <strong>Overnight procedures that catch what rules can&#8217;t enforce</strong></p></li><li><p>&#128211; <strong>A daily rhythm for noticing what we&#8217;re learning</strong></p></li><li><p>&#127915; <strong>Using AI to make sense of messy stakeholder tickets</strong></p></li><li><p>&#128256; <strong>Staged automation of a complex upstream merge</strong></p></li></ol><p>Let&#8217;s dive in!</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5SP_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5SP_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 424w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 848w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 1272w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!5SP_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp" width="1456" height="490" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:490,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74296,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/199175726?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5SP_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 424w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 848w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 1272w, https://substackcdn.com/image/fetch/$s_!5SP_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68cd32b-57c4-44ae-b811-52f28b7dea74_1456x490.webp 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The AI Club is run monthly and facilitated by professional coaches. It is exclusive for paid members of Refactoring, who get access to our private community.</em></p><p><em>Get the full version of Refactoring to join the next AI Club, on <strong>Jun 5th</strong>!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://refactoring.fm/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>1) &#128668; The <em>combine harvester</em> pattern for long AI tasks</h2><p><strong><a href="https://www.linkedin.com/in/vektor/">Matej Vitasek</a></strong>, CTO, shared how he has been successful at having agents run through long, multi-hour tasks, by having them <strong>maintain their state in a markdown file</strong> that gets updated as the task goes on.</p><p>The markdown file holds:</p><ul><li><p>The instructions</p></li><li><p>The progress so far</p></li><li><p>What should happen next</p></li></ul><p>As the task evolves, the file evolves too. You can also make the agent stop after a batch of work, reflect on what could have been done better, and update the process before continuing.</p><p>The benefit, as Matej described it, is that the work doesn&#8217;t have to happen in one sitting. </p><p>Anyone can pick the task back up at a later time and the agent can resume from the markdown file rather than starting over or losing context. For tasks that are too big to fit in a single session &#8212; or that you want to step away from and come back to &#8212; the markdown becomes a simple working memory.</p><p>It&#8217;s a small, low-tech pattern, but it works and it&#8217;s portable across multiple models and agents.</p><div><hr></div><h2>2) &#127769; Overnight procedures to catch what rules can&#8217;t enforce</h2><p>I personally shared something that is working well for me and I don&#8217;t see talked about often: running daily, often overnight, procedures that look back at what happened during the day and try to catch judgment-based things that wouldn&#8217;t have been picked up by rules in the moment.</p><p>I call these <strong>guards</strong>.</p><p>My starting point is&#8212;I believe&#8212;the same as everyone: I write rules in the AGENTS.md / CLAUDE.md file, and try to enforce some things via CI and hooks: test coverage, static analysis, code health, and so on.</p><p>But there are things that are hard to gate:</p><ul><li><p><em>Did this change need an architecture decision record?</em></p></li><li><p><em>Has an opportunity to refactor been missed?</em></p></li><li><p><em>Is performance drifting over time?</em></p></li></ul><p>These are judgment calls, and agents will sometimes ignore rules about them, or simply make mistakes.</p><p>So I have set up various procedures that run once a day, each focused on a specific concern. Like, in the cases above:</p>
      <p>
          <a href="https://refactoring.fm/p/insights-from-our-first-ai-club">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>