<?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>Wed, 29 Jul 2026 01:05: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[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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So, 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>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"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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="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="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>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><item><title><![CDATA[Introducing Portent ☘️]]></title><description><![CDATA[An open spec for knowledge bases, for work and life.]]></description><link>https://refactoring.fm/p/introducing-portent</link><guid isPermaLink="false">https://refactoring.fm/p/introducing-portent</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 20 May 2026 07:44:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0fCQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today it&#8217;s almost one month since I released <a href="http://tolaria.md/">Tolaria</a>, and during this time I have spoken with many people and teams that are trying to use it to create and manage internal knowledge bases.</p><p>During these chats, the most recurring questions I receive are not about the tool itself, but about <strong>how to organize information</strong>.</p><p>People understand the tool: types, relationships, views, etc &#8212; but are not sure about what types to create, how to connect them together, and what the regular maintenance of all of this looks like.</p><p>To help with this, today I am introducing <strong><a href="http://portent.md/">Portent</a></strong> &#8212; an open spec for organizing knowledge bases, for work and life.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0fCQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0fCQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 424w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 848w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 1272w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0fCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png" width="1456" height="771" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3096792,&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/198376374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.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_!0fCQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 424w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 848w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 1272w, https://substackcdn.com/image/fetch/$s_!0fCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6679e5f1-651b-43e1-b21e-d2bb636e3455_3112x1648.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Brand new website on <a href="http://portent.md/">portent.md</a>!</figcaption></figure></div><p>Portent provides strong defaults for the three key aspects of a knowledge base:</p><ul><li><p><strong>Structures</strong> &#8212; how information is organized into different buckets, whether it&#8217;s types, folders, or else.</p></li><li><p><strong>Relationships </strong>&#8212; how such structures are connected and related to one another.</p></li><li><p><strong>Lifecycle </strong>&#8212; how information flows and is operated.</p></li></ul><p>Portent was built with a few goals in mind:</p><ul><li><p><strong>Convention over configuration</strong> &#8212; Portent is like the Rails of knowledge bases. Gives you sane defaults, but keeps you free to extend / change whatever you like.</p></li><li><p><strong>Usable with any tool</strong> &#8212; while Portent concepts are first-class citizens in Tolaria, they can be easily implemented in any knowledge mgmt tool.</p></li><li><p><strong>Combine life and work</strong> &#8212; create knowledge bases that <em>blend</em> personal and work data, over the same underlying type system.</p></li><li><p><strong>Flexible and extensible</strong> &#8212; Portent is easy to change and extend, and does not corner users into rigid schemas.</p></li></ul><p>So let&#8217;s dive into this. Here is the agenda:</p><ul><li><p>&#128214; <strong>Backstory</strong> &#8212; or why you should trust me on this</p></li><li><p>&#127857; <strong>Types</strong> &#8212; the eight main types</p></li><li><p>&#128256; <strong>Relationships</strong> &#8212; for knowledge, think graph instead of relational</p></li><li><p>&#128260; <strong>Lifecycle</strong> &#8212; capture &#8594; organize &#8594; archive</p></li><li><p>&#128268; <strong>Extending Portent</strong> &#8212; how to add more things, and what you may add.</p></li><li><p>&#128296; <strong>Tolaria implementation</strong> &#8212; how to do this in Tolaria. Spoiler: there is a template.</p></li></ul><div><hr></div><blockquote><p><em>Quick heads up! On June 2nd and 3rd I will be at <strong><a href="https://leaddev.com/leaddev-london/">LDX3 in London</a></strong>, where I will interview the one and only <a href="https://www.google.com/search?q=michael+lopp">Rands</a>, live on stage.</em></p><p><em>I love LeadDev conferences and I go every year. If you are thinking of coming, you can <strong><a href="https://leaddev.com/leaddev-london/">use the code</a></strong><a href="https://leaddev.com/leaddev-london/"> </a><strong><a href="https://leaddev.com/leaddev-london/">LUCA15</a></strong> to get 15% off the tickets! No affiliation &#8212; I don&#8217;t get any money from this.</em></p><p><em>Hope to see many friends there and say hi!</em></p></blockquote><div><hr></div><h2>&#128249; Walkthrough</h2><p>If you prefer watching instead of reading, here is my walkthrough of the <a href="https://github.com/refactoringhq/portent-vault-template">Portent template</a> &#128071;</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;0d72cdb8-ffa6-4cf4-b252-7ca51b247eee&quot;,&quot;duration&quot;:null}"></div><div><hr></div><h2>&#128214; Backstory</h2><p>Portent is the result of many years of work, and, just like with Tolaria, it feels that a lot of what I have done in my life has led to this:</p><ul><li><p><strong>2011: PhD</strong> &#8212; in 2011 I started a PhD to study non-relational databases and how their data models could be mapped one onto another. That started my obsession with organizing information. I later dropped out of my PhD to start a startup &#128071;</p></li><li><p><strong>2017: Startup </strong>&#8212; we had one of the very first Notion workspaces in Italy, back in 2017. As CTO I created templates about how to organize work that were later adopted by many others, and personally coached several startups about how to organize work.</p></li><li><p><strong>2020: Building a Second Brain</strong> &#8212; in 2020 I got in touch with the ideas from Tiago Forte, Sonke Ahrens, all the personal knowledge management <em>literature</em>, and started trying to take the best of it and applying to actual <em>work </em>knowledge.</p></li><li><p><strong>2021: Refactoring </strong>&#8212; my creator work <em>stressed</em> these ideas to the limit and led to a substantial revision to allow 1) more productivity (write 3 newsletters / week), and 2) blend of personal and work data.</p></li><li><p><strong>2025: AI &amp; Tolaria </strong>&#8212; as I started working on Tolaria, I further revised how these concepts could be mapped cleanly into Types and Relationships, and optimized for AI collaboration.</p></li></ul><p>So I am very opinionated about all of this, but I am also wary that this is a very personal topic, so any system should be:</p><ul><li><p><strong>Small</strong> &#8212; only include what I am 100% sure it&#8217;s good, and not more.</p></li><li><p><strong>Flexible</strong> &#8212; to accommodate for personal tweaks and preferences.</p></li></ul><p>The best analogy I can find is that Portent is like <strong>Rails for knowledge bases</strong>: turnkey if you want to, but infinitely customizable if you want to get your hands dirty.</p><div><hr></div><h2>&#127857; Types</h2><p>Portent recommends organizing data into eight main types:</p><ol><li><p><strong>Projects</strong></p></li><li><p><strong>Operations</strong></p></li><li><p><strong>Responsibilities</strong></p></li><li><p><strong>Tasks</strong></p></li><li><p><strong>Events</strong></p></li><li><p><strong>Notes</strong></p></li><li><p><strong>Topics</strong></p></li><li><p><strong>People</strong></p></li></ol><p>The name Portent itself is an acronym for the first seven types. Plus there&#8217;s <em>people</em> at the end, so it&#8217;s technically <em>PORTENTP</em> &#8212; but bear with me!</p><p>These types are grouped into two clean categories:</p><ul><li><p><strong>PORT</strong> &#8212; the <strong>actionable</strong> types: <em>Projects</em>, <em>Operations</em>, <em>Responsibilities</em>, <em>Tasks</em>.</p></li><li><p><strong>ENT(P)</strong> &#8212; the <strong>non-actionable</strong> types: <em>Events</em>, <em>Notes</em>, <em>Topics</em>, <em>People</em>.</p></li></ul><p>PORT organizes <em>things to do</em>, while ENTP organizes <em>inert</em>, non-actionable things.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vTzN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vTzN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 424w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 848w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 1272w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vTzN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png" width="1456" height="731" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:731,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111835,&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/198376374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.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_!vTzN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 424w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 848w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 1272w, https://substackcdn.com/image/fetch/$s_!vTzN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27a48a2c-0aa1-473e-9807-defd6039ad71_1590x798.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">PORT and ENTP are the two big type groups in PORTENT</figcaption></figure></div><h2>&#128293; PORT</h2><p>PORT is <em>by far</em> the most important part of Portent. I believe the best way to organize a piece of information is downstream of asking: <strong>what should I do with it?</strong></p><p>You are going to ask yourself this question <em>all the time</em>, so in order to give good answers, you need a good way to organize things to do. And when I say &#8220;things to do&#8221; it&#8217;s not necessarily work &#8212; it&#8217;s also personal life. The mental model is the same.</p><p>The most useful way I have found to categorize work is to do so along two axes:</p><ul><li><p>&#128207; <strong>Size</strong> &#8212; whether work can be completed in one sitting or not.</p></li><li><p>&#128260;<strong> Recurrence</strong> &#8212; whether work is one-and-done, or recurring.</p></li></ul><p>Based on this, we can have four types of 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_!3zHB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3zHB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 424w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 848w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 1272w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3zHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png" width="1456" height="862" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:862,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135589,&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/198376374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.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_!3zHB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 424w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 848w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 1272w, https://substackcdn.com/image/fetch/$s_!3zHB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d7e29-f069-4722-b425-f07a52f05aae_2010x1190.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">You can organize anything you need to do based on size and recurrence</figcaption></figure></div><h3>Responsibilities</h3><p>Responsibilities are recurring work that can&#8217;t be completed in one sitting.</p><p>They are good for modeling long-running <em>areas</em> for which you need to keep a standard.</p><p>Responsibilities don&#8217;t usually have fixed <em>goals,</em> because they are long-running &#8212; they rather have metrics or KPIs that tell you you are going in the right direction.</p><p>Examples: &#8220;stay in good shape&#8221;, or &#8220;ensure good product retention&#8221;.</p><h3>Projects</h3><p>Projects are one-and-done work that can&#8217;t be completed in one sitting. They have a beginning and an end, and a clear definition of done.</p><p>They can <em>belong to</em> a responsibility. E.g. if your &#8220;ensure good product retention&#8221; responsibility measures the NPS of your product, a quarter project might be about a beloved feature that people have been asking since forever, that is expected to improve that.</p><p>Or if you measure &#8220;stay in good shape&#8221; with your VO2 max, a quarter project might be to start playing Padel twice a week, and get your VO2 max from X to Y.</p><h3>Operations</h3><p>Operations are recurring work that <em>can</em> be completed in one sitting. They are <em>procedures</em> that are repeated always the same way, for which there is ideally a set of instructions.</p><p>Operations can <em>belong to</em> Responsibilities and Projects. E.g. in your &#8220;stay in good shape&#8221; responsibility, you might have an operation that describes your weight-lifting routine.</p><p>Or for a Project that is about a new product feature, you might have an Operation for the &#8220;Weekly Review&#8221; of how the development is going.</p><p>Operations are also, as of today, the biggest surface of collaboration with AI agents. Agents deliver a ton of value by <em>owning</em> procedures, that is, performing the same set of actions on a recurring basis.</p><h3>Tasks</h3><p>Tasks are one-and-done work that can be completed in one sitting. These are important to be defined this way and to be included in the general framework, but I actually do not encourage storing them in the knowledge base.</p><p>I am not completely against it either, but I generally believe tasks are better suited to being managed by a dedicated separate tool. For two reasons:</p><ul><li><p><strong>Ephemeral</strong> &#8212; once a task is done, there is no big value in keeping it in the base. Any learning coming from the task should be stored in a separate note anyway.</p></li><li><p><strong>Specialized </strong>&#8212; tasks often require specialized interaction: due dates, status, kanban boards &#8212; all things that are better served by dedicated tools.</p></li></ul><p>So yeah, it&#8217;s not bad to store tasks in a Portent base per se, but you are probably not going to get a lot out of it either.</p><div><hr></div><h2>&#127793; ENTP</h2><p>ENTP types are for information that doesn&#8217;t need action. Litmus test is: if it needs a <em>status</em>, it&#8217;s probably a PORT, otherwise, it&#8217;s an ENTP.</p><p>Let&#8217;s look at them one by one:</p><h3>Topics</h3><p>Topics are <em>categories</em> that have no expectations of action. They are simply topics of interest, that may or may not be useful in the future.</p><p>E.g. I like sim racing, and I often save links with gear or tutorials, but I have no projects or responsibilities about it, so it&#8217;s just a topic for me.</p><p>Or, at work, I may want to save useful resources about <em>databases</em>, but it&#8217;s not like I have a <em>responsibility</em> about that. Could just be useful in the future, so I create notes and set them as related to the databases topic.</p><h3>Events</h3><p>Events are things that <em>happen</em>. They are useful for mapping meetings, achievements, and calendar things.</p><h3>People</h3><p>People are pretty self-explanatory. You can attach people to pretty much any of the types above, and when done well, it&#8217;s like building a CRM.</p><h3>Notes</h3><p>Finally, Note is simply the <em>default</em> type. When you create a new item, it&#8217;s a Note first &#8212; and it stays so in absence of a better type for it. </p><p>Now, once you have the types in place, how do you connect them together?</p><div><hr></div><h2>&#128256; Relationships</h2><p>I believe the best way to model information relationships in a knowledge base is via a very small set of <strong>graph-style </strong>connections.</p><p>Portent encourages two in particular:</p><ul><li><p><strong>Belongs to</strong> &#8212; <em>strong </em>relationship: owner, composition, usually in a one-to-many fashion.</p></li><li><p><strong>Related to</strong> &#8212; <em>weak</em> relationship: many-to-many, does not demand action.</p></li></ul><p>Based on how you implement these, you can also compute the inverted versions, whose default names in Portent are:</p><ul><li><p>Belongs to &#8594; <em>Has</em>, or <em>Children</em></p></li><li><p>Related to &#8594; <em>Referred By</em></p></li></ul><p>The way you assign these relationships is up to you, but I have found that a good default mental model is:</p><ul><li><p>Use <strong>belongs to</strong> for relationships <em>towards </em>or <em>between</em> PORT items &#8212; e.g. an Operation <em>belongs to</em> a broader Responsibility<em>, </em>a meeting (Event) or a Note <em>belongs to</em> a Project.   </p></li><li><p>Use <strong>related to</strong> for relationships between ENTP items &#8212; e.g. an Event is <em>related to</em> a Person<em>, </em>a Note is <em>related to</em> a Topic, and so on.</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_!F9BU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F9BU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 424w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 848w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F9BU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156984,&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/198376374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.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_!F9BU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 424w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 848w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 1272w, https://substackcdn.com/image/fetch/$s_!F9BU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d7f58e-9760-4550-a2a5-27afca7721db_1734x1052.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">PORT items tend to express ownership / composition, while ENTP express relatedness</figcaption></figure></div><p>An important upside of a relationships (and not only type) system, is that relationships stay the same across the whole knowledge base.</p><p>To understand why this matters, let&#8217;s look at alternative ways to model relationships, via the two most common ways: relational databases (tabular data), and folders (hierarchical data).</p><h3>1) Relational DBs (tabular data)</h3><p>In a relational model, like Postgres, or Notion databases, you need to define explicit relationships between each couple of tables you want to connect.</p><p>These relationships create a schema that is:</p><ul><li><p><strong>Big</strong> &#8212; you end up recreating the same concepts across tables even if they semantically mean the same thing, and</p></li><li><p><strong>Rigid</strong> &#8212; enforced and hard to change once data is in place.</p></li></ul><p>The upside is that data always stays strongly consistent and adherent to the schema.</p><h3>2) Folders (hierarchical data)</h3><p>With folders, every item (folder or note) can only <em>belong </em>to one folder. This massively limits the semantics that you can express via folder structures, which basically can only model strong, <em>exclusive ownership</em> relationships.</p><p>E.g. if you want meeting notes to sit in a &#8220;meeting notes&#8221; folder but also be included in the respective project folders, you can&#8217;t.</p><p>The upside of folders is that they make traversal extremely easy &#8212; as long as it&#8217;s done along the intended path.</p><h3>3) Graph relationships</h3><p>Portent&#8217;s take is that the upsides of relational and hierarchical models don&#8217;t matter nearly as much as in the past now that we have AI.</p><p>In fact:</p><ol><li><p>Once most information can be organized by AI agents, consistency can be enforced easily even in the absence of a <em>deterministic</em> way to do it with software.</p></li><li><p>Folder traversal simply doesn&#8217;t matter in a world where agents can grep and fetch anything.</p></li></ol><p>If we agree on this, simple default relationships work and scale better than anything else, because they create:</p><ul><li><p><strong>Less semantic surface</strong> &#8212; easier to understand for both humans and AI, because it&#8217;s the same concepts everywhere.</p></li><li><p><strong>Cross-type meaning</strong> &#8212; easier to work across multiple types (e.g. <em>find all &#8220;orphaned&#8221; notes == those that have no belongs_to and no related_to</em>)</p></li></ul><p>None of this is exactly new: graph DBs have been doing this since forever &#8212; I only argue this is the best way to build knowledge bases, especially now that we have AI.</p><p>Next, let&#8217;s talk of lifecycle &#128071;</p><div><hr></div><h2>&#128260; Lifecycle</h2><p>A common problem with knowledge bases is that it&#8217;s hard to keep them clean, understandable, and up to date. Portent encourages users to manage notes in three steps: <strong>Capture</strong>, <strong>Organize</strong>, and <strong>Archive</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fiqd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fiqd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 424w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 848w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 1272w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fiqd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png" width="1456" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119418,&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/198376374?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.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_!fiqd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 424w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 848w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 1272w, https://substackcdn.com/image/fetch/$s_!fiqd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98f42-9873-4d3a-b923-8934818c97a3_2002x646.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These can be implemented as a status property for every note, and are meant to be enforced by your workflow somehow. </p><p>More on each:</p><h3>1) Capture</h3><p>The capture stage is only meant to make information <em>available</em>. Save that link for later, store those meetings notes, write down that thought in a random note.</p><p><em>Captured</em> notes are not clean nor tidy: they are a mess, and intentionally so. The capture stage is optimized for <em>speed</em>: just capture <em>everything</em>, and then we&#8217;ll see.</p><h3>2) Organize</h3><p>Once a note is captured, you have to ask yourself two questions about it:</p><ul><li><p><strong>What is this?</strong></p></li><li><p><strong>What should I do with it?</strong></p></li></ul><p>The first question drives <em>type</em> selection, while the second drives what relationships to create for it.</p><p>If you can&#8217;t attach any Project, Responsibility, Operation, or Topic to a note, then it means you can probably trash it. It&#8217;s totally fine to capture things and then realize it was a mistake: capture things optimistically, and organize pessimistically.</p><p>I organize my captured notes once a week, and I implemented this workflow directly in Tolaria, where the default section is the &#8220;Inbox&#8221; (aka not organized) list of notes, and you can flag any note as &#8220;organized&#8221; with cmd+E.</p><h3>3) Archive</h3><p>An underrated part of what makes for a good knowledge base is separating <em>current</em> from <em>obsolete</em> information. The latter can <em>still </em>be useful &#8212; think past projects, old meeting notes, etc &#8212; but you don&#8217;t want them to show up in your regular usage.</p><p>You should have a clear way to mark notes as &#8220;archived&#8221;, so that humans and AI can ignore them by default.</p><div><hr></div><h2>&#128268; Extending Portent</h2><p>These are the basic concepts in Portent, but are not meant to be the <em>only</em> ones that live in your knowledge base.</p><p>Once you have understood the basics (organization based on actionability, simple relationships, capture vs organize, etc), it&#8217;s easy to extend them and add more concepts.</p><p>Common ones in my experience are:</p><ul><li><p><strong>Calendar types</strong> &#8212; like years, quarters, and months. These are extremely clear concepts that will not pollute your base, and can be used to anchor and group things like projects, events, and more.</p></li><li><p><strong>Teams / areas </strong>&#8212; it&#8217;s useful sometimes to create larger groupings that represent domain or ownership areas, and attach PORT items to those.</p></li><li><p><strong>Note types</strong> &#8212; you may want to &#8220;split&#8221; the Note type into more ones: videos, resources, articles, etc. I am a fan of doing that with tag properties, instead of &#8220;root&#8221; Types, but you can do it either way.</p></li><li><p><strong>Specialized relationships </strong>&#8212; once you are sure about your model, it can be great to create a few specific relationships to <em>disambiguate </em>the use of the default ones. </p></li></ul><p>And of course it&#8217;s useful to create types that map to the domain language of your use cases. E.g. I write a newsletter and I have types for the Essays I write, Evergreen notes, Podcast interviews, and more.</p><div><hr></div><h2>&#128296; Tolaria implementation</h2><p>Portent can be implemented in any note taking system, but has special support in Tolaria.</p><p>I created a Portent <a href="https://github.com/refactoringhq/portent-vault-template">template vault here</a>, that you can clone and use in Tolaria.</p><p>Tolaria is good for Portent because:</p><h3>1) Lifecycle management</h3><p>Capture &#8594; Organize &#8594; Archive is directly supported in Tolaria:</p><ul><li><p>The Inbox section shows all notes that haven&#8217;t been organized yet</p></li><li><p>You can <em>organize</em> a note with cmd+E or the organize button in the editor bar</p></li><li><p>You can <em>archive</em> a note with the archive button, and it will hide from the default sections.</p></li></ul><h3>2) Types &amp; Relationships</h3><p>Tolaria is natively organized into Types and Relationships, and it suggests default relationships that are exactly the Portent ones.</p><h3>3) Multiple vaults</h3><p>If you want to use the same type system (Portent) for both life and work, you can create separate vaults and <em>mount </em>them together inside Tolaria for you to see, while maintaining separate access control for e.g. your co-workers.</p><div><hr></div><p>And that&#8217;s it for today! As always, let me know your thoughts on all of this!</p><p>I wish you a great week</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[How to Orchestrate AI Workflows]]></title><description><![CDATA[Navigating tradeoffs between pure AI and deterministic software]]></description><link>https://refactoring.fm/p/how-to-orchestrate-ai-workflows</link><guid isPermaLink="false">https://refactoring.fm/p/how-to-orchestrate-ai-workflows</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 13 May 2026 07:15:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/49db2463-e225-45ef-b6b9-333a935beb35_2478x1634.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, <a href="https://refactoring.fm/about">Luca</a> here! Welcome to a <strong>weekly essay</strong> 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>&#128591;&#128583;&#8205;&#9794;&#65039;</p><div><hr></div><p>Hey there! Last week&#8217;s article about <a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">my workflows for Tolaria</a> went incredibly well, and I got a ton of replies and questions via email.</p><p>One of the most recurring ones was: what&#8217;s next? How would you improve this?</p><p>Happy to answer. I have been building AI workflows for a while now, and, for the most part, I have done so in &#8220;100% AI mode&#8221; &#8212; that is, I tell an agent to do something recurringly, in natural language, and they do it.</p><p>These workflows are fast to ship and *mostly* work, but also have pretty obvious drawbacks, that I would love to discuss today.</p><p>I believe this is relevant because these days we are inundated by stories like: &#8220;n8n is dead!&#8221;, &#8220;it&#8217;s all agents calling agents!&#8221;, and so on, while reality is more complicated.</p><p>I also bounced a lot of ideas off with the team at <a href="https://kestra.io/">Kestra</a>, who runs an awesome open source platform for orchestrating workflows. Their help came at the perfect time, and we basically wrote this piece together.</p><p>So here is the agenda:</p><ul><li><p><strong>&#129529; Cleaning up releases</strong> &#8212; starting from a real-world example.</p></li><li><p><strong>&#9878;&#65039; AI vs Orchestration</strong> &#8212; mapping pros and cons of how to run workflows.</p></li><li><p><strong>&#127959;&#65039; Agents as scaffolding</strong> &#8212; a useful mental model about going AI first, but gradually <em>replacing</em> it with code.</p></li><li><p><strong>&#128506;&#65039; Workflow engineering journey</strong> &#8212; a maturity model for developing your workflows.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><p><em>Disclaimer: I am thankful to <a href="https://kestra.io/">Kestra</a> for partnering on this piece 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://kestra.io/&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://kestra.io/"><span>Learn more about Kestra</span></a></p><p><em>However, as always I will only write my unbiased opinion on the practices and tools covered, Kestra included.</em></p><div><hr></div><h2><strong>&#129529;</strong> Cleaning up releases</h2><p>To stay grounded and make you understand what I mean when I say <em>workflows</em>, let&#8217;s take a practical example. Whenever I create a new stable release for Tolaria, I have an automation to take care of the release&#8217;s <em>aftermath</em>.</p><p>This includes fetching all the bug fixes and feature requests that were <em>shipped</em> in the release, and update/close them in the respective channels, notifying the relevant users.</p><p>This is not rocket science by any means, but it involves a number of steps:</p><ol><li><p>Fetch Github commits shipped with release</p></li><li><p>Match commits to the associated tasks on Todoist</p></li><li><p>For each task, retrieve the <em>original</em> entry either on Github Issues, or the Canny <a href="https://tolaria.canny.io/">product board</a></p></li><li><p>For each Github issue, leave a comment saying this is fixed in the latest release, and close the issue</p></li><li><p>For each Canny item, leave a comment explaining how this was implemented in the latest release, and close the item</p></li><li><p>Finally, create short descriptive release notes to be attached to the <a href="https://refactoringhq.github.io/tolaria/">release page</a>.</p></li></ol><p>The first version of this was entirely run by AI. No scripts &#8212; just a few high-level skills about how to access Github Issues, Canny, and Todoist &#8212; and natural language instructions about what needed to happen.</p><p>This mostly works. Sure, it is slow and expensive, but that&#8217;s forgivable given that I need to run it at most once per day. The problems come when it <em>doesn&#8217;t</em> work for any reason.</p><p>Say Github issues are not available at that specific time (ofc fantasy example given Github&#8217;s <a href="https://mrshu.github.io/github-statuses/">immaculate availability</a> lately), or the run times out, or your favorite AI provider rate limits you in that very moment.</p><p>At that point the workflow fails, and it typically does so in the worst possible way: 1) silently, 2) leaving things in a dirty state, and 3) without any retry or recovery.</p><p>Of course you may <em>build</em> all of these into the procedure somehow, but if you find yourself manually plumbing standard ideas about how we have been running workflows since... forever, you should probably stop and ask yourself if there is a better way.</p><p>So let&#8217;s take a step back and think through this from first principles.</p><div><hr></div><h2><strong>&#9878;&#65039;</strong> Pure AI vs Orchestration</h2><p>The tradeoffs between pure AI workflows (e.g. cron jobs on OpenClaw) and orchestration platforms a-la Kestra, resemble a lot those between AI and deterministic software.</p><p>AI is incredibly smart, but also incredibly expensive and slow. A lot of work just doesn&#8217;t need those <em>smarts</em>. Routing, retries, conditionals, scheduling &#8212; there is just a lot of plumbing that can be done in a purely deterministic way, saving time &amp; money.</p><p>Also, traditional orchestration doesn&#8217;t only win on time and money: it is often a better choice <em>full stop</em> when you account for:</p><ul><li><p><strong>Observability</strong> &#8212; you can&#8217;t debug pure LLM reasoning, as you can instead with workflow steps that are explicit and isolated. Also you get execution history, stats, and much more.</p></li><li><p><strong>Reliability</strong> &#8212; scheduling, resiliency, recovery from failures. This should be all built-in.</p></li><li><p><strong>Scalability</strong> &#8212; this is probably not a factor on its own, but more the result of all of the above combined. Being able to scale requires reliability, observability, low latency, and so on.</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_!OZfE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OZfE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 424w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 848w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OZfE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png" width="728" height="412.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:256292,&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/197106828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.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_!OZfE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 424w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 848w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 1272w, https://substackcdn.com/image/fetch/$s_!OZfE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b240d20-18d6-4292-a2fc-2c43fb8c8e64_2008x1138.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So where do we go from here?</p><div><hr></div><h2>&#127959;&#65039; Agents as scaffolding</h2><p>A few weeks ago, Will Larson published an <a href="https://lethain.com/agents-as-scaffolding/">awesome piece</a> about using agents as <em>scaffolding</em> for recurring tasks, which means: a useful <em>first pass</em> to discover what the workflow should be.</p><p>Then, once the pattern is known, you should <em>extract</em> and <em>harden</em> as much as you can into deterministic code. So agentic steps are largely used as &#8204;prototyping tools, not permanent infrastructure.</p><p>This doesn&#8217;t mean eventually replacing <em>all</em> of the AI, but rather only using AI for the right things. With some degree of simplification:</p><ul><li><p><strong>Orchestration wins at all-things-infra</strong> &#8212; observability, reliability, human-in-the-loop approvals, structured output validation, and so on.</p></li><li><p><strong>AI wins at the</strong> <em><strong>messy</strong></em> <strong>stuff</strong> &#8212; classification, summarization, judgment calls, and all the things you can&#8217;t write code for.</p></li></ul><p>I love this take, and I think we can <em>expand</em> it into an actual maturity journey &#128071;</p><div><hr></div><h2><strong>&#128506;&#65039;</strong> Workflow engineering journey</h2><p>Based on this, a natural progression may look like this:</p><ol><li><p><strong>Agent-first</strong> &#8212; everything in a loop, fast to prototype, but opaque to debug.</p></li><li><p><strong>Isolate the deterministic parts</strong> &#8212; pull out the boring steps (fetch, validate, store, etc) into explicit code. Keep AI for judgment calls.</p></li><li><p><strong>Structured orchestration</strong> &#8212; proper DAG / event-driven layer with retries, lineage, observability. AI becomes one task type among many.</p></li><li><p><strong>AI-driven composability</strong> &#8212; LLMs generate or modify the workflow definitions themselves. The orchestration layer is stable enough to be a target for code generation.</p></li></ol><p>I am particularly bullish about #4 because, when you think about it, it is a way to get the best of both worlds: you prompt the AI in natural language as you would for normal agentic workflows, but the AI actually turns that into structured, semi-deterministic 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_!Ppb9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ppb9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 424w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 848w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 1272w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ppb9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png" width="1456" height="426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:426,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:131722,&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/197106828?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.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_!Ppb9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 424w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 848w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 1272w, https://substackcdn.com/image/fetch/$s_!Ppb9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c546d1-241f-4e91-9df0-9faa549aaff4_1854x542.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A quick plug to <a href="https://kestra.io/">Kestra</a> on this, which I am a big fan of. Because if you <em>agree</em> with these steps, a natural question becomes: what should an orchestration platform look like to enable AI to operate it? Kestra checks a lot of my boxes:</p><ul><li><p><strong>Code-first</strong> &#8212; the AI should be able to write workflows in a declarative fashion, with code, because that&#8217;s what it&#8217;s best at (as opposed to e.g. GUIs).</p></li><li><p><strong>API/CLI first</strong> &#8212; trigger executions and manage workflows through API</p></li><li><p><strong>Open source</strong> &#8212; these days, considering the speed tech is moving at, I put a lot of value on the tools I use being open source, so we can evolve them faster as a community, in the open, and there is less lock-in.</p></li></ul><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 I Run the Tolaria Project]]></title><description><![CDATA[All the workflows I built to run a big open source project in 2026]]></description><link>https://refactoring.fm/p/how-i-run-the-tolaria-project</link><guid isPermaLink="false">https://refactoring.fm/p/how-i-run-the-tolaria-project</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 06 May 2026 07:02:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!l86n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54c9266c-bec7-4d92-b70a-f28872bf620b_4578x2906.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey, Luca here! As you probably know by now, two weeks ago I launched <a href="https://github.com/refactoringhq/tolaria">Tolaria</a>, a desktop app for Mac, Linux, and Windows, to manage markdown knowledge bases &#8212; for humans and AI.</p><p>I did that to solve my own problems and to get my hands dirty with AI coding. In other words, I wanted to <em>walk the talk</em>, and then write about it here on Refactoring.</p><p>Little did I know this would feel more like <em>speedrunning</em> the talk.</p><p>Tolaria has now several thousand daily users, <strong>10K stars on Github</strong>, and last week it was the 10th fastest growing repo&#8230; in the world, as measured by <a href="https://www.star-history.com/">Star History</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_!wpw7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wpw7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wpw7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg" width="312" height="442.16883116883116" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:873,&quot;width&quot;:616,&quot;resizeWidth&quot;:312,&quot;bytes&quot;:324594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://refactoring.fm/i/196524187?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.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_!wpw7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wpw7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04021c4d-c0c4-41e0-88c6-1bd68d69a8c6_616x873.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Last week&#8217;s chart on Star History</figcaption></figure></div><p>To put things in context, there are only about ~5K repos in the world with more than 10K stars, out of ~30M.</p><p>This is of course, incredibly flattering and energizing, but I also joked with friends that I have been glued to my chair non-stop for these two weeks, because all this interest also posed very real operational problems.</p><p>Users, in fact, who are mostly engineers, contributed <em>hard</em> &#8212; and I am glad they did! As of today, Tolaria has received:</p><ul><li><p>200+ issues on Github</p></li><li><p>150+ PRs</p></li><li><p>150+ feature requests on <a href="https://tolaria.canny.io/">Canny</a></p></li></ul><p>So I had to create workflows to help handle all of this: to ensure issues would be fixed fast and people would get feedback about ideas and contributions.</p><p>Fast forward to today, I am pretty happy with how it is going, and as I write this, we are down to:</p><ul><li><p>15 open issues</p></li><li><p>11 PRs</p></li><li><p>81 feature requests</p></li></ul><p>Today&#8217;s newsletter covers all these workflows and how I &#8220;survived&#8221; these two weeks, while only working part-time on Tolaria, and the rest of the time on Refactoring &#8212; in the meantime I also had to publish 4 newsletter editions and 2 podcast episodes.</p><p>So here is the agenda:</p><ul><li><p>&#128229; <strong>Inputs</strong> &#8212; mapping and normalizing sources and channels.</p></li><li><p>&#128451;&#65039; <strong>Backlog</strong> &#8212; turning everything into a single prioritized list from which agents can take work.</p></li><li><p>&#128269; <strong>Validation</strong> &#8212; is it the one true bottleneck, as everyone is fond of saying these days?</p></li><li><p>&#128640; <strong>Release</strong> &#8212; making work available to everyone and updating all the input sources.</p></li><li><p>&#128202; <strong>Analytics</strong> &#8212; tracing what happens in production.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128229; Inputs</h2><p>I have never maintained a sizable open source project before, so you&#8217;ll forgive me if some of what I am about to say will sound trivial to you.</p><p>At any given time, there are several types of inputs Tolaria receives, that can <em>spawn</em> work to be done:</p><ol><li><p>Bug reports from users</p></li><li><p>Feature requests from users</p></li><li><p>PRs from contributors</p></li><li><p>Crash reports from telemetry (Sentry)</p></li><li><p>My own ideas (hello &#128075;)</p></li></ol><p>These are all separate channels but, with some degree of simplification, they spawn two types of work: <em>bugs</em> and <em>features</em>.</p><p>More specifically:</p><ul><li><p>#1 and #4 spawn bugs</p></li><li><p>#2 and #5 spawn features.</p></li><li><p>#3 (PRs) can spawn either, but mostly features.</p></li></ul><p>#1, #2, and #3 originally all lived in Github Issues, but bugs and feature requests have different <em>needs</em> and deserve to live in separate places. In fact:</p><ul><li><p><strong>Bugs</strong> &#8212; only need to be replicated and squashed as soon as possible. I am a strong believer in a zero-bugs policy: catching bugs as soon as they are reported, and fixing them all ASAP. All in all, there is very little to decide about bugs.</p></li><li><p><strong>Feature requests</strong> &#8212; are another story. They benefit from being voted on (you want to see how many people want something), are generally <em>bigger,</em> so you may want to flag things as <em>planned</em> or <em>in progress</em> so users are notified, need to be <em>specced</em>, and, of course, you don&#8217;t want to build those that don&#8217;t match your vision. That&#8217;s a lot more to decide.</p></li></ul><p>From a workflow standpoint, bugs are easy, features are not &#8212; which is why today we are down to only 15 open bugs out of 200, but still 80+ open feature requests out of 150.</p><p>The way I manage this is by keeping bugs on <a href="https://github.com/refactoringhq/tolaria/issues">Github Issues</a>, and feature requests on a <a href="http://tolaria.canny.io/">separate product board</a> on Canny.</p><p>To make people understand this, I created a rich &#8220;contribute&#8221; panel inside Tolaria where you are <em>routed</em> to different places based on how you want to help:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zdac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zdac!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 424w, https://substackcdn.com/image/fetch/$s_!zdac!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 848w, https://substackcdn.com/image/fetch/$s_!zdac!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!zdac!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zdac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png" width="1456" height="1286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1286,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1128079,&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/196524187?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.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_!zdac!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 424w, https://substackcdn.com/image/fetch/$s_!zdac!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 848w, https://substackcdn.com/image/fetch/$s_!zdac!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!zdac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa577ff8-ddaf-450d-94c9-9e1d1e892ee0_1884x1664.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Still a lot of things go wrong all the time:</p>
      <p>
          <a href="https://refactoring.fm/p/how-i-run-the-tolaria-project">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Compounding Software Factory 📈]]></title><description><![CDATA[The third and final episode of our software factory series!]]></description><link>https://refactoring.fm/p/the-compounding-software-factory</link><guid isPermaLink="false">https://refactoring.fm/p/the-compounding-software-factory</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 29 Apr 2026 07:55:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/37242dce-5b57-4811-a3f2-6a21cd227153_2532x1680.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there, Luca here!</p><p>Today I am back with the third and last article in our <strong>Software Factory series</strong>, written together with my friend <a href="https://www.linkedin.com/in/robzuber">Rob Zuber</a>, CTO at <a href="https://circleci.com/">CircleCI</a>.</p><p>Before this one we published:</p><ol><li><p><a href="https://refactoring.fm/p/the-era-of-the-software-factory">The Era of the Software Factory</a></p></li><li><p><a href="https://refactoring.fm/p/growing-your-sofware-factory">How to Grow your Software Factory</a></p></li></ol><p>Why three articles? Because we like to work from first principles:</p><p>In the first article we established (with <a href="https://circleci.com/resources/2026-state-of-software-delivery/">actual data</a>) that teams that are getting far with AI are doing so thanks to good DX. The same teams that had good DX three years ago, are now winning the AI race: those at the 90th percentile are shipping &gt;2x faster than before.</p><p>In the second article we said: ok, but once you have good DX, how do you create leverage with AI? And we laid out a plan in three steps:</p><ol><li><p>&#128203; <strong>Specs</strong> &#8212; start by writing good, detailed instructions about things to be done. E.g. &#8220;<em>create a button that has the following specs [&#8230;]</em>&#8221;</p></li><li><p>&#128218; <strong>Rules</strong> &#8212; turn specs into reusable <em>rules</em> for the AI to follow. This is when you can say to the AI: &#8220;<em>create a button using our rules for creating buttons</em>&#8221;.</p></li><li><p>&#129513; <strong>Modules</strong> &#8212; is the final stage, when AI can reuse <em>code</em> directly, instead of rules, and you can simply say: &#8220;<em>create a primary button</em>&#8221;</p></li></ol><p>This seems <em>good enough</em>, so why a third article?</p><p>Because if you do all of the above right, your outcome will be: a solid dev process, in which AI produces <em>good</em> <em>enough </em>work to be shipped.</p><p>Now, while this seems like an ambitious target already, I still think <strong>we should aim higher</strong>.</p><p>To understand why this matters, we need to take a step back and reflect on engineering teams <em>before</em> AI. Here is the agenda for today:</p><ul><li><p>&#128201; <strong>The default path is degradation </strong>&#8212; the uncomfortable reality of engineering teams so far.</p></li><li><p>&#128027; <strong>What causes teams to degrade </strong>&#8212; talking about coding hygiene, capturing knowledge, and building the wrong things.</p></li><li><p><strong>&#128200; How to get better instead of worse </strong>&#8212; how to invert the trend on each of these dimensions.</p></li><li><p><strong>&#127933; Empowering managers </strong>&#8212; this is <em>peak</em> manager territory. Let&#8217;s talk about what managers should really do today in the age of AI.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div>
      <p>
          <a href="https://refactoring.fm/p/the-compounding-software-factory">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Introducing Tolaria 💧]]></title><description><![CDATA[A free & open source macOS app for managing markdown knowledge bases.]]></description><link>https://refactoring.fm/p/introducing-tolaria</link><guid isPermaLink="false">https://refactoring.fm/p/introducing-tolaria</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 22 Apr 2026 08:06:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XRY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey, Luca here &#8212; the wait is over! After <a href="https://refactoring.fm/p/updates-to-my-ai-coding-workflow">teasing it</a> during the last month, today I am making <a href="http://tolaria.md/">Tolaria</a> available to everyone, free and open source. You can find it <a href="https://github.com/refactoringhq/tolaria">here</a> and download the latest release.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/refactoringhq/tolaria&quot;,&quot;text&quot;:&quot;Check out Tolaria &#128167;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/refactoringhq/tolaria"><span>Check out Tolaria &#128167;</span></a></p><h2>What is Tolaria?</h2><p>Tolaria is a desktop app for Mac for managing <strong>markdown knowledge bases</strong>. In a way, it&#8217;s my own version of <a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f">Karpathy&#8217;s LLM wiki</a>.</p><p>I have a close circle of friends who have been using it over the past few weeks, and they use it to operate:</p><ul><li><p>Second brains and personal knowledge</p></li><li><p>Company docs as context for AI</p></li><li><p>OpenClaw / assistants memory and procedures</p></li></ul><p>Personally, I use it to <strong>run my life and work</strong>.</p><p>I have a massive workspace of 10,000+ notes, which are the result of 6 years of Refactoring work + a ton of personal journaling and <em>second braining</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XRY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XRY5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 424w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 848w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 1272w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XRY5!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png" width="1200" height="787.0879120879121" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:955,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:6315681,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.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_!XRY5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 424w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 848w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 1272w, https://substackcdn.com/image/fetch/$s_!XRY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931c128f-2158-4eec-a282-d8c6cdb27137_3982x2612.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Tolaria is the best app I have ever used for managing markdown knowledge bases.</figcaption></figure></div><p>Earlier this year I decided to migrate everything from Notion to markdown files for a variety of reasons (speed, control, better AI work), but I missed an app that allowed me to operate these files with a UX that fit my brain &#8212; so I built it! </p><p>So, this newsletter will explain a few things:</p><ul><li><p>&#128249; <strong>Walkthroughs </strong>&#8212; how I use Tolaria for various stuff.</p></li><li><p><strong>&#127744; Tolaria + Refactoring</strong> &#8212; how Tolaria fits the broader Refactoring picture, and my life.</p></li><li><p><strong>&#11088; Tolaria Principles</strong> &#8212; things I believe in, on top of which Tolaria is built.</p></li><li><p><strong>&#128295; How Tolaria works</strong> &#8212; the main parts.</p></li><li><p><strong>&#128300; What you will find in the repo</strong> &#8212; interesting stuff you may look at.</p></li></ul><p>Also, as I wrote before, I commit to keeping you posted about my AI coding workflow, and I will use Tolaria and its repo as a <em>living artifact</em> of how I create software with AI, trying to staying on the frontier of what&#8217;s possible, trying new things, and so on.</p><p>Tolaria will stay free forever, but if you want to <strong>stay posted with these explorations</strong> and support my work, consider subscribing to the paid version of Refactoring &#128071;</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><p>p.s. we&#8217;ve recently launched our <a href="https://refactoring.fm/p/introducing-the-ai-club">AI Club</a> and will run the first edition next month. I&#8217;d love to see you there!</p><div><hr></div><h2>&#128249; Walkthroughs</h2><p>Before you move further, you can find some Loom walkthroughs below &#8212; they are short and to the point:</p><ul><li><p><a href="https://www.loom.com/share/bb3aaffa238b4be0bd62e4464bca2528">How I Organize My Own Tolaria Workspace</a></p></li><li><p><a href="https://www.loom.com/share/dffda263317b4fa8b47b59cdf9330571">My Inbox Workflow</a></p></li><li><p><a href="https://www.loom.com/share/8a3c1776f801402ebbf4d7b0f31e9882">How I Save Web Resources into Tolaria</a></p></li></ul><p>I recorded them because I think it&#8217;s way easier to see things in action than to read long explainers. So if you like what you see, you can continue reading below &#128071;</p><div><hr></div><h2>&#127744; Tolaria + Refactoring</h2><p>In this time of rapid change, deciding how I spend my time feels like a big deal. Tolaria is taking <em>a lot</em> of it, so it needs to be worth it, and I think it is.</p><p>With Refactoring I write about <strong>how to create good software</strong> &#8212; that&#8217;s how I literally make a living. Over the last few years I have done that largely by 1) doing research and 2) talking with the smartest people I knew.</p><p>With everything that&#8217;s happening with AI, this is not enough anymore.</p><p>Everyone needs <strong>hands-on work</strong> to understand what&#8217;s really happening, and form opinions that are not mediated by other people&#8217;s experience.</p><p>Also, in order to make for good evidence, such work needs to be <em>ambitious</em>. Side projects are nice, but can we build <em>real</em>, complex software with AI, without writing a single line of code? What about without <em>reading</em> it? Does it scale? Or do we <em>drift</em> into chaos?</p><p>So far, it scales. </p><p>Tolaria is not <em>massive</em>, but at this point it is not small either. By the numbers:</p><ul><li><p>100K lines of code, in Rust + React.</p></li><li><p>1900+ commits</p></li><li><p>3000+ tests</p></li><li><p>70 ADRs</p></li></ul><p>I have written more about how I work on it in this <a href="https://refactoring.fm/p/updates-to-my-ai-coding-workflow">recent piece</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_!AnY2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AnY2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 424w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 848w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 1272w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AnY2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png" width="1456" height="404" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:404,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61989,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.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_!AnY2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 424w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 848w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 1272w, https://substackcdn.com/image/fetch/$s_!AnY2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c1b074e-0b95-41a1-9a0b-232431d670fe_1556x432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">My incredible (for me) Github graph for 2026. My most prolific year before this one had 900 commits &#8212; for the full year.</figcaption></figure></div><p>So, my commitment with Tolaria is the following:</p><ul><li><p>I will keep it free &amp; open source forever.</p></li><li><p>I will run my life and business on it.</p></li><li><p>I will work 2+ hours / day on it to develop new things, fix problems, and make it useful for people other than myself.</p></li><li><p>I will do as much of the work as possible with AI, trying to <em>live in the future</em>.</p></li><li><p>I will keep you posted on Refactoring about this process.</p></li></ul><p>In a nutshell, the goal is to <strong>work on the frontier and report back to you</strong>.</p><div><hr></div><h2>&#11088; Principles</h2><p>So, what is Tolaria about? When I speak with friends, jokingly I say that it&#8217;s like Notion, but offline, and for actual files. This is not 100% correct, but it&#8217;s a good starting point.</p><p>Tolaria is based on a simple belief: <strong>AI delivers the biggest benefits to those who are able to capture and organize context</strong> &#8212; whether it&#8217;s about their lives or work.</p><p>We often talk about &#8220;knowledge&#8221; management but it&#8217;s not only about knowledge: it&#8217;s about projects, goals, thoughts, relationships, and everything that happens in your lives. The more you can capture (and organize properly), the more AI can be useful to you.</p><p>Such material is, potentially, our most precious asset. We&#8217;ll want to keep it tidy, up to date, and most of all, <strong>under our control</strong>.</p><p>Keeping it under our control means not being locked into a specific tool or AI platform. It means being able to switch to different AIs by snapping your fingers, or using multiple ones together on the same collaboration surface.</p><p>You may want your Claude Code to do some autonomous research and write its findings, while your OpenClaw fetches your latest meeting notes and turns them into a doc, all while you write manually in your journal, or capture a valuable idea into an <em>evergreen note</em>.</p><p>This should all be possible and be backed by the same knowledge base.</p><p>Based on this, here is how I think such a knowledge base should work:</p><ul><li><p><strong>Files</strong> &#8212; because of 1) portability, 2) offline work, and 3) how AI is massively good at working with them, files are an obvious choice for a knowledge base.</p></li><li><p><strong>Markdown</strong> &#8212; md has surfaced as the de-facto standard for documents in the AI era. And you can easily extend it with a YAML frontmatter to store structured properties</p></li><li><p><strong>Git</strong> &#8212; by using files, version control is an obvious fit. This is useful for 1) history, for 2) cloud sync, and for 3) tracking authorship of changes, especially in a world where humans and AI collaborate.</p></li><li><p><strong>Open source</strong> &#8212; if the goal is full &amp; long-term portability, the app you use to operate your knowledge should stay under your control.</p></li></ul><p>While the above items are the *core *principles, there are a few others I strongly believe in:</p><ul><li><p><strong>Rich UX</strong> &#8212; there are a lot of markdown editors out there who are simply&#8230; editors. This just doesn&#8217;t cut it when you have a lot of notes and need to operate <em>years</em> of content. You need relationships, visual cues, navigation, colors, icons, stuff that tells you at a glance <em>what</em> a note is, where it lives, and so on.</p></li><li><p><strong>Keyboard-first</strong> &#8212; I am a developer at heart, so the more I can do via the keyboard, the better. In Tolaria there are shortcuts and commands for <em>everything</em>, and tab navigation works well, so you never need the mouse.</p></li><li><p><strong>Opinions</strong> &#8212; capturing and organizing knowledge is hard, so I will bring my point of view about it. When you do something every day, you need UX that is optimized for that, and you can only achieve that if your tool has opinions. Tolaria has many!</p></li></ul><div><hr></div><h2>&#128295; How Tolaria works</h2><p>Tolaria is organized into a few main components:</p><ol><li><p><strong>Sidebar</strong> &#8212; for filtering notes in various ways</p></li><li><p><strong>Note list</strong> &#8212; for displaying the list of notes that match the current selection in the sidebar</p></li><li><p><strong>Editor</strong> &#8212; for editing the current note.</p></li><li><p><strong>Status bar</strong> &#8212; for changing vault, check Git status, AI status, and handy stuff</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_!wtwc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wtwc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 424w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 848w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 1272w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wtwc!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png" width="1200" height="787.0879120879121" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:955,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:5944515,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.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_!wtwc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 424w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 848w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 1272w, https://substackcdn.com/image/fetch/$s_!wtwc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9bac09-4c77-4205-9618-4a076ffd9fe7_3982x2612.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Let&#8217;s look at each of these &#128071;</p><div><hr></div><h2>1) Sidebar</h2><p>One of the core things you want to do when you have a lot of notes, is looking at just a subset of them at a time, based on various criteria.</p><p>Tolaria allows you to do so in many ways:</p><h3>&#128229; Inbox</h3><p>Notes that haven&#8217;t been <em>organized</em> yet.</p><p>This is inspired by <a href="https://www.buildingasecondbrain.com/">Tiago Forte</a>&#8216;s concept of separating capture from organize. An &#8220;organized&#8221; note is a note that you know what you will do with. It may belong to a project, to a responsibility, a topic, or any concept related to how you organize work.</p><p>Review your inbox (e.g.) weekly to keep it from growing too large. You can disable the Inbox in Settings <code>cmd+,</code>) if you don&#8217;t like this workflow.</p><p>You can flag a note as <em>organized</em> by clicking on the &#8220;check&#8221; icon in the breadcrumbs bar, or with <code>cmd+e</code>.</p><h3>&#128451;&#65039; All Notes</h3><p>As the name suggests, that&#8217;s the entire vault &#8212; every single note.</p><h3>&#128230; Archive</h3><p>A permanent home for notes you don&#8217;t want to delete but don&#8217;t want to see regularly. Archive aggressively to keep your vault clean. Archived notes still appear in search results, but not in sidebar sections.</p><h3>&#129513; Types</h3><p>The main organizational device in Tolaria. Each note has a type, which by default is Note.</p><p>Each type can have its own icon and color, which you can change by right-clicking on it in the sidebar, or manually changing it in the properties or frontmatter of the type file.</p><p>Types are simply stored as markdown files, like Topic, or Project.</p><p>Click any type on the sidebar to see all notes of that type in the note list.</p><h3>&#11088; Favorites</h3><p>Notes you&#8217;ve manually pinned to keep them top-of-mind. Great for active projects, journal entries, or reference notes you access frequently.</p><p>You can reorder them by dragging them in the sidebar.</p><p>Toggle a favorite note from the &#11088; button in the breadcrumbs bar, or with <code>cmd+d</code> .</p><h3>&#128269; Views</h3><p>You can create custom views that filter notes by complex, nested criteria. The view editor fetches all available properties, plus allows for some tricks (like regexes and natural language dates)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GEjx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GEjx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 424w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 848w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 1272w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GEjx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png" width="1456" height="851" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:851,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:155722,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.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_!GEjx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 424w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 848w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 1272w, https://substackcdn.com/image/fetch/$s_!GEjx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7752a1eb-1390-48b4-a11e-b08edd488c4b_1594x932.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Views are simple yaml files that get stored in the <code>views</code> folder. They can be edited easily and even created by the AI &#128071;</p><pre><code><code>name: Active Projects
icon: &#128640;
filters:
  all:
  - field: type
    op: equals
    value: Project
  - field: Status
    op: equals
    value: Active
  - any:
    - field: status
      op: equals
      value: active
    - field: date
      op: after
      value: in 1 week</code></code></pre><h3>&#128194; Folders</h3><p>Tolaria stores notes in the root of the vault by default, but also scans your vault&#8217;s folder structure, which you can navigate at the bottom of the sidebar.</p><p>Folders are listed last because they are a secondary organization method&#8212;not the primary one.</p><h3>&#128465;&#65039; Trash</h3><p>There is no trash bin, when you delete a note, it&#8217;s gone &#8212; but your git history is your safety net. You can always recover deleted notes from git if needed.</p><div><hr></div><h2>2) Note list</h2><p>The note list shows the subset of notes selected by the current sidebar section. For example, clicking &#8220;Types &#8594; Project&#8221; shows all your Project notes.</p><h3>&#11015;&#65039; Sorting</h3><p>You can sort the note list by any note property (they get dynamically loaded from the notes), plus file properties like modified and creation time.</p><p>Your choice will be remembered for that specific section.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6J5P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6J5P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 424w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 848w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 1272w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6J5P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png" width="1264" height="510" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:510,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93752,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.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_!6J5P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 424w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 848w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 1272w, https://substackcdn.com/image/fetch/$s_!6J5P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce56bac2-2145-40b1-bf4e-9fa3cb70977d_1264x510.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#128133; Display Properties</h3><p>You can customize which properties appear as columns in the note list. This lets you see important metadata at a glance without opening individual notes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BTJA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BTJA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 424w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 848w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 1272w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BTJA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png" width="1252" height="422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129941,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.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_!BTJA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 424w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 848w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 1272w, https://substackcdn.com/image/fetch/$s_!BTJA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e9cadc-dfad-480f-95dd-e08baf88fea1_1252x422.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For properties that are URLs or other notes, you can open them directly from the note list with <code>cmd+click</code>.</p><div><hr></div><h2>3) Editor</h2><p>The editor is where you write and edit your notes. Tolaria supports two modes:</p><ul><li><p><strong>WYSIWYG Mode</strong> &#8212; similar to Notion. Type naturally, use slash commands, and see the output directly formatted in the editor.</p></li><li><p><strong>Raw mode</strong> &#8212; shows the actual file characters. Access it with <code>Cmd+/</code> or the code button in the breadcrumb bar. Useful when you need precise control over markdown syntax.</p></li></ul><p>The note&#8217;s filename is always visible at the top of the editor. This keeps you aware of how the note will be named and linked.</p><p>A very important feature of the editor is the support for <strong>wikilinks</strong>. Type <code>[[</code> to trigger autocomplete from your entire vault. This creates links to other notes, enabling the knowledge graph. Wikilinks also auto-update if the filename 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_!0t5g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0t5g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 424w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 848w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0t5g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png" width="1456" height="1062" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1062,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:418964,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.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_!0t5g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 424w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 848w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!0t5g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F085c0f73-8af3-46d1-88ae-4bb349cd06ee_1580x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>4) Git</h2><p>Tolaria vault have first-class Git support and by default you retain fine control over it.</p><p>You can look at current changes and Git history from the status bar, create new commits and push them directly without ever leaving the app.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nlOg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nlOg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 424w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 848w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nlOg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png" width="1456" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:373979,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.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_!nlOg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 424w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 848w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!nlOg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad4adf09-7053-4ba1-8875-24402eec93ec_2552x1014.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But if you don&#8217;t want to manage this manually, and want to use Git as a simple automatic sync layer, Tolaria also has an opt-in <strong>AutoGit mode</strong> in which it automatically creates commits and pushes changes after some time. It does so when the app gets idle, when you shift which app is in focus, and based on various heuristics.</p><div><hr></div><h2>5) Commands</h2><p>One of Tolaria&#8217;s principles is being keyboard-first. Almost everything has shortcuts.</p><p>You can discover shortcuts from the mac menu and from tooltips on buttons.</p><p>A lot of actions also have a fall back or a quick way to do them via the command palette, which you can open with <code>cmd+K</code></p><p>You can really do almost everything with it, including navigating to sections, creating new notes of a certain type, or perform routine actions.</p><p>You don&#8217;t even need to find the exact keywords &#8212; the palette is smart enough to match a lot of commands semantically:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qpNL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qpNL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 424w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 848w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qpNL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png" width="1262" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1262,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133063,&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/194609000?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.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_!qpNL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 424w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 848w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!qpNL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403650bf-7255-4930-a808-3f390f3c4449_1262x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>&#128300; </strong>What you will find in the repo </h2><p>I will use this repo as a <strong>living artifact </strong>of how I do AI coding, for you to inspect at any time.</p><p>I have written exactly zero lines of code, out of the ~100K, and read very few of them. I am neither proud nor ashamed by it: it is what it is, and I would have never been able to build it otherwise.</p><p>Some interesting things that I haven&#8217;t seen too much elsewhere:</p><ul><li><p><strong>The <a href="https://github.com/refactoringhq/tolaria/blob/main/docs/ARCHITECTURE.md">Architecture</a>, <a href="https://github.com/refactoringhq/tolaria/blob/main/docs/ABSTRACTIONS.md">Abstractions</a>, and <a href="https://github.com/refactoringhq/tolaria/blob/main/docs/GETTING-STARTED.md">Getting Started</a> docs</strong> &#8212; they have some overlap, but overall I feel they do a good job at capturing what the tech is about.</p></li><li><p><strong>The <a href="https://github.com/refactoringhq/tolaria/tree/main/docs/adr">collection of ADRs</a></strong> &#8212; this is super useful, both for human review, and for AI to pick up on past decisions and what exists.</p></li><li><p><strong>The <a href="https://github.com/refactoringhq/tolaria/blob/main/docs/VISION.md">Vision</a> doc</strong> &#8212; this is not super updated, but it is still useful to guide AI when we brainstorm new features.</p></li></ul><p>Overall, this is a lot of context for the AI to inspect when you want it to do some &#8220;creative&#8221; task, like creating specs for new features, or making non-trivial tech choices, and dramatically increases the chances for it to get things right.</p><p>As of today I still review the ADRs and the changes to the main docs, but I find that AI gets these right &gt;90% of the time.</p><div><hr></div><h2>&#10145;&#65039; Next Steps</h2><p>If you download and install Tolaria, you will get the option of <strong>cloning a getting started vault</strong> that has examples and instructions. There is also a <code>Feedback</code> button in the status bar (bottom right) that gets you to Github issues, if you want to report anything.</p><p>Also feel free to reply to this email if you have any questions or just to let me know your thoughts! Please do! It&#8217;s been a ton of work and I absolutely want to know what you think about it &#128516;</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[Introducing the AI Club 🪄]]></title><description><![CDATA[A new monthly gathering for Refactoring community members]]></description><link>https://refactoring.fm/p/introducing-the-ai-club</link><guid isPermaLink="false">https://refactoring.fm/p/introducing-the-ai-club</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 15 Apr 2026 07:03:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f2cd68bf-0153-4ae0-83e5-872a611b8e9f_1240x640.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there! This is a special edition to announce I am starting a private <strong>AI Club</strong> for members of the Refactoring community!</p><p>These are going to be <strong>monthly online gatherings</strong> where people can share wins and learnings from using AI, ask questions, and stay up to date about what works.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Join our AI Club &#129668;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="http://refactoring.fm/subscribe?"><span>Join our AI Club &#129668;</span></a></p><p>So today&#8217;s post is to explain 1) why I am starting it, and<strong> </strong>2) how it works.</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_!RBE3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RBE3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 424w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 848w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 1272w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RBE3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png" width="1456" height="490" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png&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;:1848471,&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/194076528?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.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_!RBE3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 424w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 848w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 1272w, https://substackcdn.com/image/fetch/$s_!RBE3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf8f559d-8449-4100-b2a1-423c00067b18_2736x920.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#127919; Why I am starting an AI Club</h2><p>By now AI has taken over most of the online conversation about software engineering.</p><p>As <a href="https://refactoring.fm/p/updates-to-my-ai-coding-workflow">I wrote last week</a>, I think this is&#8230; largely correct. AI coding is so <em>big</em> and meaningful that figuring it out feels like the #1 priority for us as an industry. I don&#8217;t think we are misguided on this.</p><p>However, we are also in this <strong>very confusing stage</strong> where everyone is just trying things for themselves:</p><ul><li><p>Most teams have little-to-no shared practices / artifacts / ceremonies about AI.</p></li><li><p>Opinions online are all over the place, and it&#8217;s hard to know who to trust.</p></li><li><p>Most of us have very little time to try things out, and zero dedicated time at work to do so.</p></li></ul><p>All of this against a backdrop of anxiety, layoffs, FOMO, and doomsday predictions.</p><p>Yay!</p><p>AI is also changing how I think about my responsibilities with Refactoring. It is changing the topics I cover, how I spend my time (I am back to coding, a lot), and the type of conversations I have with people.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y_TJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y_TJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 424w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 848w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 1272w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y_TJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png" width="1456" height="388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b25d63e9-3149-4db8-9971-6662593b171d_1508x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:388,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59776,&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/194076528?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.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_!y_TJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 424w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 848w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 1272w, https://substackcdn.com/image/fetch/$s_!y_TJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb25d63e9-3149-4db8-9971-6662593b171d_1508x402.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Before 2026, in my most active year I did ~950 commits. This year I have done 3300 so far&#8230; in two months.</figcaption></figure></div><p>So, Refactoring should <strong>help you run better engineering teams</strong>, and a big part of that now is about using AI well &#8212; together, as humans.</p><p>So I want to host <strong>good conversations</strong> about it, where people share what they are learning: the exciting wins, the humbling failures, and everything in between.</p><p>Sharing things with others not only makes us <strong>grow faster together</strong> &#8212; it&#8217;s also great to fight back against anxiety, impostor syndrome, and all the pressure that comes with the push for AI adoption.</p><p>So let&#8217;s use the <strong>Refactoring community as your extended team</strong>, where we compare notes and learn things together.</p><div><hr></div><h2>&#8505;&#65039; How it works</h2><p>Here is the gist:</p><ul><li><p>Monthy 1-hour chat, hosted in the Refactoring Community.</p></li><li><p>As with all-things-community, it&#8217;s for paid Refactoring members. We gate this to keep people committed and ensure high quality.</p></li><li><p>Like our monthly mastermind, it&#8217;s facilitated by real engineering coaches, <a href="https://monkeysthumb.co.uk/">Joel</a> and <a href="https://www.seckington.com/">Melinda</a>.</p></li><li><p>I always join the call personally and share the things I have learned throughout the month</p></li><li><p>Everyone who joins can share their own &#8220;aha&#8221; moments &#8212; a win, or just something that genuinely surprised them &#8212; ask questions, and get to know other community members</p></li><li><p>Takeaways from the conversation are shared afterwards in the community in written form, for those who are not able to join.</p></li><li><p>Finally, for paid Refactoring subscribers, in the newsletter I will also publish monthly AI updates that combine my own experiments with things that surfaced in community calls.</p></li></ul><p>All in all it&#8217;s very simple. We&#8217;ll host the first one <strong>on May 8th</strong>, and we&#8217;ll always have them on the first Friday of the month, at rotating times to allow everyone to participate.</p><div><hr></div><h2>&#128274; About the Refactoring subscription</h2><p>Allow me a quick paragraph about the Refactoring subscription, which you might be considering joining.</p><p>It&#8217;s $15/month, or $150/year, to access the <a href="https://refactoring.fm/p/refactoring-community">Refactoring community</a>, all of our archive (300+ articles) carefully organized by topic, plus our weekly original long-forms about the latest and greatest engineering practices.</p><p>The community has bi-weekly events, professionally run, that alone would cost &gt;$100 to join &#8212; each!</p><p>So if Refactoring helps you make <strong>just </strong><em><strong>one</strong></em><strong> better decision</strong>, thanks to something you read, or learned from someone in the community, chances are the subscription repaid itself for the full year.</p><p>I would love to have you onboard! 1500+ engineers have joined this already &#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;http://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Join our AI Club &#129668;&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>Join our AI Club &#129668;</span></a></p><div><hr></div><p>And that&#8217;s it for today!</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[Updates to my AI Coding Workflow]]></title><description><![CDATA[As of April 2026]]></description><link>https://refactoring.fm/p/updates-to-my-ai-coding-workflow</link><guid isPermaLink="false">https://refactoring.fm/p/updates-to-my-ai-coding-workflow</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 08 Apr 2026 07:12:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c31c0da-a80c-463b-8804-c108402a8d19_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>About a month ago I wrote an article about my <a href="https://refactoring.fm/p/my-ai-coding-workflow">AI coding workflow</a>, and it <em>instantly</em> became the most popular Refactoring article of all time.</p><p>I received a lot of private comments, most of which can be organized into two categories:</p><ul><li><p>People wanting to learn more about the <strong>coding workflow</strong> itself.</p></li><li><p>People wanting to learn more about the <strong>note-taking</strong> <strong>app</strong> I am building.</p></li></ul><p>Both types of comments motivated me <em>a lot</em>, to the point where I decided to make all of this an official part of my Refactoring work, as follows:</p><ul><li><p>I am going to build this app for real, make it free and open source for everyone, and keep working on it as an ongoing effort.</p></li><li><p>I am going to report my learnings about AI coding as part of the regular writing schedule, let&#8217;s say once a month or so.</p></li></ul><p>I am convinced this is the right thing to do because, frankly, <strong>getting AI coding right is the #1 problem in software engineering</strong> today, and it&#8217;s not even close.</p><p>The economics of software are changing so much that there is no part of the process that is <em>safe</em>. Code reviews, QA, planning, staffing, traditional management &#8212; everything feels up for grabs and <em>downstream </em>of what happens with coding.</p><p>Also, while I love doing research and talking with others (e.g. on the podcast), opinions are so scattered across the board that I feel the strong need to try things myself, and do so in a serious, ongoing way.</p><p>So here is today&#8217;s agenda:</p><ul><li><p>&#128167; <strong>Building Tolaria</strong> &#8212; a personal knowledge management app for the age of AI.</p></li><li><p>&#129438; <strong>OpenClaw vs Claude Code</strong> &#8212; how I use them, and to do what.</p></li><li><p>&#128295; <strong>Coding workflow</strong> &#8212; what changed vs one month ago, and what stayed the same.</p></li><li><p>&#128209; <strong>ADRs</strong> &#8212; the best recent addition to my coding.</p></li><li><p>&#127912; <strong>Product workflow</strong> &#8212; how I create specs.</p></li><li><p><strong>&#128184; How much I am spending</strong> &#8212; because I know y&#8217;all want to know that.</p></li><li><p>&#129302; <strong>CLAUDE.md</strong> &#8212; bonus: my current Claude file, attached in full.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128167; Building Tolaria</h2><p>In the last article I said that what I was building didn&#8217;t matter much, well now it kinda does, because you are going to hear a lot more about it in the future.</p><p><strong><a href="http://tolaria.md/">Tolaria</a></strong> is a personal knowledge management app, extremely opinionated and tailored for my own personal use, but I hope it can be useful to others too.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BUFS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BUFS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 424w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 848w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 1272w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BUFS!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png" width="1200" height="1219.7802197802198" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:3089503,&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/193368488?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.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_!BUFS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 424w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 848w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 1272w, https://substackcdn.com/image/fetch/$s_!BUFS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4b8312-6b90-4b72-845a-32b773fd50fa_2934x2983.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s worth noting that this is not a particularly original idea. There exist plenty of tools in this space &#8212; Notion, Obsidian, Craft, Roam, and more &#8212; and most of them are very well made. Still, I know plenty of smart people who lately have been experimenting with weird setups. </p><p>Just last week, <a href="https://x.com/karpathy/status/2039805659525644595">Karpathy wrote a viral tweet</a> exactly about that.</p><p>Why such a renewed excitement around <strong>knowledge management</strong>? Because everyone who tries to work <em>seriously</em> with AI agents eventually understands that this is a core problem to solve: continuously <em>supplying</em> agents with reliable, up-to-date information about your life and work, and creating a good collaboration surface on these.</p><p>I suspect this still feels a bit abstract, so I&#8217;ll make a few examples from my own work:</p><ul><li><p>An agent should periodically fetch meeting summaries from tools like Fathom or Fireflies, create a note for the meeting with the summary and action items, and link the note to individual attendees (each of whom should have a page for themselves). If there are attendees who are <em>new</em>, the agent should create individual notes for each of them, enriching my personal CRM.</p></li><li><p>An agent should receive voice notes from me and turn them into long-term notes and tasks, and connect them to the relevant existing pages.</p></li><li><p>An agent should take every new article I write and split it into atomic evergreen ideas, connect them to similar ideas I have already saved in the past, and better organize my knowledge base so that it&#8217;s easier to write new articles in the future.</p></li><li><p>An agent should suggest new article topics and podcast guests based on my recent readings and how these connect to things I have written in the past and interviews I already did.</p></li></ul><p>In terms of intelligence required, most of these tasks are <strong>trivial</strong>. But they need a good collaboration surface 1) for agents to fetch the relevant info and 2) for me to work well with them.</p><p><a href="https://tolaria.md/">Tolaria</a> is my attempt to build this for myself first, and hopefully for some others too.</p><p>It will be completely<strong> free and open source</strong>, so that it also works as a <strong>visible artifact</strong> of my <em>understanding</em> of how to create products with AI, for other people to inspect.</p><p>At any given time, if you want to know e.g. what I write in my CLAUDE.md, or how I write docs, or what types of tests I write and which I don&#8217;t &#8212; you shouldn&#8217;t just <em>trust</em> my articles, you should be able to go to the repo and see for yourself.</p><p>This way, the ideas you read on Refactoring become the result of three things:</p><ul><li><p><strong>&#128218; Research</strong> &#8212; I read and collect experiences from others.</p></li><li><p>&#128172; <strong>Conversations</strong> &#8212; I go deeper by running community events and 1:1 podcast interviews.</p></li><li><p>&#128295; <strong>Personal work</strong> &#8212; I do coding and product development myself to stress-test these beliefs.</p></li></ul><p>All of these elements are meant to be <em>public</em>: you can get <a href="https://refactoring.fm/i/193052967/weekly-readings">weekly digests</a> of what I read, listen to the <a href="https://refactoring.fm/podcast">podcast conversations</a>, <a href="https://refactoring.fm/p/refactoring-community">join the community</a> to chat with me (and others), and inspect the Tolaria codebase (soon!) to see how I write code.</p><p>Tolaria is not ready yet but it will be in a couple of weeks!</p><p>So where are we today? Here is an exec summary. Since I started working on it around mid Feb, here is what I got:</p><ul><li><p><strong>1526 commits</strong> &#8212; that is ~30 commits/day on average</p></li><li><p><strong>~70K LOCs</strong> &#8212; about 45 lines / commit</p></li><li><p><strong>~3000 tests</strong> &#8212; about 85% coverage</p></li><li><p><strong>9.5/10 code health</strong> &#8212; as measured by CodeScene</p></li><li><p><strong>40+ ADRs</strong> &#8212; to track our core tech choices, plus three summary docs for Architecture, Abstractions, and Getting Started.</p></li></ul><p>That&#8217;s 2.5x the amount of code we had last month (we were at 20K LOCs), with better code health (9.5 vs 9.3), and better docs. I am still not writing any code, and I am still reading very little of it.</p><p>The product also got way better to the point where, by now, I have fully replaced my Notion workspace. It still feels surreal to say that out loud, after 6+ years of really intensive Notion usage, but here we are.</p><p>So let&#8217;s get into how I work on it, starting with coding &#128071;</p><div><hr></div><h2>&#129438; OpenClaw vs Claude Code</h2><p>In last month&#8217;s <a href="https://refactoring.fm/p/my-ai-coding-workflow">post</a> I said that basically I acted as CEO, OpenClaw worked as a PM, and Claude Code worked as a team of designers + engineers.</p><p>Has any of this changed? Yes, and no. Roles are still kinda the same, but I am not using Claude Code strictly <em>together</em> with OpenClaw anymore, in the sense that the latter directs the former, but more in an async way. This change has been driven by three reasons:</p><ul><li><p>&#128184; <strong>Cost</strong> &#8212; the initial workflow in which OpenClaw steered CC all the time was wildly inefficient in terms of token spend.</p></li><li><p>&#127891; <strong>Capabilities</strong> &#8212; CC has caught up with a lot of OpenClaw stuff. Most of all, it has loops now.</p></li><li><p>&#128110;&#8205;&#9794;&#65039; <strong>Legal</strong> &#8212; most recently, Anthropic has explicitly banned this type of usage, but to be fair I had stopped it already.</p></li></ul><p>So by now my OpenClaw and Claude Code work on separate things, in a completely asynchronous way:</p><ul><li><p>OpenClaw turns my inputs into product specs, checks on the general status of things, brainstorms new ideas, and in general does the work that benefits from <em>broad</em> context.</p></li><li><p>Claude Code does all the technical work, including coding, writing ADRs and docs, and, crucially, QA, that was done by OpenClaw before.</p></li></ul><p>OpenClaw doesn&#8217;t interact with Claude Code anymore, but it periodically checks that it doesn&#8217;t get stuck or crashes (which can happen for a variety of reasons). In that case, it restarts it.</p><div><hr></div><h2>&#128295; Coding workflow</h2><p>This article is largely meant to work as a <em>delta</em> vs my original AI coding article to highlight things that have changed, but it&#8217;s also worth noting the good stuff that <em>has not changed.</em></p><p>The highest leverage parts of the AI coding workflow are <em>still</em> probably the CI gates on <strong>code health</strong> and <strong>test coverage</strong>. These gates exist in two places:</p>
      <p>
          <a href="https://refactoring.fm/p/updates-to-my-ai-coding-workflow">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Grow your Software Factory]]></title><description><![CDATA[Rules, modules, and the path to AI leverage]]></description><link>https://refactoring.fm/p/growing-your-sofware-factory</link><guid isPermaLink="false">https://refactoring.fm/p/growing-your-sofware-factory</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 01 Apr 2026 07:02:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FXrO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last month I published <a href="https://refactoring.fm/p/the-era-of-the-software-factory">The Era of the Software Factory</a>, where I commented on the latest <a href="https://circleci.com/software-delivery-data-explorer/">State of Software Delivery</a> together with Rob Zuber, a good friend and CTO of CircleCI.</p><p>In that piece we argued that software engineering was undergoing a transformation from craftsmanship to factory work, with the gap between elite and average teams being more and more the result of good control systems and tight feedback loops, as opposed to individual brilliance.</p><p>Some will argue it has always been the case. Chasing 10x engineers has always felt like a dubious idea, with the healthy version being: let&#8217;s build a <a href="https://refactoring.fm/p/in-praise-of-normal-engineers">10x team</a>, instead.</p><p>Whether or not it felt true in the past, it certainly feels true now. The report showed that elite teams <em>today</em> &#8212; those that are getting the most out of AI &#8212; are exactly the ones who already had the best delivery infrastructure <em>yesterday</em> (i.e. 3 years ago). Today, these teams are both running their &#8220;factory&#8221; faster, and <em>improving</em> it faster. They are going faster than others, and accelerating faster, too.</p><p>So how do they do that? What does getting better look like? How do you even know it&#8217;s happening?</p><p>Let&#8217;s get practical and try to bridge this gap. Here is the agenda for today:</p><ol><li><p><strong>&#129518; DORA metrics are not enough </strong>&#8212; we need leading indicators of AI success</p></li><li><p><strong>&#128202; Specs, rules, and modules </strong>&#8212; a simple mental model for AI leverage in three steps</p></li><li><p><strong>&#129716; Making things compound </strong>&#8212; how to make things happen on your team</p></li></ol><p>Let&#8217;s dive in!</p><div><hr></div><p>I am grateful to Rob and the <a href="https://circleci.com/">CircleCI</a> team for partnering again on this piece. You can learn more about CircleCI below.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://circleci.com/&quot;,&quot;text&quot;:&quot;Learn more about CircleCI&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://circleci.com/"><span>Learn more about CircleCI</span></a></p><p>Disclaimer: even though CircleCI is a partner for this piece, I will only provide my unbiased opinion on all practices and tools we cover, CircleCI included</p><div><hr></div><h2>&#129518; DORA metrics and LOCs are not enough</h2><p>From the report above, we know there is a small group of teams leading the pack, with outrageous numbers like 2-3x throughput, and a large group of others that, on average, are getting <em>nothing</em> out of AI. Literally nothing. Zero. Nil.</p><p>And not because they are not trying! AI penetration with engineers is ~90% &#8212; basically everyone is using AI everyday for coding, but the <em>median team</em> is not getting any faster.</p><p>How do we know this? Because as of today, in 2026, we have a good understanding of how to measure the effectiveness of the software delivery process. For example, we can look at the DORA metrics. Whether or not you use AI in the dev process, we can track how long it takes for work to go through the pipeline, how many commits are made per day, what&#8217;s the success rate of these commits, and how fast you recover from mistakes.</p><p>These numbers give us a good idea of the <em>health</em> and effectiveness of the delivery process, and allow us to even <em>venture</em> into saying: &#8220;<em>this team is doing better than this other team!&#8221;</em>.</p><p>Sometimes they also allow us to say: this team is not doing <em>any</em> better than before &#8212; which is what <a href="https://circleci.com/resources/2026-state-of-software-delivery/">CircleCI found on average</a> in 2025:</p><ul><li><p>-6.8% commits in production</p></li><li><p>-14% deployment success rate</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_!1PHF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1PHF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 424w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 848w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 1272w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1PHF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png" width="1332" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1332,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105421,&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/192418439?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.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_!1PHF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 424w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 848w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 1272w, https://substackcdn.com/image/fetch/$s_!1PHF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F596f7853-4ea9-4fec-81c3-ce5f72a325f9_1332x608.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Depressing stats from the latest State of Software Delivery</figcaption></figure></div><p>DORA metrics are effective at measuring the impact of AI precisely because, counterintuitively, they ignore AI. They look at <strong>the output of the process</strong>, regardless of how the process is implemented.</p><p>This is both a blessing and a curse.</p><p>It&#8217;s a blessing because they stay close to where the value is, and it&#8217;s a curse because they are too high level to be <em>directly actionable</em>. Just like setting a goal of increasing business revenues by 10% doesn&#8217;t say much about what you need to do to get there, setting direct DORA metrics goals isn&#8217;t very useful, and can even backfire if you are not careful with it. E.g. it&#8217;s easy to increase the number of commits per day by splitting work into artificially small batches, and shipping just a few lines of code at a time just for the sake of pedaling faster.</p><p>So, DORA metrics are <strong>lagging indicators</strong>. They are good for assessing the <em>production level</em> of your factory, but they don&#8217;t tell you how to improve your stations. For that, we need <strong>leading indicators</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FXrO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FXrO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 424w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 848w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FXrO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png" width="1456" height="897" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:897,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:462366,&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/192418439?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.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_!FXrO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 424w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 848w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!FXrO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F939d8dd5-a30e-4c7f-96cd-560960e6c1fd_2110x1300.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Both leading and lagging indicators are useful &#8212; but at different things</figcaption></figure></div><p>The most convincing leading indicator for the SDLC is <strong>developer experience</strong>. There is plenty of research today that shows that <a href="https://refactoring.fm/p/the-listening-tour">improving developer experience</a> has outsized returns on the <em>lagging indicators</em> not only of the health of your engineering process, but of the business as a whole. This was already the core takeaway from <a href="https://refactoring.fm/p/accelerate">Accelerate</a>, exactly 10 years ago, and has only been confirmed ever since. About this, I particularly liked <a href="https://developerexperiencebook.com/">Frictionless</a> recently, by some of the same authors of Accelerate.</p><p>Developer experience, though, doesn&#8217;t say much about <strong>how we are using AI</strong>.</p><p>What are the <strong>leading indicators of AI success</strong>?</p>
      <p>
          <a href="https://refactoring.fm/p/growing-your-sofware-factory">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Telephone Game of Software]]></title><description><![CDATA[How to navigate the journey from intent to code]]></description><link>https://refactoring.fm/p/the-telephone-game-of-software</link><guid isPermaLink="false">https://refactoring.fm/p/the-telephone-game-of-software</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 25 Mar 2026 08:42:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b8713384-a4c2-4057-b6c2-731abcc0d68b_2382x1580.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My favorite <em>byproduct</em> of the AI shift in engineering is that it is making us think harder at workflows and ideas we have taken for granted for a long time.</p><p>In some cases, we even <em>invented</em> words we didn&#8217;t use before, like <em>context</em>, or, one of my favorite lately, <em>intent</em>. These words are <em>abstractions</em>&#8212;our bread and butter as engineers&#8212;and are born out of the necessity to discuss ideas, understand what&#8217;s going on, and improve how we work.</p><p>The <em>intent</em> concept is both important and, AFAIK, quite novel. These days you may hear it in sentences like &#8220;<em>making sure PMs&#8217; intent is captured into specs</em>&#8221;, or &#8220;<em>AI code should reflect the engineers&#8217; intent</em>&#8221;.</p><p>This angle frames software engineering as a <strong>translation act</strong> between something you want to achieve and what gets actually captured in <em>artifacts</em> like specs, UI design, up until code. If we continue this analogy, translation happens at every step, with different steps following different rules. Many engineering practices exist essentially to <em>reduce</em> the error rate of such translation.</p><p>So, seen through this lens, software development becomes an elaborated version of <a href="https://en.wikipedia.org/wiki/Telephone_game">the telephone game</a>. You win the game if the message is passed properly and ends up in&#8230; production.</p><p>That said, what the <em>steps</em> of the telephone game are (or should be), or what the best winning strategy is, frankly, it&#8217;s all up for discussion today. Should we write big specs beforehand? Should we keep human code reviews? <em>Who</em> should do this and that, and when, and how often?</p><p>Today I want to explore this, taking from what I have personally learned from my <a href="https://refactoring.fm/p/my-ai-coding-workflow">recent coding efforts</a>, and ideas I bounced off with <a href="https://www.linkedin.com/in/wattenberger">Amelia Wattenberger</a>, who <a href="https://refactoring.fm/p/what-comes-after-the-ide-with-amelia">I interviewed last week</a> on the podcast, and is joining me today on this piece.</p><p>So here is the agenda for today:</p><ul><li><p>&#128256; <strong>From intent to code</strong> &#8212; the journey of translating what you really want to do</p></li><li><p><strong>&#129521; Creating good platform</strong> &#8212; for each step of the journey, so AI doesn&#8217;t mess things up.</p></li><li><p><strong>&#128747; Staying at the right altitude</strong> &#8212; evolve your artifacts to match what you want to inspect</p></li><li><p><strong>&#128300; Using product to improve understanding</strong> &#8212; not just to <em>implement</em> it.</p></li></ul><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_!XE7W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XE7W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 424w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 848w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 1272w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XE7W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png" width="1456" height="482" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:482,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:969213,&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/191761060?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.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_!XE7W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 424w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 848w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 1272w, https://substackcdn.com/image/fetch/$s_!XE7W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6709e936-78a6-4eb6-9123-b2c127a1d998_2512x832.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p><em>Disclaimer: Amelia works at <a href="https://www.augmentcode.com/">Augment Code</a> and created <a href="https://www.augmentcode.com/product/intent">Intent</a>, a developer workspace with strong opinions about all of this. Augment is a long-time partner of Refactoring, I use it, I am a fan, and I am happy if you check it out.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.augmentcode.com/product/intent&quot;,&quot;text&quot;:&quot;Learn more about Intent&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.augmentcode.com/product/intent"><span>Learn more about Intent</span></a></p><p><em>However, we are not here to promote Augment today, but rather compare notes about problems and try to predict where the puck is going. (The puck, Luca? In a telephone game? Yes)</em></p><div><hr></div><h2>&#128256; From Intent to Code</h2><p>Starting from something you want to achieve on the product you are building, then it&#8217;s a <em>long way</em> to encode that into, well, code.</p><p>Intermediate steps may vary based on your process, but you probably have some version of these:</p><h3>1) Product intent</h3><p>A high-level, one or two-sentence version of what you want to build. It may only live in your head.</p><p>Making an example from my own experiments (I am building <a href="http://tolaria.md/">an editor</a>), let&#8217;s say I want to add <em>split panes</em>, like many editors have. In my head, that&#8217;s it. I don&#8217;t think about it a lot more.</p><h3>2) Product specs</h3><p>Product intent needs to be turned into a <em>spec</em>, like a PRD, which needs to stay <em>faithful</em> to my original intent, while deciding a lot more things.</p><p>How is this triggered? Is there a button? What does it look like? What about keyboard shortcuts? What happens if I drag a tab from one pane to the other? And more.</p><p>Some of these are just <em>additional detail</em>, but some might derail the feature in a direction I didn&#8217;t intend. For example, a legitimate interpretation might be to open up the tab in a new window, which is not what I want.</p><h3>3) UI/UX design</h3><p>Product specs are turned into design specs. What it looks like, how it behaves, where it lives.</p><h3>4) System design</h3><p>Product and design specs <em>inform</em> the strategy to implement this with code. Abstractions that should be reused or created, data structures (when relevant), migrations, instrumentation, testing, rollout and rollback, and more.</p><h3>5) Code!</h3><p>Finally, there&#8217;s code! All of this turns into a bunch of LOCs, to be pushed, reviewed, and released in prod.</p><p>Phew. That&#8217;s a lot of work.</p><p>Of course YMMV and you may skip creating actual <em>artifacts</em> for some of these steps, based on the complexity of the work at hand, and your team's workflows. But there are at least <strong>decisions to be made</strong> about all of these, even without the artifacts:</p><ul><li><p>Every step adds details that the previous kept implicit or simply did not consider.</p></li><li><p>Every step can act as a <em>lossy translation</em> of the original intent. It can miss important details or interpret them incorrectly.</p></li></ul><p>What is our goal with respect to this process? The ultimate goal is always to <strong>ship value to customers as fast as possible</strong>, so you can get feedback and iterate.</p><p>To ship fast you want to avoid <em>rework</em>: you want to reduce the misunderstandings between the various steps and the mistakes that would make work move backwards instead of forwards. You want code abstractions that match the PRD, a PRD that matches the product intent, and not getting to the point where a review fails and some of this gets back to the drawing board.</p><p>This angle is relevant with humans, and <em>especially</em> relevant with AI. AI models today are <em>really</em> good, and it feels most of their mistakes now come from <em>not understanding</em> what you wanted, rather than e.g. bad coding skills.</p><p>So how do you get good at this? The most convincing way, to me, is:</p><ul><li><p><strong>Creating good platform for each step</strong> &#8212; which acts as guardrails and helps you minimize the amount of <em>intent</em> you need to encode into specs.</p></li><li><p><strong>Use specs as active collaboration surface</strong> &#8212; updating it with more details as the work progresses, so it stays at the right altitude all the time. Kudos to Amelia for making me think about this.</p></li></ul><p>Let&#8217;s explore both &#128071;</p><div><hr></div><h2>&#129521; Create good platform for each step</h2>
      <p>
          <a href="https://refactoring.fm/p/the-telephone-game-of-software">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The State of Product Development 2026]]></title><description><![CDATA[Explore the insights from our biggest research ever.]]></description><link>https://refactoring.fm/p/the-state-of-product-development</link><guid isPermaLink="false">https://refactoring.fm/p/the-state-of-product-development</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 11 Mar 2026 09:49:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1dc5892c-24ee-4531-9e82-ae4584df99f0_2302x1534.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Once or twice a year we run a <strong>deep research survey</strong> in our newsletter to better understand trends in software development. We do this to collect broad, quantitative data, that complements the <em>qualitative</em> opinions we already get from podcast interviews, from our private community, and from my own 1:1 conversations.</p><p>Last year we explored AI adoption, while this year we decided to expand the scope and investigate what the whole <strong>product development process</strong> looks like for teams in 2026.</p><p>We chose this topic because I believe we need to look <em>beyond</em> coding. Coding is now cheaper and faster than ever, which, for many teams, is moving bottlenecks elsewhere.</p><p>But is that really the case? And, if so, <strong>where are the bottlenecks now?</strong></p><p>This is what we tried to uncover this year. A few weeks ago I wrote that the best way to find friction in your dev process was to simply ask your engineers, by doing what I called a <a href="https://refactoring.fm/p/the-listening-tour">Listening Tour</a>. This survey is like our own <em>listening tour</em>, done on <strong>340 teams</strong> &#8212; and we are here to report on findings.</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_!1JPf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1JPf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 424w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 848w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1JPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png" width="1456" height="947" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:947,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:822090,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.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_!1JPf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 424w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 848w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!1JPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d6432c1-4fe8-4b62-a651-0902a3ecf887_1626x1058.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>This research was made possible by our partnership with <a href="https://atono.io/?utm_campaign=274400984-2026%20%E2%80%93%20Asset%20%E2%80%93%20Context%20Gap%20Industry%20Report&amp;utm_source=refactoring_fm&amp;utm_medium=sponsored_article%E2%80%9D">Atono</a>.</p><p>Atono not only funded this work: they helped us with their expertise, insights from their customer base, and domain knowledge. I am a big fan of what they are building and how they think about product development. You should check it out!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://atono.io/?utm_campaign=274400984-2026%20%E2%80%93%20Asset%20%E2%80%93%20Context%20Gap%20Industry%20Report&amp;utm_source=refactoring_fm&amp;utm_medium=sponsored_article%E2%80%9D&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://atono.io/?utm_campaign=274400984-2026%20%E2%80%93%20Asset%20%E2%80%93%20Context%20Gap%20Industry%20Report&amp;utm_source=refactoring_fm&amp;utm_medium=sponsored_article%E2%80%9D"><span>Learn more about Atono</span></a></p><div><hr></div><p>So here is the agenda for today:</p><ol><li><p><strong>Demographics</strong> &#8212; a quick note on the data.</p></li><li><p><strong>The Planning Problem</strong> &#8212; why 60% of teams discover missing work mid-cycle, every cycle.</p></li><li><p><strong>AI in the Workflow</strong> &#8212; what teams are using AI for (and the one use case almost nobody has tried).</p></li><li><p><strong>The Experimentation Gap</strong> &#8212; why some teams are compounding their AI advantage while others stay stuck.</p></li><li><p><strong>The Way Forward</strong> &#8212; our conclusions, along with the three transitions we believe teams need to make.</p></li></ol><p>Let&#8217;s dive in!</p><div><hr></div><h2>&#128499;&#65039; Demographics</h2><p>We surveyed <strong>340 engineering professionals</strong> &#8212; a mix of ICs, tech leads, managers, and senior leaders &#8212; across companies ranging from 10-person startups to 1,000+ engineer orgs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YhoA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YhoA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 424w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 848w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YhoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png" width="1456" height="869" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:869,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132214,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.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_!YhoA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 424w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 848w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!YhoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c7eae-85ae-4160-b8a3-6597e340c738_1986x1186.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The survey was designed for depth over breadth: many questions were open-ended, and we reviewed every response manually. Each engineer took on average <strong>more than 15 mins</strong> to fill out the survey, so it was not quick, and it gives you an idea of the scale.</p><div><hr></div><h2>5&#65039;&#8419; The Five Problems</h2><p>To give you the bottom line up front, there are five key problems that tell the whole story:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aNg5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aNg5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 424w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 848w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aNg5!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png" width="1200" height="391.4835164835165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:440103,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.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_!aNg5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 424w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 848w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!aNg5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518c24de-f5ba-4947-a42e-eb009c587f8b_3142x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p><strong>Product requirements are</strong> <strong>confusing</strong> &#8212; Only 27% of engineers say both the problem and the success criteria are clear when they read a ticket. The counterintuitive part is that engineers are more likely to understand <em>why</em> something is being built rather than <em>what done looks like</em>. In many cases, teams share intent but lack a shared definition of the product behavior they&#8217;re trying to produce. The definition of done becomes the bigger knowledge gap.</p></li><li><p><strong>Planning is fragile, for companies of all sizes</strong> &#8212; 59% of engineering teams discover missing tasks, stories, or dependencies mid-cycle. This rate is flat from 10-person startups to organizations with 1,000+ engineers. Scale doesn&#8217;t fix it nor does it make it worse.</p></li><li><p><strong>Knowledge doesn&#8217;t get shared</strong> &#8212; 64% of teams store critical knowledge primarily in people&#8217;s heads. 1 in 8 say institutional knowledge simply disappears when someone leaves. And the bigger the company, the worse it gets. At companies with 1,000+ engineers, that rises to 17%.</p></li><li><p><strong>Shared AI context is still aspirational</strong> &#8212; half of the teams (52%) have simply no shared AI context. Each developer manages their own prompts, assumptions, and product definitions. In practice, this means the same AI tools often operate with different understandings of the product across the same team. Large companies are significantly worse at this than small startups (75% vs. 51%).</p></li><li><p><strong>AI isn&#8217;t much used for product</strong> &#8212; Only 9% of teams use AI to generate or help with product requirements. This is the use case most directly tied to every planning problem in this report, and almost nobody is doing it. Teams use AI to write code while upstream problems that cause rework go untouched.</p></li></ol><p>These numbers point to a few larger problems:</p><ol><li><p>Most teams have adopted AI for coding, and little else.</p></li><li><p>Teams that adopted AI on top of a process that was already fragile&#8212;unclear specs, tribal knowledge, undocumented decisions&#8212;aren&#8217;t getting a lot out of it.</p></li><li><p>Teams getting the best results are the ones who had a solid product dev process before AI arrived. This is the same insight we found <a href="https://refactoring.fm/p/the-era-of-the-software-factory">for coding</a> a few weeks ago, which we can now extend to product.</p></li></ol><p>So let&#8217;s dive into the details!</p><div><hr></div><h2>&#128506;&#65039; The Planning Problem</h2><p>It&#8217;s a common belief that engineering teams are plagued by rework and missing requirements. This is confirmed by data:</p><ul><li><p>59% of teams <strong>discover missing tasks</strong>, stories, or dependencies mid-cycle.</p></li><li><p>60% of engineers say they <strong>need clarifying questions</strong> &#8220;often&#8221; or &#8220;almost always&#8221; before starting work. Only 8% say tickets give them everything they need.</p></li></ul><p>When we asked what causes the most delays and rework, the top answer was ambiguous or <strong>missing acceptance criteria</strong> (50%), followed by edge cases discovered too late (40%).</p><p>We tend to assume requirements failures start with poor problem definition, but the data says the gap is usually at the other end, at the <strong>definition of done</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_EC-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_EC-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 424w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 848w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 1272w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_EC-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png" width="1456" height="936" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:215944,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.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_!_EC-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 424w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 848w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 1272w, https://substackcdn.com/image/fetch/$s_!_EC-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83d78a4-5d43-4841-9bc0-25e836cea163_2010x1292.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>35% of engineers say they understand the problem but not the success criteria. Only 13% have the inverse problem. Engineers are more likely to understand why something is being built than<strong> what </strong><em><strong>done</strong></em><strong> looks like.</strong></p><blockquote><p><em>&#8220;Developer&#8217;s understanding of the story. They don&#8217;t ask enough questions during grooming which leads to incomplete ticket/story. At the same time POs provide very generic acceptance criteria making it difficult to reach the expectations.&#8221;<br><br>&#8212; Tech Lead</em></p></blockquote><p>The mid-cycle discovery rate makes this more concrete: 59% say they find out mid-sprint that a task is bigger than expected, a dependency was missed, or a design doesn&#8217;t match the implementation. This rate barely changes with company size. 10-person startups and 1,000-engineer organizations report nearly identical numbers. The &#8220;planning problem&#8221; isn&#8217;t a size or scale problem.</p><p><strong>Requirements are also the #1 team bottleneck</strong>, by a wide margin. 35% of teams cite unclear or changing specs as the thing that most often slows the whole team down &#8212; twice the rate of the next item (QA and testing, at 16%).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Io-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Io-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 424w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 848w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 1272w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Io-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png" width="1456" height="1131" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1131,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161972,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.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_!6Io-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 424w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 848w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 1272w, https://substackcdn.com/image/fetch/$s_!6Io-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5eb3c05-4ed0-4fd0-999e-82650171134c_1704x1324.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><em>&#8220;Most delays happen due to unclear or changing requirements that reveal hidden complexity once work begins.&#8221;<br><br>&#8212; Software Engineer</em></p></blockquote><p>Part of why this persists is <strong>where product knowledge lives</strong>.</p><p>Two teams out of three store critical knowledge <em>primarily</em> in people&#8217;s heads. 57% say it&#8217;s scattered across Notion, Confluence, and Google Docs. 1 in 8 say it simply gets lost when someone leaves. Standard, agreed upon solutions for documenting technical decisions (like ADRs) are used by only 1 in 5 teams.</p><p>It goes without saying that when context lives only in people&#8217;s heads: it can&#8217;t be handed off cleanly, it can&#8217;t be referenced asynchronously, and it can&#8217;t be used by AI.</p><blockquote><p><em>&#8220;Knowledge is scattered across Jira, docs, and code lives in multiple microservices working on different domains.&#8221;<br><br>&#8212; Engineering Manager</em></p></blockquote><div><hr></div><h2>&#129668; AI in the Workflow</h2><p>It&#8217;s a common belief that AI has transformed how engineering teams work. The data seems to confirm this &#8212; but with an important caveat about <em>where</em> that transformation is happening.</p><p>95% of teams use AI in some form, and 80% use it substantially. So the question has shifted from &#8220;<em>are you using AI</em>?&#8221; to &#8220;<em>are you using it for the right things?</em>&#8221;</p><p>The answer, for most teams, seems to be <em>no</em>. The top AI use cases look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-vMh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-vMh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 424w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 848w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-vMh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png" width="1456" height="895" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:895,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:196685,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.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_!-vMh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 424w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 848w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!-vMh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa392eb38-82aa-40c6-b1ea-32b3007402e4_2262x1390.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That last number is worth focusing on. Writing good requirements&#8212;the use case most directly tied to every planning problem we covered in the previous section&#8212;is used by fewer than 1 in 10 teams.</p><p>AI is being applied downstream, but a lot of problems live upstream.</p><p><strong>Shared context is the other missing piece.</strong> When we asked how teams manage AI context, the majority answer was straightforward: they <em>don&#8217;t</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qFED!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qFED!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 424w, https://substackcdn.com/image/fetch/$s_!qFED!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 848w, https://substackcdn.com/image/fetch/$s_!qFED!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 1272w, https://substackcdn.com/image/fetch/$s_!qFED!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qFED!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png" width="728" height="234" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:468,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:160838,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.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_!qFED!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 424w, https://substackcdn.com/image/fetch/$s_!qFED!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 848w, https://substackcdn.com/image/fetch/$s_!qFED!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 1272w, https://substackcdn.com/image/fetch/$s_!qFED!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb861df6-2308-46c7-8032-5defdd2a944a_1902x612.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p>54% said each developer manages their own prompts individually, with no shared infrastructure.</p></li><li><p>Only 29% use shared files in the repo (AGENTS.md, CLAUDE.md, Cursor rules).</p></li><li><p>Only 3% intentionally organize context in their existing docs and tickets, for AI tools to access it.</p></li></ul><p>This matches what Doug, Atono&#8217;s CPO, predicted before we ran the survey:</p><blockquote><p><em>&#8220;[What we see so far is that] the greatest consumers of AI-coding are very clever developers who piece together a number of components... so only that clever developer is excelling.&#8221;</em></p></blockquote><p>One engineer also described the mess directly:</p><blockquote><p><em>&#8220;If I want to leverage a Notion doc, a Slack thread, a Jira ticket, and the actual codebase [&#8230;] I have to manually copy and paste relevant context into the tool I plan to use.&#8221;</em><br><br>&#8212; Software Engineer</p></blockquote><p>If planning problems were evenly distributed across companies of all sizes, with context problems, enterprises are the ones doing significantly worse. Companies with 500&#8211;1,000 engineers have &gt;75% of developers managing AI context individually, vs small startups at 51%. More resources don&#8217;t produce more shared practices.</p><p>People are also generally aware of this: 54% of respondents agree that most AI quality problems are actually context problems. Leadership agrees even more than ICs. So it seems this is not an <em>awareness</em> problem, but rather about most teams not (yet) doing intentional work to bridge the gap.</p><p><strong>AI is also expanding what individual engineers can do.</strong> 74% of engineers say AI has helped them work outside their primary specialty, and 59% are handling more of the product process than a year ago:</p><ul><li><p>Tech leads report the highest scope expansion (72%)</p></li><li><p>Engineering managers the lowest (48%)</p></li></ul><p>This pattern appeared in our last report too. Classic line management hasn&#8217;t been transformed by AI yet, at least not how much ICs have.</p><p>In general, the <em>product engineer thesis</em> holds: AI is accelerating the shift toward engineers owning more of the full product cycle. But without shared context infrastructure, the expanded scope creates <strong>individual-level fragility </strong>rather than team-level leverage.</p><div><hr></div><h2>&#129514; The Experimentation Gap</h2><p>There is a clear divide in how teams approach AI learning, and it predicts almost everything else.</p><p><strong>44% of teams have no dedicated time for AI experimentation at all.</strong> They do it on the side, squeezed between deadlines. 31% allow some slack informally. Only 17% have explicit, dedicated time, whether it&#8217;s a fixed share of their capacity (e.g. ~10%) or a more structured program.</p><p>Out of these cohorts, teams with dedicated experimentation time are substantially more optimistic about the year ahead and report better results with AI. This isn&#8217;t exactly a surprise: deliberate practice compounds, while winging it stays shallow.</p><blockquote><p><em>&#8220;The usage of AI needs to be learned on the job while adhering to deadlines.&#8221;</em><br>&#8212; Software Engineer</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jA-1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jA-1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 424w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 848w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 1272w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jA-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png" width="1456" height="618" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:618,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192327,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.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_!jA-1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 424w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 848w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 1272w, https://substackcdn.com/image/fetch/$s_!jA-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92c2b6cf-dabd-4fa3-9a7f-a82421dbd97b_1988x844.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Only one team out of four has some official time dedicated to AI experimentation</figcaption></figure></div><p>By going through the open answers about this, the feeling is that, when AI learning happens on the side, under deadline pressure, engineers just stick to what works. This means they are more likely to get stuck into <strong>local optima</strong>, and never discover workflows that would significantly change their output. That takes trial and error, and most of all, time.</p><p>The teams getting the most out of AI are, by and large, those who have <strong>just more time</strong> to figure things out.</p><p>The possibly clearest signal about this is <strong>the optimism gap</strong>. Teams with dedicated experimentation time are significantly more optimistic about the year ahead. Those without it cluster around neutral. </p><p>In other words, time spent on in AI learning is a leading indicator: investment today predictably shows up in results later.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JF7E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JF7E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 424w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 848w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 1272w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JF7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png" width="1396" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:1396,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84800,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.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_!JF7E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 424w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 848w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 1272w, https://substackcdn.com/image/fetch/$s_!JF7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0249d120-7aa2-405c-9a83-1e4ef3f89eb5_1396x896.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The more time engineers can spend on AI experimentation, the more optimistic they are about it.</figcaption></figure></div><div><hr></div><h2>&#128301; The Way Forward</h2><p>All in all, the data in this report points to gaps that are organizational rather than technical. The tools exist. The adoption is near-universal. What&#8217;s missing is infrastructure: context, clarity, and shared practices that make these tools work.</p><p>We believe <strong>three transitions</strong> define the difference between teams that are compounding their AI advantage and teams that are stuck into running a broken process faster:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lXI3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lXI3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 424w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 848w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 1272w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lXI3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png" width="1456" height="801" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:801,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212403,&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/190368764?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.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_!lXI3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 424w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 848w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 1272w, https://substackcdn.com/image/fetch/$s_!lXI3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03337f87-9f83-49c7-8b19-840dee3735cf_1764x970.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>1) From individual AI usage to team-level AI context</h3><p>52% of teams have each developer managing their own prompts, with no shared infrastructure. Instead, the teams pulling ahead treat context as a shared resource: documented decisions, shared prompts, and product knowledge organized so AI can actually reach it.</p><p>This requires treating context as a team asset rather than a personal one. Not a big investment, but a daily, compounding one.</p><h3>2) From accelerating execution to improving problem framing</h3><p>Only 9% of teams use AI to generate requirements and acceptance criteria.</p><p>This is the highest-leverage untapped use case in this entire report. Before using AI to write more code, teams should ask whether the work is well-defined enough for AI to help at all. Garbage in, garbage out. So, with AI, it&#8217;s more garbage, faster!</p><h3>3) From side-hustle AI learning to structured experimentation</h3><p>Half of teams have no dedicated time for AI learning. Conversely, numbers show that deliberate practice is the only path to compounding returns.</p><p>Teams that carve out even a small amount of time&#8212;10% of capacity, or a monthly experiment day&#8212;consistently outperform teams that treat AI learning as something to do between tasks.</p><p>Overall, this research confirms the role of AI as an amplifier of whatever you already have. Good context practices become great enablers. Fragile planning becomes more fragile, at higher speed. The teams that had their house in order before AI are now compounding that advantage.</p><p>The good news is that getting your house in order is not a moonshot. It starts with daily decisions being captured in writing instead of a Slack thread. One set of acceptance criteria generated before development begins. One afternoon a month to experiment with AI without a deadline attached.</p><p><strong>The gap is real, but it&#8217;s also closable.</strong> Let&#8217;s get to work!</p><p>See you next week!</p><p>Sincerely &#128075;<br>Luca</p><div><hr></div><p><em>I want to thank again Megan, Doug, and the whole Atono team for supporting this work. I am a fan of what they are building &#8212; you can check it out below </em>&#128071;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://atono.io/?utm_campaign=274400984-2026%20%E2%80%93%20Asset%20%E2%80%93%20Context%20Gap%20Industry%20Report&amp;utm_source=refactoring_fm&amp;utm_medium=sponsored_article%E2%80%9D&quot;,&quot;text&quot;:&quot;Learn more about Atono&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://atono.io/?utm_campaign=274400984-2026%20%E2%80%93%20Asset%20%E2%80%93%20Context%20Gap%20Industry%20Report&amp;utm_source=refactoring_fm&amp;utm_medium=sponsored_article%E2%80%9D"><span>Learn more about Atono</span></a></p>]]></content:encoded></item><item><title><![CDATA[The New Pyramid of Software Engineering 🏔️]]></title><description><![CDATA[The three pillars you should take care of, and some questions you should ask yourself]]></description><link>https://refactoring.fm/p/the-new-pyramid-of-software-engineering</link><guid isPermaLink="false">https://refactoring.fm/p/the-new-pyramid-of-software-engineering</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 04 Mar 2026 08:01:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3302732b-3303-4dfa-916f-0ad44253312d_2164x1438.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are a lot of opinions around these days about the future of software, including of course <a href="https://refactoring.fm/p/the-era-of-the-software-factory">my own</a>.</p><p>If you run an engineering team, though, most of these opinions won&#8217;t feel useful to you. In fact, when I talk with people about e.g. some <a href="https://refactoring.fm/p/my-ai-coding-workflow">AI workflow</a>, I usually get two types of objections:</p><ol><li><p><strong>Volatility</strong> &#8212; the advice may become obsolete in just a few months, or weeks.</p></li><li><p><strong>Applicability</strong> &#8212; the advice doesn&#8217;t seem to apply to their team, because of X, Y, Z.</p></li></ol><p>These problems often come together. I&#8217;ll give an example.</p><p>One of the recent trends about how to work with AI, on which there is more consensus, is <strong>Spec-Driven Development</strong>. There exist <a href="https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html">plenty of articles and frameworks</a> to work with it, even created by prominent companies like Github. So it&#8217;s not <em>a total</em> consensus, mind you, but it&#8217;s about as much as you can get in these messy times.</p><p>Still, as a CTO, you may have legitimate worries:</p><ul><li><p>Is this worth investing in? Or may the AI tomorrow (i.e. next month) just figure out more of the specs by itself?</p></li><li><p>Is this a good fit for <em>our team</em>? How do we harmonize it with how we have been creating PRDs and design docs up until now? Is there a way to work with AI that leverages how we already work, without the need to <em>migrate</em> to a different workflow?</p></li></ul><p>These questions are 100% valid, and the result is often <strong>analysis paralysis</strong>: teams <em>underinvest</em> in AI because no approach feels durable or authoritative enough to graduate from <em>individual experiment</em> to <em>team</em> <em>practice</em>.</p><p>I believe the main problem is that most ideas are just <strong>tactical</strong>. They <em>may</em> work, but need to be placed within a bigger strategy &#8212; a wider map of how to think about our teams, AI, and how to work together.</p><p>So today I want to write about the ideas that <strong>feel the most durable</strong> to me, and on which I am confident we can create good foundations.</p><p>These ideas come from many places:</p><ul><li><p>My own experiments &#8212; as you saw <a href="https://refactoring.fm/p/my-ai-coding-workflow">last week</a>.</p></li><li><p>Talking with 100+ tech leaders &#8212; this year alone in 1:1s, masterminds, and community threads</p></li><li><p>Our own industry report &#8212; where we surveyed 350+ teams and which we&#8217;ll release in March</p></li><li><p>Our cohort program &#8212; where I work with a small group of ~10 CTOs and VPs to help their teams ship faster.</p></li></ul><p>All in all it&#8217;s like a small <em>think tank</em>, and I am here to report findings!</p><p>These findings are actually quite simple (like all good models!), and are about three areas:</p><ol><li><p><strong>&#128295; Developer Experience</strong></p></li><li><p><strong>&#129668; AI</strong></p></li><li><p><strong>&#127912; Product Engineering</strong></p></li></ol><p>In my experience so far, these areas work like layers of a pyramid. Each layer <em>creates</em> <em>value</em> only if what&#8217;s beneath is taken care of. Think of it like Maslow&#8217;s pyramid of software engineering.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LDz_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LDz_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 424w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 848w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 1272w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LDz_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png" width="1456" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189244,&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/189655863?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.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_!LDz_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 424w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 848w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 1272w, https://substackcdn.com/image/fetch/$s_!LDz_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F798117bf-c8f8-4a75-955c-7ddaac426c28_2016x946.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So let&#8217;s explore them one by one, recap what we know about them as of today, and how they work together for good.</p><div><hr></div><h2>&#128295; Developer Experience</h2>
      <p>
          <a href="https://refactoring.fm/p/the-new-pyramid-of-software-engineering">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[My AI Coding Workflow]]></title><description><![CDATA[To ship high-quality software that you don't need to write (or... read).]]></description><link>https://refactoring.fm/p/my-ai-coding-workflow</link><guid isPermaLink="false">https://refactoring.fm/p/my-ai-coding-workflow</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 25 Feb 2026 08:25:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b48c3e1-3c66-4975-8ec5-44d399f73dc2_2238x1490.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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 <a href="https://www.linkedin.com/feed/update/urn:li:activity:7430601338872328193/?originTrackingId=%2BiRqsayUMhj%2FdtqmRX6GiQ%3D%3D">I personally know</a> who are having close to all of their code written by AI, and are having the time of their lives.</p><p>And it&#8217;s not random teams: it&#8217;s usually the best ones. If you don&#8217;t trust my anecdotal evidence, just look at <a href="https://refactoring.fm/p/the-era-of-the-software-factory">recent reports</a>. The very best teams, who had the best DX and code quality <em>before</em> AI, are the same who are getting the most out of AI today.</p><p>Still, it&#8217;s not 100% clear <em>how</em> these teams work with AI. The internet is full of opinion pieces and people sharing their CLAUDE.md files, but these feel tactical at best, and dubious/fake at worst.</p><p>I don&#8217;t want to add more of these. The proof is in the pudding, so I said to myself: <strong>if I want to write about AI coding, I need to build something</strong>.</p><p>So here we go.</p><p>For the last 17 days, I have been working on a personal project for a macOS app. Scope and complexity are daunting enough to force me to think architecture, buy vs build, performance, rich UI, and everything I would need to cover in a real&#8212;not toy&#8212;software project. And needless to say, I would <em>never</em> be able to pull this off without AI.</p><p>Before I give you more details, let&#8217;s start with what I got today so far:</p><ul><li><p>772 commits in 17 days, for ~20,000 lines of code overall.</p></li><li><p>90% test coverage &#8212; via 500+ unit, integration, and E2E tests.</p></li><li><p>9.3/10 code health &#8212; as measured by CodeScene.</p></li><li><p>A clear, hierarchical set of docs &#8212; to navigate architecture, abstractions, and codebase structure.</p></li><li><p>A perfectly usable MVP &#8212; which I am, in fact, using every day.</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_!lQzJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lQzJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 424w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 848w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 1272w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lQzJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png" width="1456" height="646" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:646,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128278,&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/189024124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.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_!lQzJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 424w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 848w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 1272w, https://substackcdn.com/image/fetch/$s_!lQzJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43cda95e-8adf-459c-9807-5faac3c2fb9d_1636x726.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I figured out and improved various parts of the workflow over time, so that now I am comfortable with:</p><ul><li><p>Not writing any code.</p></li><li><p>Not reading <em>almost</em> any code. Say I read ~5% of it.</p></li><li><p>Not providing UI design for ~90% of the features.</p></li><li><p>Managing most interactions async via voice notes.</p></li><li><p>Having AI work autonomously for long stretches of time, so I can do something else in the meantime.</p></li></ul><p>So let&#8217;s dive into all of this, in detail. Here is what I am going to talk about:</p><ul><li><p>&#128421;&#65039; <strong>What I am building</strong> &#8212; because nothing else matters.</p></li><li><p>&#127912; <strong>My product workflow</strong> &#8212; how I work as a PM.</p></li><li><p>&#128300; <strong>How I keep tech quality</strong> &#8212; how I work as a CTO, without reading the code.</p></li><li><p>&#128176; <strong>How much I spent </strong>&#8212; the numbers nobody shows.</p></li><li><p>&#128302; <strong>What&#8217;s next</strong> &#8212; my takeaways so far, and some obvious predictions.</p></li></ul><div><hr></div><h2>&#128421;&#65039; What I am building</h2>
      <p>
          <a href="https://refactoring.fm/p/my-ai-coding-workflow">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>