<?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>Sat, 13 Jun 2026 22:28:11 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[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;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;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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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><em>As always, I want to thank Rob and the great CircleCI folks for partnering on this piece. I loved bouncing ideas off with them, and I am a fan of how they are trying to reinvent software validation for the AI era. You can learn more below </em>&#128071;</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><em>Disclaimer: in the article I only wrote my unbiased opinion about all practices and tools mentioned, CircleCI included</em><strong> </strong></p><div><hr></div><h2>&#128201; The default path is degradation</h2><p>Anyone who has worked in human software teams for years &#8212; teams that work on the same codebase over a long period of time, teams that grow, shrink, rotate, and do all the things that human teams do &#8212; knows that the default trajectory is not an <em>improving</em> one. It&#8217;s not even <em>staying put</em>.</p><p>Over time, the default is <strong>getting worse</strong>.</p><p>Codebases become a mess, large teams ship less than small teams (per engineer, but often as a whole), and products get shitty.</p><p>There are exceptions of course, but this is the reality of engineering for probably 90% of teams.</p><p>I think it&#8217;s exactly this bias, plus the fear of losing control over code, that makes us happy with AI <em>just</em> getting things right. Good enough. If we get moderately faster through this, and don&#8217;t degrade over time, that&#8217;s a victory already!</p><p>And that&#8217;s true, but what if we don&#8217;t stop there? What if the default becomes that <strong>things get better over time</strong>, instead of worse?</p><p>What if, for any change, instead of asking &#8220;<em>is this good enough to ship?</em>&#8221; we asked ourselves: &#8220;<em>does this change make the next easier/safer/cheaper</em>&#8221;?</p><p>In other words, a world in which, over time:</p><ul><li><p><strong>The team gets faster</strong> &#8212; both individually and as a whole.</p></li><li><p><strong>AI gets more accurate</strong> &#8212; because tech and product get better understood.</p></li><li><p><strong>The codebase gets better</strong> &#8212; because of the aggregated understanding of the problem, the continuous refinement of the abstractions, and the collective time spent on making things right.</p></li></ul><p>This has been discussed in recent times already, and often goes by the name of <a href="https://lethain.com/everyinc-compound-engineering/">compound engineering</a> &#8212; but it&#8217;s still unclear how to pull it off.</p><p>So today we are taking a stab at what <strong>real-world compound engineering</strong> might look like, based on the actual tools available, and our respective experience:</p><ul><li><p>Rob has the privileged vantage point of overseeing the workflows of tens of thousands of teams via <a href="https://circleci.com/">CircleCI</a>. CI is the <em>crossroads</em> through which most software activity <em>has</em> to go through, so it&#8217;s perfect to spot patterns, see what works, and what doesn&#8217;t.</p></li><li><p>On my end, <a href="https://refactoring.fm/p/introducing-tolaria">I have been building Tolaria</a> for several months now (p.s. we got to 8K stars on <a href="https://github.com/refactoringhq/tolaria">Github</a>!), have written 100K+ lines of code for it in over 2000 commits, and have developed strong opinions about the state of AI coding today.</p></li></ul><blockquote></blockquote><div><hr></div><h2>&#128027; What causes teams to degrade</h2><p>I like to address problems by <em>inversion</em>, so to figure out how to make things get better, I like to start by reflecting on what makes them worse &#8212; and then avoid that!</p><p>We could spend weeks just debating this, but I&#8217;ll keep things simple and give you my top three candidates for what makes engineering teams (and products) degrade over time:</p><h3>1) Coding hygiene</h3><p>There is an obvious baseline of coding hygiene that helps keep things maintainable, like:</p><ul><li><p><strong>&#128300; Good testing coverage</strong> &#8212; made of actual good tests (see <a href="https://medium.com/@kentbeck_7670/test-desiderata-94150638a4b3">Kent Beck&#8217;s desiderata</a>)</p></li><li><p><strong>&#129658; Good code health</strong> &#8212; high cohesion, low cyclomatic complexity, small files, no bumpy roads, etc.</p></li><li><p><strong>&#129521; Good basic abstractions</strong> &#8212; that encapsulate <em>domain language</em>, instead of using language primitives all the time.</p></li></ul><p>A key characteristic of coding hygiene is that it is largely domain agnostic. In fact, it can be easily evaluated by automatic tools that know nothing about your product.</p><p>It&#8217;s also, honestly, <strong>hard to maintain</strong>. Writing good tests is hard for a variety of reasons, they pose nasty tradeoffs and cause endless fights for time to market. Good code health is easier said than done, and even basic abstractions are often challenging.</p><p>So I empathize with teams that struggle with these &#8212; but nevertheless, these are the basics. What comes next is harder.</p><h3>2) Capturing knowledge</h3><p>If there is a single thing that <em>compounds</em> in life, it is knowledge. Knowledge is leverage, and teams are generally very bad at capturing and growing their collective knowledge.</p><p>First of all, they capture very little: no records of their decisions, no snapshots of what exists today (in whatever format), no vision/mission statements.</p><p>Also, most often no playbooks on how to do things: from designing features, to coding specific parts of the product, to operating systems in prod.</p><p>Again, I am not faulting anyone for this. Writing things down is hard, and keeping them updated is even harder.</p><h3>3) Building the wrong thing</h3><p>As a result of dubious knowledge + poor hygiene, we often end up <strong>building the wrong things</strong>.</p><p>And the more wrong things we build, the harder it becomes to steer a codebase, because of little residual design space (from bad abstractions), little confidence in changes (from little testing), and so on.</p><p>Again, these are all things that, <em>by default</em>, get worse with time. We know this from research. Large and old orgs, vs small and young ones, perform worse on all dimensions:</p><ul><li><p>Code health is worse.</p></li><li><p>Institutional knowledge is less shared.</p></li><li><p>Product moves slower.</p></li></ul><p>So how do we not only <em>stop</em> the trend, but invert it? Let&#8217;s take on these one by one &#128071;</p><div><hr></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!alN4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!alN4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 424w, https://substackcdn.com/image/fetch/$s_!alN4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 848w, https://substackcdn.com/image/fetch/$s_!alN4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 1272w, https://substackcdn.com/image/fetch/$s_!alN4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!alN4!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png" width="1200" height="429.3956043956044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:521,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:200363,&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/195748040?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.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_!alN4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 424w, https://substackcdn.com/image/fetch/$s_!alN4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 848w, https://substackcdn.com/image/fetch/$s_!alN4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 1272w, https://substackcdn.com/image/fetch/$s_!alN4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2d97bf8-6be6-48af-9ff5-2196f8d60cee_2336x836.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#128300; Improving code hygiene</h2><p>As a result of AI writing the code, you can&#8212;and should&#8212;enforce it to write good code.</p><p>In my experience, you can do so by combining:</p><ul><li><p><strong>Rules and skills</strong> &#8212; about <em>what</em> the agent should do (e.g. always write tests) and <em>how</em> it should do it (e.g. what makes for a good test?)</p></li><li><p><strong>Gates</strong> &#8212; agents often simply <em>ignore</em> rules, so you need gates that enforce these rules. Code health above X, test coverage above Y, and so on.</p></li></ul><p>There are a ton of tools today that can automatically check for anything you can think of, and I am personally a fan of integrating them both in the CI (as usual), and as local hooks (e.g. with <a href="https://typicode.github.io/husky/">Husky</a>), to shift things <em>left</em> and let AI find problems earlier. Rob believes this is where <em>validation</em> infra needs to go: creating environments fast enough, real enough, and context-aware enough for agents to validate against before code reaches shared infrastructure.</p><p>There is also hygiene work that comes from regular maintenance, <em>after</em> the code is in prod. This is classic KTLO, from updating dependencies, to fixing small bugs, investigating failures in logs, and more.</p><p>This is all work where today AI can give you an incredible hand. What used to be recurring grunt work for your team, can turn into recurring automations that lead to PR drafts. You can create some for:</p><ul><li><p>Proposing dependency updates</p></li><li><p>Scanning for security vulnerabilities, from well-known online lists</p></li><li><p>Fetch insights from Sentry and your instrumentation to auto-fix bugs before you are even aware of them</p></li></ul><p>Personally, for Tolaria I have a hourly automation that:</p><ul><li><p>Scans Sentry logs and Github issues reported by users</p></li><li><p>Investigates and tries to reproduce them</p></li><li><p>When considered worth it, it creates tasks for the Codex/Claude queue</p></li><li><p>Bug tasks (as opposed to features) are automatically taken in charge and a fix is drafted for me to review.</p></li></ul><p>Is this perfect? No. Does it create duplicates, false positives, or simply interpret things wrong? Yes! But does it help reduce my cognitive load and effort on these? Absolutely!</p><blockquote></blockquote><div><hr></div><h2>&#128218; Capturing knowledge</h2><p>AI is fantastic at summarizing, expanding, moving, and overall <em>processing</em> content &#8212; but only if you capture it first!</p><p>And today, frankly, you should <strong>capture just about everything</strong>, exactly because of how cheap it is to process and maintain such information.</p><p>So you should capture:</p><ul><li><p><strong>Raw inputs</strong> &#8212; like meetings, brainstorming docs, things where you are <em>diverging</em>, not <em>converging.</em></p></li><li><p><strong>Decisions</strong> &#8212; e.g. ADRs in tech, but also product insights, directions you <em>decided</em> to go, and all the <em>whys</em> that the AI can&#8217;t figure out by itself by simply looking at the <em>what</em>.</p></li><li><p><strong>What exists today</strong> &#8212; I call these <em>recap</em> docs, because I believe they should be built as summaries of smaller, atomic things. You can put together a big ARCHITECTURE.md doc as a combination of the ADRs, or the product version of it by combining PRDs and specs. This is 100% AI territory today: you provide human input about single features, but leave the <em>plumbing</em> around content orchestration to the AI.</p></li></ul><p>All this stuff needs workflows to be created to capture data, process it, keep it in sync, and so on &#8212; but honestly, it&#8217;s all easy! We are engineers! And the leverage over time is incredible. So there is zero excuse not to do so.</p><blockquote></blockquote><div><hr></div><h2>&#128296; Building the right thing</h2><p>If you do the above right, the result will be building more <em>right</em> things, as opposed to <em>wrong</em> things:</p><ul><li><p>Things that build nicely on top of what already exists</p></li><li><p>Things that are coherent with past decisions</p></li><li><p>Things that work and do not degrade your codebase</p></li></ul><p>Above all, things that actually <em>improve</em> your codebase &#8212; because they record <em>more</em> decisions, say no to the things that are wrong, and yes to those that are right.</p><p>And those no&#8217;s and yeses stay there to help make better decisions in the future.</p><p>Also, such <em>compounding</em> can and should happen in all of your environment, not just the codebase: build history, pipeline patterns, team context, baked in and available over time, so agents can validate more, debug better, assess if code runs, and, most of all, if they are building the right things.</p><blockquote></blockquote><div><hr></div><h2>&#127933; Empowering managers</h2><p>I want to close by spending a few words about managers, who are often neglected in this AI conversation.</p><p>&#8220;Managers are in trouble&#8221;, &#8220;AI is for builders&#8221;, &#8220;everyone is back to coding&#8221;, and so on.</p><p>Guys, all the stuff we discussed is <em><strong>peak</strong></em><strong> manager work</strong>.</p><p>I have interviewed a lot of engineering managers on the podcast, and often asked them what&#8217;s the hardest part of their job. One of the common responses is: &#8220;<em>the feedback loop is slow</em>&#8221;.</p><p>Think about it. When you are an engineer, your feedback loop is: you write a feature, see that it works, if not you iterate, push it, possibly iterate on reviews, and it&#8217;s done. This is all extremely fast (even if it might not feel like so!).</p><p>Now compare it with the feedback loop of a manager who is trying to improve how sprint planning works. Or performance reviews. Or their team&#8217;s velocity. Any change you make to the process needs to be measured on a scale of several weeks, or months. And in many cases, what do you even measure?</p><p>Agent workflows are amazing for managers to operate because it&#8217;s like their normal work&#8230; <strong>on timelapse</strong>. Even if the agents are not that good, make mistakes, or trip over themselves, it doesn&#8217;t matter as long as they are <em>fast</em> and managers can course-correct quickly.</p><p>So if it is <em>true</em> that all engineers are becoming <em>kinda</em> like managers now, it&#8217;s also true that motivated managers can have some upper hand because, well, they are already managers!</p><blockquote></blockquote><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 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I 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><item><title><![CDATA[The Era of the Software Factory 🏭]]></title><description><![CDATA[A reflection based on the latest State of Software Delivery report]]></description><link>https://refactoring.fm/p/the-era-of-the-software-factory</link><guid isPermaLink="false">https://refactoring.fm/p/the-era-of-the-software-factory</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 18 Feb 2026 08:03:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/df040445-0757-4574-8be1-7ee85f619d14_1200x800.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few weeks ago, <a href="https://refactoring.fm/p/how-to-build-product-development">I had Rob Zuber</a>, CTO of <a href="https://circleci.com/">CircleCI</a>, on the Refactoring podcast.</p><p>We discussed how AI is changing software delivery, and the conversation continued well after we stopped recording. </p><p>A few weeks later, Rob shared an early copy of CircleCI&#8217;s <strong><a href="https://circleci.com/software-delivery-data-explorer/">State of Software Delivery 2026</a> </strong>report&#8212;which comes out today&#8212;and the data connected a lot of the dots from our conversations. So we decided to write this piece together: my take on the findings, with Rob&#8217;s perspective from the inside.</p><p>The report is based on 28+ million CI workflows across thousands of teams worldwide, and reveals something we have long suspected: <strong>the performance gap between top and average teams is widening</strong>. And it&#8217;s widening <em>fast</em>.</p><p>Elite teams (99th percentile) are reaching delivery speeds that would have been unimaginable two years ago, while the median team hasn&#8217;t moved much at all.</p><p>One story from my earlier interview with Rob captures this well. A team at CircleCI was debating whether to run user research for a new feature&#8212;the usual approach. Rob pushed back: just <strong>build a prototype overnight</strong> and test it with real users. </p><p>Even if the code was, worst case, 100% throwaway, the learning would be more accurate, and the cost would be just ~$100 in compute and a few hours of an engineer. The alternative would have been weeks for the research, more people involved, and possibly more shallow insights.</p><p>For someone like me, who has been involved in startups and <em>lean</em> teams for his whole career, it&#8217;s counterintuitive to <strong>think code-first</strong><em>.</em> Much of what we know about building products is based on the implicit assumption that writing code is the most expensive part, by far.</p><p>So when such cost drops, the initial outcome is that engineers get faster. But when it <em>keeps</em> <em>dropping</em>, like in the last year, we get to a point where a lot of hypotheses don&#8217;t hold anymore, and we need to rethink the process as a whole: how we make decisions, how we structure teams, how we think about quality, and so on.</p><p>You stop optimizing individual developers, and start designing a new production system. Rob and I started calling this <strong>the software factory</strong>, and it became the lens through which the rest of this piece came together.</p><p>Here is what we&#8217;ll cover:</p><ul><li><p>&#127981; <strong>From craftsman to factory</strong> &#8212; why this is bigger than &#8220;AI makes coding faster&#8221;</p></li><li><p>&#128202; <strong>The widening gap</strong> &#8212; data from the 2026 State of Software Delivery</p></li><li><p>&#127899;&#65039; <strong>Control systems thinking</strong> &#8212; a mental model for running your factory</p></li><li><p>&#9889; <strong>What elite teams do differently</strong> &#8212; practices, not tools</p></li><li><p>&#128736;&#65039; <strong>How to start</strong> &#8212; without rebuilding everything</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_!XHaP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XHaP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 424w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 848w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 1272w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XHaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png" width="1456" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:969452,&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/188133700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.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_!XHaP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 424w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 848w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 1272w, https://substackcdn.com/image/fetch/$s_!XHaP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39651b0-6cbb-4c5f-b60d-a2e08868b79f_2706x884.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p><em>I am grateful to Rob and the <a href="https://circleci.com/">CircleCI</a> team for partnering on this piece and giving me preview access to their report. You can check it out below.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://circleci.com/software-delivery-data-explorer/&quot;,&quot;text&quot;:&quot;Check out the State of Software Delivery&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://circleci.com/software-delivery-data-explorer/"><span>Check out the State of Software Delivery</span></a></p><p><em>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</em></p><div><hr></div><h2>&#127981; From Craftsman to Factory</h2><p>Let&#8217;s lead with an interesting bit from the State of Software Delivery. Actually, three bits:</p><ol><li><p>Activity on feature branches (where most coding happens) is <strong>up 59% YoY</strong> &#8212; the largest increase ever observed.</p></li><li><p>Activity on the main branch, though, which is closely correlated with production deployments, is<strong> down by 7%</strong>.</p></li><li><p>Build success rates are <strong>down to 70.8%</strong>, the lowest in five years.</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_!ykUy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ykUy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 424w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 848w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 1272w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ykUy!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png" width="1200" height="557.1428571428571" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:676,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:135080,&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/188133700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.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_!ykUy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 424w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 848w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 1272w, https://substackcdn.com/image/fetch/$s_!ykUy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe132a40e-d993-4bf2-bba9-f5a0623acf5f_1856x862.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">More code and more commits, but also fewer deployments and lower deployment success!</figcaption></figure></div><p>The way I see it is that engineers by now are comfortable with AI-assisted coding, and, as a result, teams are generally writing more code than ever. But it also feels that, when it comes to <em>shipping</em>, this <strong>confidence drops</strong>. Code fails more often, which makes engineers less eager to merge and deploy.</p><p>So while AI makes the <em>generation</em> of code faster, everything that comes after (or before) that &#8212; testing, reviewing, integrating, deploying &#8212; largely stays the same (or gets worse!), unless you do something about it.</p><p>I&#8217;ll also throw in my own experience into the mix. For the last two months, I have been running a small-group coaching program for CTOs where, among other things, I help them identify the bottleneck in their dev process &#8212; the step that limits the throughput of the overall system.</p><p>In theory, that bottleneck can be anywhere. In practice, it&#8217;s <em>never</em> coding.</p><p>For some, it&#8217;s manual QA. For others, it&#8217;s creating good requirements. For many, it&#8217;s code reviews. For one of them, it&#8217;s collecting good feedback from customers, so they can act on it.</p><p>As coding gets cheaper and faster, it&#8217;s <strong>changing the </strong><em><strong>cost structure</strong></em> of the whole process, and bottlenecks now live in &#8204;the parts that AI hasn&#8217;t attacked yet. In other words, the whole system is up for discussion, and chances are it&#8217;s going to look way more like a <em>factory</em> than today&#8217;s craftman&#8217;s workshop.</p><p>Steve Yegge&#8217;s <a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Gas Town</a> is an obvious example that comes to mind. If you forgive the chaos, the waste of tokens, and the Mad Max theme, it looks directionally correct to me: a system of agents coding in parallel, orchestrated by higher-level agents that create and execute plans, and report back to their human overlords.</p><p>But as much as Gas Town can look at times like a 360&#176; self-sustaining orchestration system, it&#8217;s still only focused on coding! Love this quote from Dan Lorenc:</p><blockquote><p><em>Gastown is a preview of agent programming, but the future isn&#8217;t &#8220;code gets written faster.&#8221; The future is: change gets shipped faster. And those are not the same thing.</em></p><p><em>Teams are trapped because CI takes forever, tests are flaky or missing, review cycles are slow, merge conflicts pile up, confidence is low, production is fragile, and there are &#8220;oh god please don&#8217;t touch that&#8221; zones nobody wants to own.</em></p><p><em>If this plays out the way I think it will, software engineering turns into CI engineering.</em></p><p><em>Code is cheap. Green CI is priceless.</em></p></blockquote><p>So how do we build what&#8217;s missing? Let&#8217;s go back to the data &#128071;</p><div><hr></div><h2>&#128202; The Widening Gap</h2><p>We were saying: more code, more breakage, less delivery.</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>This problem, though, is not hitting everyone equally. In fact, possibly the most striking finding from the report is how differently teams are responding to the same shift. Let&#8217;s look at throughput first:</p><ul><li><p>The top 5% of teams nearly doubled their output YoY.</p></li><li><p>The bottom half is flat, or slightly declining.</p></li></ul><p>And even within the elite, the spread is staggering: this year&#8217;s most productive team delivered roughly 10x the throughput of 2024&#8217;s leader. At positions 5&#8211;15, it&#8217;s around 3x. At 20&#8211;30, about 2.5x.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IfGQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IfGQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 424w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 848w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 1272w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IfGQ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png" width="1200" height="530.7692307692307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:644,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:263440,&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/188133700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.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_!IfGQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 424w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 848w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 1272w, https://substackcdn.com/image/fetch/$s_!IfGQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff404b7dc-d5a9-4ac1-bed9-0259d9997944_2244x992.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Elite teams are pulling away from the pack, and they are doing it fast.</figcaption></figure></div><p>Pipeline speed tells a similar story:</p><ul><li><p>Elite teams run at a median pipeline duration of &lt;3 mins.</p></li><li><p>The average sits at 11 minutes.</p></li><li><p>Struggling teams are above 25 minutes.</p></li></ul><p>That&#8217;s a ~10x gap between top and bottom, and we know the consequences: when your CI takes 25 minutes, you don&#8217;t run it as often, you batch more changes together, problems pile up, and the feedback loop slows to a crawl.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MFUP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MFUP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 424w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 848w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MFUP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png" width="1456" height="715" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:715,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:518037,&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/188133700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.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_!MFUP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 424w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 848w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!MFUP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4ee971c-8ce9-4b33-bd42-7d0de27fc4aa_2350x1154.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The more it takes to ship to prod, the worse things become</figcaption></figure></div><p>Recovery is perhaps the most telling metric. The median team takes about 72 minutes to get back to green after a failure &#8212; up 13% from last year. On feature branches, where AI is driving the most activity, recovery times jumped 25%. The <em>average</em> recovery time (as opposed to median) is 24 hours, which gives you a sense of how bad things get for the teams at the tail end.</p><p>Now, you might assume the gap is about resources &#8212; bigger companies, better tooling budgets, earlier access to AI. But that&#8217;s not what the data says. 81% of respondents report using AI in some form, so the tools are everywhere. What&#8217;s <em>not</em> everywhere is the ability to absorb what those tools produce.</p><p>I saved the best for last, so here is the data point I find the most interesting: teams that had CI pipelines under 15 minutes back in 2023 are <strong>5x more likely to be in the 99th percentile today</strong>.</p><p>In other words, the teams that are thriving with AI are the ones that had good infrastructure <em>before</em> AI showed up. Fast feedback loops, reliable tests, clean deployment pipelines &#8212; all of that was built <em>for humans</em>, and it turns out it&#8217;s exactly what you need to make AI-generated code shippable.</p><p>How should you feel about this? In a way, this is both encouraging and frustrating. Encouraging, because there&#8217;s no secret: <a href="https://refactoring.fm/p/whats-good-for-humans-is-good-for">what&#8217;s good for humans is good for AI</a>. Maybe also frustrating, because if you don&#8217;t have them, there&#8217;s no shortcut: AI amplifies whatever you already have, good or bad.</p><div><hr></div><h2>&#127899;&#65039; Control Systems Thinking</h2><p>So, if we are building a production system now, how should we think about it? Rob has an answer for this, and it comes from a somewhat unexpected place: <strong>control theory</strong>.</p><p>The field dates back to the early 1900s, and the core idea is simple. Think of a thermostat. You set a target temperature. A sensor measures the current temperature. If it&#8217;s too cold, the heater kicks in. If it&#8217;s too warm, it shuts off. The system continuously adjusts itself based on feedback.</p><p>That&#8217;s what a control system does, via four elements:</p><ul><li><p>&#127919; <strong>Setpoint</strong> &#8212; what you&#8217;re aiming for.</p></li><li><p>&#127777;&#65039; <strong>Sensor</strong> &#8212; how you measure.</p></li><li><p>&#128295; <strong>Actuator</strong> &#8212; what makes changes.</p></li><li><p>&#8617;&#65039; <strong>Feedback loop</strong> &#8212; that connects them.</p></li></ul><p>Now replace the thermostat with a software team:</p><ul><li><p>Your setpoint is the quality and speed of your delivery.</p></li><li><p>Your sensors are your tests, your CI pipeline, and your monitoring in production.</p></li><li><p>Your actuators are the agents and developers that write and ship code.</p></li><li><p>The feedback loop is everything that connects output back to input: did the build pass? Did the deploy break anything? Are users behaving as expected?</p></li></ul><p>CI/CD has always been a control system; we just don&#8217;t call it like that. The teams that built fast pipelines, reliable test suites, and good observability have been essentially <strong>building sensors and feedback loops</strong>.</p><p>This framing matters today because if you just &#8220;unleash the agents&#8221; without good feedback mechanisms, you get what the data is already showing us: more code, more breakage, declining success rates.</p><p>So what the teams at the 99th percentile have is mostly <strong>faster and better feedback loops</strong>:</p><ul><li><p>Their CI runs in under 3 minutes, not 25.</p></li><li><p>When something breaks, they know in minutes, not hours.</p></li><li><p>They can roll back quickly, which means the cost of a mistake is low, which means they can experiment more aggressively.</p></li></ul><p>If we agree on that, the question becomes: if you are not one of those teams, where do you start?</p><div><hr></div><h2>&#128736;&#65039; How to Start Building Your Factory</h2><p>Just like I don&#8217;t like big rewrites, I don&#8217;t believe in redesigning everything at once. I believe in small steps that compound over time.</p><p>So let&#8217;s try to start with three simple things: speed up your feedback, share what works, and make experiments cheap:</p><h3>1) Speed up your feedback</h3><p>This is the single highest-leverage move for most teams. If your CI pipeline takes 20+ minutes, nothing else matters &#8212; every other improvement will be bottlenecked by how long it takes to know if something works.</p><p>A simple audit: how long does it take from &#8220;developer pushes code&#8221; to &#8220;you know if it&#8217;s good or broken&#8221;? If the answer is more than 10 minutes, start there. If you can&#8217;t roll back a bad deploy in under 5 minutes, start there. If your test suite is flaky enough that people ignore red builds, start there.</p><p>This isn&#8217;t glamorous work, and it has nothing to do with AI. But the data is clear: the teams that had this in place before the AI wave are the ones riding it now. It&#8217;s the foundation your factory needs before anything else.</p><h3>2) Share AI practices as a team</h3><p>One data point from the report stuck with me: 30% of developers say they have little to no trust in AI-generated code. They use it because everyone does, but they don&#8217;t trust what it produces.</p><p>30% is a lot.</p><p>I believe the way to fix this is not to wait for a better model, but to <em>graduate</em> AI adoption from an <em>individual</em> sport to a <em>team</em> one. Turn <em>AI Engineering</em> into <em><a href="https://every.to/chain-of-thought/compound-engineering-how-every-codes-with-agents">Compound Engineering</a></em>.</p><p>This doesn&#8217;t require a big investment. I love Will Larson&#8217;s <a href="https://lethain.com/company-ai-adoption/">series of articles</a> where he displays how his team is navigating this at Imprint, and it&#8217;s all about the basics. Here are a few examples:</p><ul><li><p>Create shared docs that accumulate learnings over time.</p></li><li><p>Turn agents instructions (e.g. CLAUDE.md) into a shared artifact (version controlled!) across the team.</p></li><li><p>Create easy ways to give feedback to the AI so that it can improve its own instructions (see screenshot from the Claude Code team &#128071;)</p></li><li><p>Create spaces in which people can show how they use AI, what they learned, and something cool they did. It&#8217;s as simple as a 30-mins weekly slot.</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_!-obQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-obQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 424w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 848w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 1272w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-obQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png" width="1456" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:419799,&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/188133700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.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_!-obQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 424w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 848w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 1272w, https://substackcdn.com/image/fetch/$s_!-obQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2c199f5-2438-4504-8caa-b8f8abb1e86c_1698x854.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you start doing this, the compounding effect is real: better practices lead to better results, which lead to more trust, which leads to more experimentation, which leads to better practices again.</p><h3>3) Make experiments cheap</h3><p>Finally, try to make all of this easy. Create opportunities to try <em>frontier</em> workflows in a way that feels low-stakes:</p><ul><li><p>Run a hackathon where humans <em>can&#8217;t</em> write any code manually.</p></li><li><p>Start a project that would be <em>impossible</em> to deliver had humans written the code. Like <a href="https://newsletter.pragmaticengineer.com/p/ai-first-makeover-craft">Craft did</a>.</p></li><li><p>Default-assign long-tail bugs to the AI and let it draft PRs.</p></li></ul><p>Don&#8217;t treat AI adoption as a big <em>decision</em>, like: evaluate for three months, run a pilot, write a report, pick a winner. Treat it as continuous <em>experimentation</em>: try something this week, measure if it helped, keep it or kill it by Monday.</p><p>The cost of trying things has never been lower. The cost of <em>not</em> trying things has never been higher.</p><h2>&#128204; Bottom line</h2><p>And that&#8217;s it for today! If there&#8217;s one thing we hope you take away from this piece, it&#8217;s that the shift we&#8217;re living through isn&#8217;t about AI writing code faster. It&#8217;s about the entire system of building software being redesigned. And it&#8217;s being redesigned, in real time, by &#8204;the teams that understood this first, and way before AI.</p><p>Here are the main takeaways:</p><ul><li><p>&#127981; <strong>The bottleneck is no longer coding</strong> &#8212; AI made code generation dramatically faster, but testing, reviewing, integrating, and deploying largely stayed the same. The teams pulling ahead are those redesigning the whole system, not just the coding step.</p></li><li><p>&#128202; <strong>The gap between top and average teams is stretching fast</strong> &#8212; elite teams nearly doubled their throughput YoY while the median barely moved. The difference isn&#8217;t access to AI tools (81% use them), it&#8217;s the infrastructure to absorb what those tools produce.</p></li><li><p>&#127899;&#65039; <strong>Think of your delivery process as a control system</strong> &#8212; with setpoints, sensors, actuators, and feedback loops. The teams at the 99th percentile <em>do</em> ship faster, but also know <em>faster</em> whether something works, which lets them experiment more aggressively.</p></li><li><p>&#128295; <strong>Good infrastructure before AI = good results with AI</strong> &#8212; teams that had CI pipelines under 15 minutes in 2023 are 5x more likely to be in the 99th percentile today. Fast feedback loops, reliable tests, and clean deployments were built for humans, and they are even more important for AI.</p></li><li><p>&#129309; <strong>Graduate AI adoption from individual to team sport</strong> &#8212; shared docs, version-controlled agent instructions, feedback loops into AI tooling, and regular show-and-tell sessions create compounding returns that solo experimentation can&#8217;t match.</p></li><li><p>&#9889; <strong>Make experiments cheap, not decisions big</strong> &#8212; don&#8217;t evaluate for three months. Try something this week, measure if it helped, keep it or kill it by Monday. The cost of trying has never been lower; the cost of <em>not</em> trying has never been higher.</p></li></ul><p>See you next week!</p><p>Sincerely &#128075;<br>Luca</p><div><hr></div><p><em>I want to thank Rob and the CircleCI team again for partnering on this. You can find out their yearly report below &#128071;</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://circleci.com/software-delivery-data-explorer/&quot;,&quot;text&quot;:&quot;Check out the State of Software Delivery&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://circleci.com/software-delivery-data-explorer/"><span>Check out the State of Software Delivery</span></a></p><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[My experience with OpenClaw 🦞]]></title><description><![CDATA[A detailed write-up of two intense weeks, and what comes next.]]></description><link>https://refactoring.fm/p/my-experience-with-openclaw</link><guid isPermaLink="false">https://refactoring.fm/p/my-experience-with-openclaw</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 11 Feb 2026 08:00:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ofse!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, Luca here! This is a </em>&#128274;<em> <strong>weekly essay</strong> </em>&#128274; <em>from Refactoring!</em> <em>To access all our articles, library, and community, subscribe to the <a href="https://refactoring.fm/about">full version</a>:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Learn how to run a better tech team &#128296;&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://refactoring.fm/subscribe?"><span>Learn how to run a better tech team &#128296;</span></a></p><div><hr></div><p>By now, chances are you have heard about the open-source AI assistant <a href="https://openclaw.ai/">OpenClaw / Moltbot / Clawdbot</a>. I have been using it extensively for two weeks now, and I want to share some thoughts about my experience with it.</p><p>I feel the need to do it for three reasons:</p><p><strong>1) Signal</strong> &#8212; while there is <em>a lot</em> of information and stories online about OpenClaw, I have found most to be either shallow or <strong>inaccurate</strong>. Inaccurate is also an understatement: many takes are so comically bad/wrong/false that it is obvious that the author didn&#8217;t even bother to install OpenClaw, and is just remixing and regurgitating other (equally bad) content.</p><p><strong>2) Impact</strong> &#8212; my experience with OpenClaw has been <strong>absolutely</strong> <strong>transformative</strong> and only comparable, AI-wise, to the launch of ChatGPT. YMMV and I don&#8217;t expect my experience to apply verbatim to everyone, but I suspect many people don&#8217;t understand what makes OpenClaw special, because it&#8217;s hard to see it from a distance.</p><p><strong>3) Future</strong> &#8212; finally, this spectacular success gave me a lot to think about when it comes to the future of software and work in general, on which now I have thoughts that I want to share.</p><p>So here is the agenda for today:</p><ul><li><p><strong>&#129438; What is OpenClaw</strong> &#8212; very briefly, for those who don&#8217;t know.</p></li><li><p><strong>&#128296; What I do with it</strong> &#8212; on a daily basis.</p></li><li><p><strong>&#128274; Security</strong> &#8212; keeping it real but also debunking some misconceptions.</p></li></ul><p>And three theses:</p><ul><li><p><strong>&#129704; Slaves vs software</strong> &#8212; AI enables a new (but also old) way to solve problems.</p></li><li><p><strong>&#128268; MCPs are dead</strong> &#8212; AI has clearly outgrown MCPs at this point, and not just them.</p></li><li><p><strong>&#129716; Personal leverage</strong> &#8212; learning from the story of Peter Steinberger, creator of OpenClaw.</p></li></ul><p>Let&#8217;s dive in! You are in for a ride.</p><div><hr></div><h2>&#129438; What is OpenClaw</h2><p>OpenClaw is an open-source AI assistant you can install on a computer, plug into a number of tools, and make it do stuff. At its core, that&#8217;s it!</p><p>It is similar to Claude Code, but it comes with more features that work (kinda) out of the box, including, most notably:</p><ul><li><p><strong>&#129504; Memory</strong> &#8212; it has a memory system to store things it wants to remember into files.</p></li><li><p><strong>&#9201;&#65039; Heartbeats / cron jobs</strong> &#8212; it can do recurring things when instructed to do so (e.g. <em>every 4 hours send me a recap of my inbox and items that need my attention</em>)</p></li><li><p><strong>&#128172; Chat tools</strong> &#8212; it plugs into Telegram, WhatsApp and a few other tools for easy comms outside of the terminal.</p></li></ul><p>It has a number of other features, including the ability to spawn subagents for long tasks, a big gallery of community plugins, and much more, but I believe the three above are what makes it stand out vs other assistants out there.</p><p>And the reason is all about UX.</p><p>There is nothing in OpenClaw you <em>couldn&#8217;t</em> already do with e.g. Claude Code plus a bunch of plugins / duct-taping, but the value here is <em>convenience</em>: the core parts are all pre-packaged, plus you&#8217;ll find a long tail of quality of life improvements that stem from the tool being intentionally designed as an <em>assistant</em>, as opposed to a coding agent.</p><p>So, it&#8217;s similar (on a small scale!) to when Steve Jobs introduced the iPhone as the combination of three things: a 1) widescreen iPod, a 2) mobile phone, and 3) an internet communicator. None of these were mindblowing in <em>isolation</em>, but put together they crossed some invisible line that turned the device into something else.</p><p>What is this <em>something else</em>, for OpenClaw? Well, let&#8217;s see.</p><h2>&#128296; What I do with it</h2><p>The best analogy I have for OpenClaw is that of <em>a person</em> you have hired and you manage as your direct report. Yes, I know comparing AI to people is bad and out of touch in many ways, but I still find it the best <em>model</em> to build an intuition of how to relate with it and get the best out of it.</p><p>Like you would do with a person, you can tell OpenClaw to do things, do them on a recurring basis, have it report to you at some cadence, improve based on feedback, and it will happily do all of that. You will meet hiccups every now and then and stuff you&#8217;ll need to tweak, but for the most part, everything just works.</p><p>So, what to do with it is really up to you and what you need the most help with.</p><p>For me, as a content creator and owner of a small company, my highest leverage usage right now is that of an executive assistant, or a VA, that can lift some ops / admin work from my shoulders.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ofse!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ofse!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 424w, https://substackcdn.com/image/fetch/$s_!ofse!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 848w, https://substackcdn.com/image/fetch/$s_!ofse!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!ofse!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ofse!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png" width="1200" height="530.7692307692307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:644,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:851050,&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/187528754?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.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_!ofse!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 424w, https://substackcdn.com/image/fetch/$s_!ofse!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 848w, https://substackcdn.com/image/fetch/$s_!ofse!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!ofse!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fbaa311-0b83-437c-ac1f-40dae96696c8_3172x1404.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">We are trying a lot of things about organizing work for AI. Will share more as soon as we have something that feels more stable.</figcaption></figure></div><p>For example, right now OpenClaw:</p><ul><li><p>Sends me morning briefs about what I need to do during my day.</p></li><li><p>Sends me prep for my upcoming meetings based on previous meetings and email threads with the same people.</p></li><li><p>Stores and organizes meeting notes automatically.</p></li><li><p>Does occasional coding work &#8212; e.g. it migrated all my Notion workspace to files, linking everything correctly.</p></li><li><p>Plus does a lot of glue work that would otherwise require n8n-style automations.</p></li></ul><p>And it&#8217;s great at one-off tasks too:</p><ul><li><p>I told it to draft an agreement with a partner company without adding any further context, because it could fetch it from email, Slack, meeting transcripts, and internal notes.</p></li><li><p>I asked it to give me the <em>copy</em> for the next sponsorship placement. It did that by looking at our sponsorship calendar on Airtable to figure out what company was next up, plus fetching the actual copy from the right email thread.</p></li></ul><p>It did both without the need for complex instructions &#8212; just explaining the work in a sentence or two like I would with a human.</p><p>To enable all of this, we have connected it to basically all the tools we use for work, including:</p>
      <p>
          <a href="https://refactoring.fm/p/my-experience-with-openclaw">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[CTO Archetypes 🧩]]></title><description><![CDATA[A handy framework by Pat Kua to navigate this shape-shifting role.]]></description><link>https://refactoring.fm/p/cto-archetypes</link><guid isPermaLink="false">https://refactoring.fm/p/cto-archetypes</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 04 Feb 2026 08:01:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ksz1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey! This week I am excited to host an original article by <strong><a href="https://www.patkua.com/">Pat Kua</a></strong> &#8212; a coach and CTO with 25+ years of experience in tech, and one of my favorite authors, whose ideas I have often quoted and mentioned here on Refactoring!</p><p>Pat&#8217;s article touches on a complex subject: <strong>the CTO role</strong>. He explores how such a role differs based on several factors, defines common sets of responsibilities, and provides insights you can use to improve alignment during hiring, company growth, and career conversations.</p><p>If you&#8217;d like to connect with Pat, please find him on <a href="https://www.linkedin.com/in/patkua/">Linkedin</a>!</p><p>Here is the agenda for today:</p><ul><li><p>&#128081; <strong>What&#8217;s a CTO</strong> &#8212; why the title carries seniority but rarely comes with documented scope.</p></li><li><p>&#129513; <strong>Why I use archetypes</strong> &#8212; tools for sensing misalignment and converging on shared expectations.</p></li><li><p>&#127917; <strong>CTO archetypes</strong> &#8212; eight recurring shapes that appear across different organizational contexts.</p></li><li><p>&#128736;&#65039; <strong>How to use these archetypes</strong> &#8212; practical applications for hiring, growth, and career planning.</p></li></ul><p>Let&#8217;s dive in! &#128071;</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_!fdSZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fdSZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 424w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 848w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 1272w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fdSZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png" width="1456" height="439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:439,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:624774,&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/186312746?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.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_!fdSZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 424w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 848w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 1272w, https://substackcdn.com/image/fetch/$s_!fdSZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6ee302a-8dcc-4e73-93de-c43fc5ec4b79_1916x578.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#128081; What&#8217;s a CTO?</h2><p>I&#8217;ve found that many people struggle to describe the scope of the CTO role.</p><p>Two people with the same &#8220;CTO&#8221; title can have radically different responsibilities, spend their days on entirely different problems and be measured by very different outcomes. These differences matter because misaligned and unclear expectations around the CTO role lead to frustration, inappropriate hires, organizational friction or burnout.</p><p>Many management and leadership roles often ask: <strong>&#8220;What is expected of me?&#8221;</strong></p><p>I hear this frequently from Engineering Managers (EMs) and Tech Leads (TLs) in my training courses. While all roles have some slight differences, answering this for EMs/TLs is relatively straightforward, as I&#8217;ve previously written about in &#8220;<a href="https://www.patkua.com/blog/the-definition-of-a-tech-lead/">The Definition of a Tech Lead</a>&#8221; and &#8220;<a href="https://www.patkua.com/blog/5-engineering-manager-archetypes/">5 Engineering Manager Archetypes</a>.&#8221;</p><p>Answering this question as a CTO, however, is much harder.</p><p>The title carries seniority and authority, but rarely comes with a documented understanding of scope, priorities, or success. After all, if you&#8217;re a CTO, you&#8217;re supposed to &#8220;work it out.&#8221;</p><p>Over my 25-year career in tech, I&#8217;ve worked with and observed many different types of CTOs. As a Principal Consultant at ThoughtWorks, I partnered with CTOs to help them transform and modernize products, platforms, processes, and organizational structures. As the CTO of the German digital bank N26, I met many CTO peers facing both similar and very different challenges. Since then, I&#8217;ve advised and coached CTOs across a wide range of organizations and situations.</p><p>What this experience has reinforced is that while CTO roles can vary dramatically, they are not always <em>arbitrary</em>. There are recurring shapes to the role that emerge in response to specific organizational contexts and constraints.</p><p>In the rest of this article, I describe these recurring shapes as <strong>CTO archetypes</strong>, which you can use to make sense of what different CTO roles cater for, why mismatches occur, and how the role might evolve over time.</p><div><hr></div><h2>&#129513; Why I use archetypes</h2><p>In software development, we often draw on design patterns such as the <em>Observer</em>, <em>Singleton</em>, or <em>Decorator</em>.</p><p>A pattern is a reusable solution to a specific problem in a defined context. Archetypes serve a different purpose. Rather than prescribing <em>how</em> to solve a problem, they describe <strong>recurring</strong> <strong>shapes</strong> that appear across many systems. When applied to leadership roles, I feel the term &#8220;archetype&#8221; fits better with the commonly understood meaning of &#8220;a typical example of something.&#8221;</p><p>Archetypes are not meant to be boxes people fit neatly into. Reality is always messier. Instead, they are tools for sensing misalignment and to <strong>converge on shared expectations</strong>.</p><p>Archetypes can help us turn implicit assumptions into explicit ones and provide a <strong>shared language</strong> to discuss expectations, trade-offs, and mismatches among an organization&#8217;s needs, a role&#8217;s scope, and an individual&#8217;s skills, experience, and growth opportunities.</p><p>No catalog of archetypes will ever be comprehensive or perfect, which is why my favorite quote from George E. P. Box applies so well here:</p><blockquote><p><em>&#8220;All models are wrong, some are useful.&#8221;</em></p></blockquote><p>When I wrote about the Engineering Manager archetypes, many people told me it helped them start productive conversations about which EM role their organization needed or which EM role someone was applying for. Others used it as a vehicle for growth, seeking new opportunities to build experience that allowed them to play other archetypes.</p><p>It&#8217;s also important to emphasize what these archetypes are <em>not</em>.</p><p>They are neither a hierarchy nor a maturity model. Most real-world CTO roles are hybrids, and an organization&#8217;s needs will change over time. Just as effective leaders practice adaptive leadership, a CTO&#8217;s shape must evolve as the company grows, shrinks, or changes direction. Used well, archetypes act as lenses rather than labels and support reflection and dialogue rather than categorization.</p><p>Although these archetypes are not meant to be exhaustive, I hope they&#8217;re still useful in practice. Whether you are an existing or aspiring CTO, a CEO or board member, an executive recruiter, or simply curious about what CTOs actually do all day, the goal is not to find the &#8220;right&#8221; archetype, but to have clearer, more grounded conversations about fit, focus, and context.</p><div><hr></div><h2>&#127917; CTO Archetypes</h2><p>The shape of a CTO role is mainly driven by organizational context and constraints, and because there are common situations, we can loosely group the following archetypes into one of the following categories:</p><ul><li><p>&#128995; <strong>Early-Stage or Small</strong> &#8212; Founder, Startup and Fractional.</p></li><li><p>&#128992; <strong>Growth and Rapid Change</strong> &#8212; Scale-Up, M&amp;A and Turnaround.</p></li><li><p>&#128309; <strong>Complexity and Coordination</strong> &#8212; Group and CTPO.</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_!Ksz1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ksz1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 424w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 848w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 1272w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ksz1!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png" width="1200" height="788.7362637362637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:957,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:565546,&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/186312746?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.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_!Ksz1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 424w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 848w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 1272w, https://substackcdn.com/image/fetch/$s_!Ksz1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71a66bed-5310-4054-8f99-8243a9510899_2918x1918.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A cheat sheet to better visualize the eight archetypes!</figcaption></figure></div><h3>1) Founder CTO</h3><p>The Founder CTO optimizes for turning a personal vision into a successful company, while carrying responsibility for both the business and its technology.</p><p>Imagine you want to start a tech company tomorrow, and you&#8217;re the most technically skilled person involved. Congratulations! You&#8217;re now a Founder CTO, and you wear the distinct hats of both Founder and CTO.</p><p>Founder CTOs typically have a much stronger <strong>attachment to the business</strong> than non-founder employees. While early-stage employees may have strong financial incentives, founders&#8217; attachment is much deeper and more personal. For many Founder CTOs, the company&#8217;s success and eventual financial outcome are the positive side effects of seeing a personal mission come to life.</p><p>Founder CTOs often begin as the most experienced technical person in the organization. As the company grows, however, this may no longer hold true. Successful Founder CTOs frequently hire people who are more specialized or more experienced in particular technical domains. Some, such as Jack Dorsey (Twitter) and Patrick Collison (Stripe), eventually transitioned into CEO roles. Others, like David Heinemeier Hansson (Basecamp / 37signals) and Mitchell Hashimoto (HashiCorp), remained deeply technical as the company scaled.</p><p>The primary tension of the Founder CTO role is <strong>balancing the competing demands</strong> of the two hats, and in practice, the Founder hat often wins. During fundraising rounds, for example, the Founder CTO may spend significant time with investors rather than on technology leadership. In other situations, the Founder CTO becomes the public face of the business, requiring more time with customers or on marketing than leading the technology organization.</p><h2>2) Startup CTO</h2>
      <p>
          <a href="https://refactoring.fm/p/cto-archetypes">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Listening Tour 📞]]></title><description><![CDATA[How to find and fix developer experience friction]]></description><link>https://refactoring.fm/p/the-listening-tour</link><guid isPermaLink="false">https://refactoring.fm/p/the-listening-tour</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 28 Jan 2026 08:00:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ee3S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc69b13c2-e3d6-4d74-a60e-e0673ae75421_4248x1860.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the last month I have been running a program for CTOs and VPs of small to mid-size companies to help them <strong>make their engineering teams </strong><em><strong>ship faster</strong></em>.</p><p>It&#8217;s an 8-week program that blends live teaching and group coaching, and it&#8217;s for small groups: only 10 seats. You can reply to this email if you are interested in the next cohort in Q2!</p><p>Why am I saying this now? Because today&#8217;s topic is inspired by the last session of the program, which was about <strong>developer experience</strong>.</p><p>For some, this will be surprising. Most of the content you can find online these days is about AI, and it seems like learning to use AI well is the most promising route to shipping faster and more often.</p><p>But I am going to spill a secret here. <strong>AI is not that hard to use</strong> &#129335;&#8205;&#9794;&#65039;</p><p>Yeah that&#8217;s right. Some people will convince you there is a whole new world to learn about agents, skills, tools, and while it is true that you need to get yourself somewhat <em>comfortable</em> with these, we are engineers, dammit! It&#8217;s all kinda easy to wrap our heads around.</p><p>So if you look at real teams &#8212; not solo engineers, I mean real engineering teams &#8212; that are getting the most out of AI, it&#8217;s most often not because they are using AI better or differently than the rest of us. It&#8217;s because they use AI <strong>on top of a platform that is already good</strong>. Folks were already productive and efficient <em>before</em> AI, and they got even more so now.</p><p>AI benefits teams who <strong>have their house in order</strong>, which largely means: <strong>good developer experience</strong>.</p><p>So, today we explore a simple but powerful technique to diagnose your devex: the <strong>Listening Tour</strong>. It&#8217;s a structured way to surface friction by talking to your engineers and mapping what you learn to your dev process.</p><p>Here is the agenda:</p><ul><li><p>&#129521; <strong>What is developer experience</strong> &#8212; and why <em>friction</em> is the enemy.</p></li><li><p>&#128269; <strong>Interview your engineers</strong> &#8212; run a listening tour to collect stories of friction.</p></li><li><p>&#128506;&#65039; <strong>Map friction to your process</strong> &#8212; group problems by dev pipeline step.</p></li><li><p>&#129518; <strong>Score by reach and impact</strong> &#8212; prioritize without overthinking.</p></li><li><p>&#128300; <strong>Find the one bottleneck</strong> &#8212; and why improving the wrong step makes things worse.</p></li></ul><p>Let&#8217;s dive in!</p><div><hr></div>
      <p>
          <a href="https://refactoring.fm/p/the-listening-tour">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Making AI agents work in the real world ⚙️]]></title><description><![CDATA[How to bridge the gap from demo to production.]]></description><link>https://refactoring.fm/p/making-ai-agents-work-in-the-real</link><guid isPermaLink="false">https://refactoring.fm/p/making-ai-agents-work-in-the-real</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 21 Jan 2026 08:01:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6nFg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Whenever some new tech comes in, there is a period of time in which excitement about the future <em>charges ahead</em> with respect to reality.</p><p>The more the excitement, the wider the gap.</p><p>With AI, it feels this has been the case for at least the last couple of years, to the point that it even earned its own name: the <strong><a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/seizing-the-agentic-ai-advantage">gen AI paradox</a></strong>. </p><p>In June, McKinsey reported that:</p><ul><li><p>Nearly eight in ten companies have deployed generative AI in some form, but roughly the same percentage report <strong>no material impact</strong>.</p></li><li><p>Also, 90% of function-specific AI use cases remain stuck in <strong>pilot mode</strong>.</p></li></ul><p>The answer to these <em>lukewarm</em> results is supposed to be&#8230; <strong>agents</strong>. The thing that turns experiments into impact.</p><p>And yet, for most teams, the story is repeating itself. A Gartner poll from this year found that <strong>only 15% of tech leaders</strong> are actually deploying <em>somewhat</em> autonomous agents, and, from my anecdotal conversations, I confirm this sentiment.</p><p>By now, most of us have probably seen <strong>more agent demos than we can count</strong>. Agents that book flights, write code, handle customer support, or else. Every demo looks flawless &#8212; but when you try to put the same thing in production, it falls apart.</p><p>So what&#8217;s going on?</p><p>I have spoken with a lot of teams over the past months, and I believe <strong>the gap is not about intelligence</strong>. Today&#8217;s models are <em>remarkably</em> capable. The gap is about everything else: reliability, infrastructure, and the whole <em>system</em> that needs to be put in place around models.</p><p>The teams that are breaking through share a few things in common:</p><ul><li><p>They are realistic about what agents can and can&#8217;t do today</p></li><li><p>They start narrow and expand carefully</p></li><li><p>They invest in the workflow, not just the model itself</p></li></ul><p>So this article is a primer on this. Let&#8217;s have a look at what agents are, why they fail, and how to get them to work.</p><p>Here is the agenda:</p><ul><li><p>&#129302; <strong>What is an agent, really?</strong> &#8212; clearing up the confusion between chatbots, copilots, and agents.</p></li><li><p>&#129521; <strong>The building blocks</strong> &#8212; models, orchestration, and tools: how agents actually work.</p></li><li><p>&#127942; <strong>Use cases for agents</strong> &#8212; patterns from early winners and use cases with real ROI.</p></li><li><p>&#128295; <strong>From prototype to production</strong> &#8212; how to bridge the reliability gap and the compounding errors problem.</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_!Ialb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ialb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 424w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 848w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 1272w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ialb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png" width="1456" height="491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:491,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:548916,&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/184853067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.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_!Ialb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 424w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 848w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 1272w, https://substackcdn.com/image/fetch/$s_!Ialb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e070dc-a5f7-40c5-b167-cfb0f5631e82_1751x591.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p><em>I got a lot of help for this piece from <strong><a href="https://www.linkedin.com/in/gorkamadariaga">Gorka Madariaga</a></strong> and the team at AWS, who work on <strong><a href="https://fandf.co/3Ns41ic">Amazon Nova</a></strong> and have spent the past year deep in the trenches of enterprise agent deployments. Their perspective on what&#8217;s working &#8212; and what&#8217;s not &#8212; was invaluable in shaping this article.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fandf.co/3LmgpzK&quot;,&quot;text&quot;:&quot;Learn more about Amazon Nova&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fandf.co/3LmgpzK"><span>Learn more about Amazon Nova</span></a></p><p><em>Disclaimer: even though AWS is a partner for this piece, I will only provide my transparent opinion on all practices and tools we cover, Nova included!</em></p><div><hr></div><h2>&#129302; What is an agent, really?</h2><p>The word &#8220;agent&#8221; has become one of the most overloaded terms in tech.</p><p>Vendors slap it on everything from simple chatbots to fully autonomous systems, which makes it hard to know what we&#8217;re talking about.</p><p>To clear this up, I find it useful to think about AI systems on a spectrum of autonomy:</p><ol><li><p><strong>&#128172; Chatbots</strong> &#8212; respond to questions. They take an input, generate an output, and that&#8217;s it. They possibly keep memory across sessions, but have no ability to take actions. Think classic customer support chat.</p></li><li><p><strong>&#129489;&#8205;&#9992;&#65039; Copilots</strong> &#8212; assist humans in doing work. They can access context (your codebase, your documents), draft outputs, and take some actions. But a human remains in the loop, reviewing and approving. Think ChatGPT with tools.</p></li><li><p><strong>&#129302; Agents</strong> &#8212; act autonomously to achieve goals. They can reason, use tools, and plan multi-step workflows without waiting for human approval at every step.</p></li></ol><p>The key distinction is that agents <em>do things</em> autonomously &#8212; they don&#8217;t just respond. They interact with external systems, make decisions, and take actions that have consequences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6nFg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6nFg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 424w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 848w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6nFg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:198331,&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/184853067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.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_!6nFg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 424w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 848w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!6nFg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b94d67-cbec-4ebd-864d-d7851d22e237_1666x1058.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The value and impact of AI grows more than linearly with its autonomy &#8212; and so does risk.</figcaption></figure></div><p>Which makes them both powerful and risky. The feedback loop is fundamentally different because chatbots have a human in the loop all the time, while agents have not.</p><p>Designing for this is hard, which is the reason why successful deployments usually don&#8217;t go <em>full autonomy</em> from day one (or ever). They escalate to humans for high-stakes decisions, and gradually expand the agent&#8217;s authority as trust is established.</p><p>In other words: the best agents today are only <em><strong>selectively</strong></em><strong> autonomous</strong>: independent on routine tasks, supervised on critical ones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3X6Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3X6Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 424w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 848w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 1272w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3X6Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:174547,&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/184853067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.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_!3X6Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 424w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 848w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 1272w, https://substackcdn.com/image/fetch/$s_!3X6Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1bbc744-753f-45a0-ae7c-395b78d9156d_1854x736.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>&#129521; The building blocks</h2><p>To understand how to make agents work, we first need to break down what&#8217;s inside one. At its highest level, every agent has three components:</p><ol><li><p><strong>&#129504; Model</strong> &#8212; this is the &#8220;brain&#8221; of the agent. It&#8217;s the LLM that does the reasoning: understanding the task, deciding what to do next, and interpreting results. The model is what most people focus on, and it makes sense: a smarter model <em>generally</em> makes better decisions. But there is much more &#128071;</p></li><li><p><strong>&#128295; Tools</strong> &#8212; these are the external capabilities the agent can use: APIs, databases, browsers, code execution, file systems. Tools are how agents interact with the world. Without them, you just have a chatbot.</p></li><li><p><strong>&#128256; Orchestrator</strong> &#8212; this is the control layer that manages the agent&#8217;s workflow. It handles things like: breaking a goal into steps, deciding when to call which tool, recovering from errors, and knowing when to stop. Some agents use simple loops, while others use complex state machines or even multiple sub-agents coordinating together.</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_!IBnR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IBnR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 424w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 848w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 1272w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IBnR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png" width="1456" height="594" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:594,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128392,&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/184853067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.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_!IBnR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 424w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 848w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 1272w, https://substackcdn.com/image/fetch/$s_!IBnR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b437f6b-0440-48cd-9634-4aac7a7516d4_1882x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">As you change the architecture of your AI system, the opportunities and failure modes change as well.</figcaption></figure></div><p>Some add <strong>memory</strong> as one of the building blocks. On a semantic level, I <em>kinda</em> disagree with this, as memory doesn&#8217;t feel <em>as fundamental</em> as the other three. Model, orchestrator, and tools are all <em>required</em> for any agent to function. Memory is more of an enhancement &#8212; many useful agents are stateless within a single task.</p><p>Also, technically, memory is often <strong>implemented as a tool</strong> (e.g., vector database lookup) or managed by the orchestrator (e.g., maintaining conversation state). It&#8217;s not a truly separate layer.</p><p>But I digress. The point here is that an agent is a <strong>full system</strong>, not just a model, and the system matters <em>a lot</em>. A better model <em>doesn&#8217;t</em> automatically translate into a better agent if you have flaky tools or the orchestrator can&#8217;t recover from errors.</p><div><hr></div><h2>&#127942; Use cases for agents</h2><p>Given all of this, where are agents actually delivering value today? This is important to discuss for two reasons:</p><ul><li><p>Many teams legitimately need <em>ideas</em> and inspiration about what to use an agent for.</p></li><li><p>As of today, it is true that some use cases work better than others. Which ones? And why?</p></li></ul><p>If you have to take only one idea away from this section, it&#8217;s that agents that work are most often not trying to be general-purpose assistants that can do anything. They are <strong>focused on specific workflows</strong>, with clear boundaries, and humans in the loop for edge cases.</p><p>About this, the most common area is <strong>automation</strong> &#8212; handling repetitive, multi-step tasks across systems: updating CRMs, processing invoices, syncing data between tools. <a href="https://www.pwc.com/us/en/tech-effect/ai-analytics/ai-agent-survey.html">PwC found</a> that 64% of agent deployments focus on workflow automation.</p><p>A notable subset of automation agents is <strong>UI automation</strong>.</p><p>AI is <em>better</em> at using tools and APIs than it is at clicking around websites, but hey, <strong>many systems don&#8217;t have APIs</strong>! Or they do, but they are incomplete and/or painful to use. There are plenty of industries like healthcare, insurance, or travel, whose platforms are often utterly legacy and have never been designed for automation. On these systems, agents that interact with UIs directly, clicking buttons, filling out forms, or navigating pages, can unlock an insane amount of value even by doing relatively simple tasks.</p><p>As engineers, we often focus on the exciting and sophisticated, and forget there is still a ton of value in the <em>boring</em>.</p><div><hr></div><p><em>About UI automation, allow me a quick plug: this is exactly the problem that the Amazon AGI and AWS teams have been working to solve with <strong><a href="https://fandf.co/464tBjB">Amazon Nova Act</a></strong>. It&#8217;s a managed service for building agents that automate browser-based workflows. These include navigating UIs to validate functionality in web QA testing, filling out forms, or extracting data from pages.</em></p><p><em>I also love their focus on reliability over raw intelligence: Gorka prides that, on early enterprise customer workflows, Nova gets <strong>90%+ reliability</strong>, vs an industry average of 60-70%.</em></p><div><hr></div><p>So, as of today, successful cases do exist, but they are practical and down-to-earth. They focus on <strong>well-defined tasks</strong>, their <em>blast radius</em> for errors is contained, and there&#8217;s a clear baseline to beat (usually: humans doing boring work manually).</p><p>Conversely, what doesn&#8217;t work well yet is <strong>open-ended agents</strong> that require a lot of judgment, long-running autonomous workflows, or anything customer-facing with high stakes. The reliability math just isn&#8217;t there.</p><p>Here are a couple of successful examples from our community &#128071;</p><h4>1) Onboarding</h4><blockquote><p><em>One of the first use cases we&#8217;re piloting is an agentic onboarding flow for customers, where the agent automates parts of the activation process.</em></p><p><em>The goal is simple: scale onboarding capacity while shifting human agents toward higher-value interactions. We&#8217;re currently A/B testing this against our regular onboarding flow, and just started validating early data and customer feedback.<br><br>&#8212; </em><a href="https://www.linkedin.com/in/nithin-ss/">Nithin SS</a><em> &#8226; </em>Head of QA at Lodgify</p></blockquote><h4>2) Phone Screening</h4><blockquote><p><em>Our AI Operations Team finished a first version of a phone screening Agent using <a href="https://www.telli.com/">Telli</a>. </em></p><p><em>The use case is that at Zenjob we are selecting students for certain temporary/short term jobs and for some cases where we need more comittment from them AI Agents do a phone screening interview call + some assessment is also done. </em></p><p><em>It&#8217;s still fine-tuned but recently the team integrated it into Retool Dashboard for our Operators Team.</em><br><br>&#8212; <a href="https://www.linkedin.com/in/ferittopcu/">Ferit Topcu</a> &#8226; Engineering Manager at Zenjob</p></blockquote><div><hr></div><h2>&#128295; From prototype to production</h2><p>Once you understand how an agent works, and pick a reasonable use case for it, it can still be a long journey from patching together a small prototype to running something that works (and delivers value) in production.</p><p>To get there, here are the things you need to pay attention to:</p><h3>1) Compounding errors &#128201;</h3><p>In my experience, this is the most fundamental problem. In any multi-step workflow, small error rates at each step multiply into large failure rates overall.</p><p>Quick math: if each step in an agent workflow has 95% reliability (which is optimistic) &#8212; then over 20 steps you&#8217;re left with just 36% success &#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_!BN6z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BN6z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 424w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 848w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 1272w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BN6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png" width="1338" height="704" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:704,&quot;width&quot;:1338,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114883,&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/184853067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.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_!BN6z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 424w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 848w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 1272w, https://substackcdn.com/image/fetch/$s_!BN6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F236dd373-2e4d-400c-bc16-d54e3270ff47_1338x704.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Error rates compound fast when the number of steps increases</figcaption></figure></div><p>This is also why demos look so good: they are short and show the happy path, maybe 3-5 steps, carefully chosen.</p><p>The way you counter this is:</p><ul><li><p><strong>Start small</strong> &#8212; as said above, pick a single, well-defined use case with clear success criteria. Design a small number of steps and make each one as easy as possible.</p></li><li><p><strong>Design for human-in-the-loop</strong> &#8212; what decisions can the agent make alone? What requires approval? A simple heuristic: if the action is reversible and low-cost, let the agent proceed. If it&#8217;s irreversible or high-stakes&#8212;like sending money, deleting data, or external comms&#8212;require human approval. Build escalation paths into the workflow from day one to cap risk and reduce errors on difficult steps.</p></li><li><p><strong>Treat reliability as the key metric</strong> &#8212; focus on the percentage of tasks completed successfully. Evaluate and iterate all the time!</p></li></ul><h3>2) Testing and debugging &#128300;</h3><p>As we all know, agents are non-deterministic: the same input can produce different outputs across runs. This means you can&#8217;t write traditional tests with the same confidence you&#8217;d have for regular software. When something fails, it&#8217;s hard to reproduce.</p><p>For this reason, you should <strong>invest in observability early on</strong>, so you can see what the agent is doing, step by step.</p><p>Concretely: log each step&#8217;s inputs, outputs, and latency. This advice is frankly good for any software, but especially non-deterministic one. Tools like <a href="https://smith.langchain.com/">LangSmith</a>, <a href="https://langfuse.com/">Langfuse</a>, or even structured logging can help. The goal is a full trace from trigger to completion.</p><h3>3) Account for scale &#128200;</h3><p>Deploying agents even at a moderate scale requires taking into account many factors:</p><ul><li><p><strong>Authentication</strong> &#8212; how can the agent act properly on behalf of users across systems?</p></li><li><p><strong>Security</strong> &#8212; are you sure the agent <em>can&#8217;t</em> access things it shouldn&#8217;t?</p></li><li><p><strong>Escalation</strong> &#8212; does the agent know when it needs to pause and escalate to a human?</p></li><li><p><strong>Latency and cost</strong> &#8212; are you accounting for volume? In the LLM world, <a href="https://refactoring.fm/p/how-to-design-apis-for-an-ai-world?utm_source=publication-search">everything compounds fast</a>.</p></li></ul><p>Reflect on all the ways your production environment, with real users and real scale, is different from your confined developer environment.</p><h3>4) Buy vs build &#128179;</h3><p>Finally, consider the buy vs build tradeoffs, and keep a bias for <strong>buying everything that&#8217;s not core to your product</strong>.</p><p>Building agent infrastructure from scratch&#8212;orchestration, tool integrations, deployment pipelines, monitoring&#8212;can be a massive undertaking. If it&#8217;s not going to be strategic IP, it makes sense to use managed platforms that handle part of the complexity, so your team can focus on the actual business logic.</p><p>The options range widely:</p><ul><li><p>For UI automation specifically, <a href="https://fandf.co/3NukylN">Amazon Nova Act</a> provides a managed service that handles the infrastructure complexity and scales seamlessly to production workloads.</p></li><li><p>For no-code workflow automation, platforms like <a href="https://lindy.ai/">Lindy</a>, <a href="https://n8n.io/">n8n</a>, or <a href="https://zapier.com/agents">Zapier Agents</a> let you build agents without writing code.</p></li><li><p>If you want to build in-house with full control, frameworks like <a href="https://www.langchain.com/">LangChain</a> and <a href="https://www.crewai.com/">CrewAI</a> give you the building blocks to create custom agents from scratch.</p></li></ul><div><hr></div><h2>&#128204; Bottom Line</h2><p>And that&#8217;s it for today! Here are the main takeaways:</p><ol><li><p>&#129302; <strong>Agents act, they don&#8217;t just respond</strong> &#8212; The key distinction from chatbots and copilots is that agents take actions with real consequences. This makes them powerful but also risky.</p></li><li><p>&#129521; <strong>Focus on the system, not just the model</strong> &#8212; An agent is made of three parts: the model (brain), the orchestrator (control layer), and the tools (how it acts). Vertical integration across all three is what makes agents reliable.</p></li><li><p>&#128201; <strong>Compounding errors are the killer</strong> &#8212; At 95% reliability per step, a 20-step workflow succeeds only 36% of the time. This is why demos look great but production fails&#8212;demos are short, production workflows are long.</p></li><li><p>&#127919; <strong>Start narrow and specific</strong> &#8212; The agents that work today aren&#8217;t general-purpose. They&#8217;re focused on well-defined workflows like invoice processing, CRM updates, or UI automation where APIs don&#8217;t exist.</p></li><li><p>&#128101; <strong>Design human-in-the-loop from day one</strong> &#8212; Keep humans supervising high-stakes decisions. Agents should be selectively autonomous: independent on routine tasks, supervised on critical ones.</p></li><li><p>&#128300; <strong>Invest in observability early</strong> &#8212; You need to see what the agent is doing, step by step. Log inputs, outputs, and latency to debug non-deterministic systems effectively.</p></li><li><p>&#128179; <strong>Buy the hard parts</strong> &#8212; Building orchestration, deployment, and monitoring from scratch is a massive undertaking. Use managed platforms so you can focus on the workflow logic specific to your business.</p></li></ol><div><hr></div><p><em>A special thanks to Gorka Madariaga and the AWS team for partnering on this piece and providing expertise and and insights. They recently presented a lot of new functionality at re:Invent, so I am linking below a few sessions if you want to learn more:</em></p><ul><li><p><em><a href="https://fandf.co/4b8qpa5">Building useful, reliable agents with Amazon Nova</a></em></p></li><li><p><em><a href="https://fandf.co/3Nv35cP">Beyond web browsers: HITL and tool integration</a></em></p></li></ul><p><em>If you want to learn more about what they&#8217;re building with Amazon Nova, check out their work at <strong><a href="https://fandf.co/3NukylN">aws.amazon.com/nova/</a></strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fandf.co/3NukylN&quot;,&quot;text&quot;:&quot;Learn more about Amazon Nova&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fandf.co/3NukylN"><span>Learn more about Amazon Nova</span></a></p><div><hr></div><p>See you next week!</p><p>Sincerely &#128075;<br>Luca</p>]]></content:encoded></item><item><title><![CDATA[Finding yourself in the AI era ✨]]></title><description><![CDATA[A small personal compass to turn yourself from afraid to excited.]]></description><link>https://refactoring.fm/p/finding-yourself-in-the-ai-era</link><guid isPermaLink="false">https://refactoring.fm/p/finding-yourself-in-the-ai-era</guid><dc:creator><![CDATA[Luca Rossi]]></dc:creator><pubDate>Wed, 14 Jan 2026 08:02:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3ppq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey, Luca here! This is a &#10024; <strong>bonus free essay</strong> &#10024; from Refactoring. Based on our schedule it should have been a paid one! But I really care about this topic so I decided to make it free for everyone. </p><p>If you like this piece, consider subscribing to the <a href="https://refactoring.fm/about">full version</a> of Refactoring to get one every week. It matters a lot to me and it supports our work &#128591;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://refactoring.fm/subscribe?&quot;,&quot;text&quot;:&quot;Learn how to run a better tech team &#128296;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://refactoring.fm/subscribe?"><span>Learn how to run a better tech team &#128296;</span></a></p><div><hr></div><p>Last week, going through my reading list, I happened to read these two blog posts on the same day:</p><ul><li><p><a href="https://orib.dev/nofun.html">LLMs are not fun</a></p></li><li><p><a href="https://ma.ttias.be/web-development-is-fun-again/">Web development is fun again</a></p></li></ul><p>Both authors, Ori and Mattias, are seasoned engineers who have been in tech for ~20 years, but they have opposite <em>feelings</em> about LLMs.</p><p>This is not surprising. With AI <em>forcefully</em> getting into their lives, most engineers I know have developed strong feelings about it, and a <strong>big divide</strong> is happening right now:</p><ul><li><p>Some folks are finding excitement, hope, and empowerment.</p></li><li><p>Others are experiencing anger, fear, or downright <em>grief.</em></p></li></ul><p>In other words, some find it easy to focus on the <strong>new possibilities</strong> opened up by AI, while others can&#8217;t help but mourn what AI is <strong>taking away</strong> from them.</p><p>Also, this is a largely separate conversation from the one about job anxiety, layoffs, and the future of tech. I know <em>excited</em> engineers who are afraid they might lose their job, and others who feel <em>safe</em> but are still sad about what their job might become.</p><p>So, let&#8217;s try to unpack this and figure out how we should think about AI, our jobs, and our identities.</p><div><hr></div><h2>&#129513; Solving puzzles vs solving problems</h2><p>Let&#8217;s take a quote from the &#8220;LLMs are not fun&#8221; article:</p><blockquote><p><em>On the engineering side, using LLMs to write code is as fun as hiring a taskrabbit to <strong>solve my jigsaw puzzles</strong>.</em></p></blockquote><p>This is a popular analogy &#8212; plenty of people compare engineering to solving puzzles. In fact, I believe many people enjoy coding for two reasons:</p><ul><li><p>It provides strong intellectual stimulation</p></li><li><p>It&#8217;s a constrained domain where we can feel <em>in control</em>, as opposed to&#8230; people stuff!</p></li></ul><p>The author of the article admits it himself &#128071;</p><blockquote><p><em>[I got into programming so that] I could step away from tiring, ambiguous human interaction for a while</em></p></blockquote><p>However, it&#8217;s time for the hard truth. We are not paid to <strong>solve puzzles</strong>. We are paid to <strong>solve problems</strong>.</p><p>You might think I am nitpicking, but words matter (I am a writer, forgive me):</p><ul><li><p><strong>We solve </strong><em><strong>puzzles</strong></em><strong> for our own enjoyment.</strong> Puzzles have no purpose outside of the intellectual challenge they provide.</p></li><li><p><strong>We solve </strong><em><strong>problems</strong></em><strong> to help other people.</strong> And these people pay us in return. The fact that problems can <em>also</em> be interesting and puzzle-like is a byproduct of that, not the main point.</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_!3ppq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ppq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 424w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 848w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 1272w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ppq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png" width="1456" height="959" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:959,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:237883,&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/184235918?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.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_!3ppq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 424w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 848w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 1272w, https://substackcdn.com/image/fetch/$s_!3ppq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7081bc5-c34d-4f9a-9264-6098d3e96d94_2052x1352.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">We are not paid to solve puzzles &#8212; unfortunately!</figcaption></figure></div><p>So I&#8217;ll venture into another analogy.</p><p>Let&#8217;s say you are a <strong>professional gardener</strong>, and you grow beautiful gardens for clients. A big part of why you love your job is that you can do daily, blissful walks throughout the gardens, to water the plants.</p><p>Watering the plants feels awesome. You don&#8217;t talk to anyone, you reflect on your life, and you even get decent exercise.</p><p>At some point, <strong>irrigation systems</strong> get invented. You feel bad about them, because you feel they take away your job. Except, watering plants has never been your job! Your job is to grow and maintain the gardens, which includes making sure plants get enough water, which <em>by chance</em> includes you manually watering them.</p><p>Don&#8217;t get me wrong, finding a <em>happy corner</em> within your work is awesome &#8212; as long as you don&#8217;t <em>optimize</em> for it, at the expense of what the true goal is.</p><p>And, unfortunately, I know <em>plenty</em> of people who do that, intentionally or not:</p><ul><li><p>&#8220;<em>I only use LLMs as autocomplete so I can check every single line of code</em>&#8220;</p></li><li><p>&#8220;<em>It takes more time to review LLM code than to write it myself</em>&#8220;</p></li><li><p>&#8220;<em>If I make AI write it, my skills will atrophy</em>&#8221;</p></li></ul><p>As always your mileage may vary and none of this is <em>necessarily</em> wrong, but you should keep your antennas up and intercept when your behavior is guided by your own comfort, as opposed to what is best for the team / product / business.</p><p>But, as we said before, there are also a lot of engineers who are <em>excited</em> about AI. What are these folks getting <em>right</em> that the others are not?</p><p>Let&#8217;s pull a quote from the &#8220;web development is fun again&#8221; article &#128071;</p><blockquote><p><em>I remember when PHP 4 was a thing. [&#8230;] If you had an idea, you could probably build it. As a solo developer, you could manage everything. <strong>From idea to execution</strong>.</em></p></blockquote><p>For this other engineer, coding is about <strong>making ideas come true</strong>. What matters is the <em>idea</em>, not how complex / interesting it is to build &#8212; quite the opposite: complexity <em>gets in the way</em> of making things happen. The less the better.</p><p>With this mindset, AI becomes your <em>savior</em> against the stupid complexity of the modern web, instead of the bad guy that takes away your Legos.</p><p>However, if you are feeling bad about AI <em>right now</em>, this is probably not going to help. You spent what feels like a lifetime getting good at something, and that something feels it is getting less valuable by the day.</p><p>How can you think of yourself differently? How do you <em>reframe</em> your identity?</p><div><hr></div><h2>&#8597;&#65039; Finding a broader identity</h2><p>Last week <a href="https://refactoring.fm/p/career-sabbaticals-and-self-discovery?utm_source=publication-search">I interviewed my friend Thiago Ghisi</a> on the podcast.</p><p>Thiago has had an incredible career in tech in over 15 years. He worked at companies like AMEX, Apple, Thoughtworks, and was <strong>Director of Engineering</strong> at Nubank up until six months ago.</p><p>So what happened then?! He went into a sabbatical, during which he took a step back and explored other things that he liked. He analyzed 15 years of his notes with Claude Code, went through his email data, social media dumps, and found patterns about his behavior.</p><p>Right now, he has just applied to start a <strong>PhD in Clinical Psychology</strong>.</p><p>So if you frame Thiago as a <em>Director of Engineering</em>, this is obviously a departure from what he is expected to do for his career. But if you frame Thiago as someone who has worked as a manager for 10+ years, <strong>helping people become a better version of themselves</strong>, is it still that weird?</p><p>What if later on Thiago develops a coaching program for executives and high-achievers in tech, thanks to his unique blend of engineering &amp; psychology chops? And what if he makes great use of AI for that, which he already started doing by scratching his own itch with Claude Code?</p><p>All of a sudden you might think that all the dots have been connected, and everything Thiago has done during his life has led him to this.</p><p>The problem is: you could never spot this if you simply thought of yourself as a <em>Director of Engineering</em>. You need to find a <em>broader</em> sense of identity for yourself, one that connects <em>more</em> dots, and answers to a deeper why.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MYMl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MYMl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 424w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 848w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 1272w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MYMl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:293136,&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/184235918?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.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_!MYMl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 424w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 848w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 1272w, https://substackcdn.com/image/fetch/$s_!MYMl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb049a8b6-0b0e-4ae5-8dcd-ef1360d5899a_2880x1528.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Career jumps don&#8217;t feel weird if you can connect them to a deeper identity about yourself.</figcaption></figure></div><p>I am not telling you to get into a sabbatical to find it, and the good news is you probably don&#8217;t need to. You can ask yourself simple questions:</p><ul><li><p><strong>Why do I do what I do?</strong></p></li><li><p><strong>What&#8217;s a </strong><em><strong>broader</strong></em><strong> version of what I do?</strong> &#8212; Does it still look like me?</p></li><li><p><strong>What hobbies do I have?</strong> &#8212; Is there any that <em>connects</em> with some of these broader identities?</p></li></ul><p>What&#8217;s the <strong>greatest common denominator</strong> of the things you do in your life?</p><p>If you feel like you are someone who crafts great backend software, would it be comfortable to step back and say you are someone who <strong>crafts great software products</strong>, in general? Would that still feel like you?</p><p>And why software? Could you say you are someone who likes to <strong>craft useful stuff</strong>, in general? Ha, I see that 3d printer there, gotcha.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nl2V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nl2V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 424w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 848w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 1272w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nl2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png" width="1456" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:282976,&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/184235918?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.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_!nl2V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 424w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 848w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 1272w, https://substackcdn.com/image/fetch/$s_!nl2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65bb3b31-407e-4efa-93f3-940186b0fd2b_2498x1386.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Enough with Venn diagrams?! Last one, I promise.</figcaption></figure></div><p>Now you might think, why should all these <em>contortions</em> be any useful? Because there is a world of difference between thinking:</p><ol><li><p><strong>I am a backend engineer who is an expert in algorithms and data structures</strong>, and</p></li><li><p><strong>I am a software engineer who creates great products</strong> &#8212; and currently works with data structures on this team.</p></li></ol><p>The first guy is going to get mad at AI for becoming equally good (or better!) at their algorithms, while the second one is more likely to say &#8220;<em>cool! I&#8217;ll do this thing faster and move to something else</em>&#8221;.</p><div><hr></div><h2>&#128130;&#8205;&#9794;&#65039; For managers: help your team navigate this</h2><p>I want to close by addressing managers, because a lot of this is <strong>on you</strong>.</p><p>People can do amazing work at embracing AI <em>individually</em>, but it&#8217;s on you to <strong>create avenues</strong> that allow this work to turn into true leverage.</p><p><strong>AI is like a tide that raises the floor</strong> &#8212; people get <em>higher</em>, but if you don&#8217;t also <strong>raise the ceiling</strong>, they may get trapped. What do I mean?</p><p>Let&#8217;s say your backend engineer sticks to their typical backend work plus adds Claude Code on top of it. By using AI to do <em>more</em> of the same work, more and more of their day might be spent fixing AI bugs. They might be faster than before, but 1) they are still in their lane, so there is a cap to how fast they can get, and, 2) work is now miserable instead of creative.</p><p>So we need to think <strong>intentionally about how engineers spend their time</strong>. As AI takes over <em>some</em> of the work, the question becomes: what do you do with this residual time?</p><p>I don&#8217;t buy the answer that you just do more of the same, so the question turns into: what&#8217;s a broader scope of work that:</p><ol><li><p><strong>Creates professional growth</strong>, and</p></li><li><p><strong>Delivers business value?</strong></p></li></ol><p>Both are required. If the scope of work is not enjoyable or doesn&#8217;t create growth, people will hate it and leave. And if it doesn&#8217;t deliver value, what are we even doing here?!</p><p>To me, a big part of this looks like <strong>making engineers care about solving problems for people</strong>.</p><ul><li><p>Sometimes these people are customers, and that&#8217;s Product Engineering. </p></li><li><p>Sometimes these people are <em>other engineers</em> from their team, and that&#8217;s Platform Engineering. </p></li><li><p>Sometimes it&#8217;s co-workers from sales, from customer success, from operations, and it&#8217;s about <em>empowering</em> them to do a better job.</p></li></ul><p>Understanding this means <em>aligning</em> how engineers see their work with what success looks like for the business. When this happens, it&#8217;s easier for AI to make people not only go faster &#8212; but go faster in the right direction. And it&#8217;s easier for people to go after new things <em>that make sense</em>, instead of going off on a tangent.</p><p>In other words, if people accept to move <em>past</em> solving puzzles and on to solving problems, <strong>do they even know what the larger problems look like?</strong></p><p>It&#8217;s on you to make them know! Let&#8217;s get to work &#128170;</p><div><hr></div><h2>&#128204; Bottom Line</h2><p>And that&#8217;s it for today! Here are the main takeaways:</p><ol><li><p>&#129513; <strong>We are paid to solve problems, not puzzles</strong> &#8212; the intellectual stimulation of coding is a byproduct of our real job, which is helping people (and making money!) through software.</p></li><li><p>&#128161; <strong>Reframe AI as an enabler, not a threat</strong> &#8212; engineers who thrive with AI focus on <em>making ideas come true</em>, viewing complexity as an obstacle rather than the point. AI becomes a tool against tedious work, not a rival.</p></li><li><p>&#129694; <strong>Find a broader identity</strong> &#8212; instead of defining yourself narrowly (e.g., &#8220;backend engineer expert in algorithms&#8221;), zoom out to something like &#8220;someone who crafts useful products.&#8221; This makes AI feel like a tool, not an existential threat.</p></li><li><p>&#128269; <strong>Watch for comfort-driven behavior</strong> &#8212; statements like &#8220;reviewing AI code takes longer than writing it myself&#8221; may signal optimization for personal comfort over team/business outcomes. Keep your antennas up.</p></li><li><p>&#128682; <strong>Managers: raise the ceiling, not just the floor</strong> &#8212; AI lifts everyone&#8217;s baseline productivity, but without expanding scope and growth opportunities, engineers get trapped doing more of the same, faster, and more miserably.</p></li><li><p>&#127919; <strong>Align engineers with real problems</strong> &#8212; help your team understand what success looks like for the business. When people move past puzzles and on to solving <em>problems for people</em>, AI becomes fuel rather than friction.</p></li></ol><div><hr></div><p>I wish you a great week!</p><p>Sincerely<br>Luca</p>]]></content:encoded></item></channel></rss>