<?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[The Cultivated Engineer]]></title><description><![CDATA[Wax on, wax off – deliberate practice for software engineers.]]></description><link>https://blog.cultivated.engineer</link><image><url>https://substackcdn.com/image/fetch/$s_!nCpA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2475d6e-519e-4556-8ef0-8a88454e7361_500x500.png</url><title>The Cultivated Engineer</title><link>https://blog.cultivated.engineer</link></image><generator>Substack</generator><lastBuildDate>Sun, 03 May 2026 12:13:59 GMT</lastBuildDate><atom:link href="https://blog.cultivated.engineer/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dario Hamidi]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[cultivatedengineer@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[cultivatedengineer@substack.com]]></itunes:email><itunes:name><![CDATA[Dario Hamidi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dario Hamidi]]></itunes:author><googleplay:owner><![CDATA[cultivatedengineer@substack.com]]></googleplay:owner><googleplay:email><![CDATA[cultivatedengineer@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dario Hamidi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[2025: when software became commodity]]></title><description><![CDATA[Are you building? What even IS quality?]]></description><link>https://blog.cultivated.engineer/p/2025-when-software-became-commodity</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/2025-when-software-became-commodity</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Thu, 01 Jan 2026 17:58:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BAyN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last year was a wild year when it comes to developing software and building systems.</p><p>We started with models that could reliably generate individual functions with enough hand-holding, and remove some of the drudgery of building software, and ended the year with Opus 4.5 reliably taking on complex tasks, allowing the programmer to focus on higher-level concerns like architecture and dataflow.</p><p><a href="https://agentskills.io/home">Skills</a> made a huge splash because loading information lazily into the context window makes context management much easier.</p><p><a href="https://github.com/humanlayer/advanced-context-engineering-for-coding-agents">Context Engineering</a> should have gotten more attention, but I predict it&#8217;ll get more of that in 2026 as we&#8217;re moving past generating loads of code at high speed.</p><h2>It&#8217;s a Great Time to Be a Builder</h2><p>While some engineers still lament the fact that LLM-assisted coding &#8211; let&#8217;s call it agentic engineering &#8211; is taking the joy out of programming, and causes skill decay, others are busy building.</p><p>As with any tool, the responsibility for good outcomes lies with the user and good tools nudge the user toward good outcomes.</p><p>Since LLMs are <em>so </em>flexible, this needs experience and a large number of hours spent interacting with the models.</p><p>You need to develop a &#8220;feel&#8221; for what individual models are good at, where they are going off the rails and what they struggle with.</p><p>But once you do, you can focus on the outcomes you create.</p><p>You can eliminate the boring parts to get to the interesting parts that let you learn more and hone your skills.</p><p>And that in turn allows you to build interesting software that is <em>actually used</em>. </p><p>This is difficult if your identity is attached to the process of writing software, and not the process of building products.</p><p>Both approaches require placing attention in different places and operator attention is the limiting factor when the LLM can read and write code many times faster than you do.</p><p>Coming from the <em>process of writing software </em>side, you want to focus on system architecture, data structures and data modelling.  The concepts you are dealing with are mainly technical and LLMs come in handy as sounding boards and typing aids.</p><p>Approaching problems from the <em>product side </em>couldn&#8217;t be more different: technological choices are relevant only in so far as they allow you to try, validate, and develop new product ideas to see what is worth keeping and what needs to be discarded.  The faster you can iterate, the better, and features that have made it through this filter deserve to get more technical attention so that they don&#8217;t turn into attention sinks over time.</p><p>Now, the more technical expertise you have, the better you can execute on product iteration because you are positioned to make better technical choices, but critically you must <em>still start from the product, not the technology.</em></p><p>A concrete example from Amp: <a href="https://ampcode.com/news/look-at">I gave Amp a built-in tool to extract targeted information from media files</a> which was technically very simple but resonated a lot with Amp&#8217;s users because it addressed a real pain point.  Thinking about technology first when looking for things to build in the product would have made me miss this opportunity.</p><h2>The New Quality Bar</h2><p>With LLMs and coding agents ready to take care of the grunt work of launching a new project, the bar for new projects has risen.</p><p>Baseline expectations now include:</p><ul><li><p>developer and agent-friendly documentation,</p></li><li><p>a logo,</p></li><li><p>a website,</p></li><li><p>integration with popular package managers</p></li></ul><p>None of these things are <em>hard </em>but they used to require enough effort to not be worth it for a side project.</p><p>Now getting a basic version of any of these done is just a prompt away.  Of course, it&#8217;s not perfect and needs manual touch ups after the fact, but it&#8217;s easy enough to actually ship it now that expectations have changed.</p><p>Which brings up the larger point of <em>what even is quality?</em></p><p>The best definition I&#8217;ve seen so far was from my time at Toptal:</p><div class="callout-block" data-callout="true"><p>Quality means meeting expectations.</p></div><p>This simplistic definition skirts around the fact that usually there are multiple parties with different expectations involved, but generally the point holds.</p><p>Applied to the systems you are building: how important is what&#8217;s under the hood if it meets all expectations and can be discared/rebuilt with a relatively small investment?</p><h2>Encoding Expectations</h2><p>The big question to answer in 2026 is how to encode and specify <em>expectations</em>.</p><p>Only when expectations toward the software have been stated can we measure quality.</p><p>This goes beyond unit and integration tests to encompass metrics from the running system like memory usage, rate of exceptions, average response time.</p><p>Personally this nudges me to think that we&#8217;ll keep fast unit tests for iterating in the inner loop, and in addition to that get more blackbox tests that <em>operate </em>the system to assert certain qualities.</p><p>These tests should make zero assumptions about the implementation and use the application through well-defined interfaces and protocols, written under the assumption that the entire codebase will be burned down and rewritten eventually.</p><p>One way to achieve this is to treat testcases as data and have a custom test harness program evaluate them.  I&#8217;m playing around with this approach in <a href="https://www.feather-lang.dev">Feather</a> where the same testsuite is used for multiple implementations of the system.  </p><p>So far it has given me good results: discrepancies are easy to spot, the agent can fix them quickly and I can use known good implementation for creating a golden master of a test case.</p><p>The price is the cost of developing the test harness program, which in practice seems to be low, since programs of that type aren&#8217;t new or particularly complex.</p><h2>Rebuilding Foundations</h2><p>A lot of the software we use carries around properties of the environment in which it was born: React, Angular, and Vue were born at a time when vanilla JavaScript wasn&#8217;t particularly capable, browser support of useful features was spotty, and smartphones with embedded browsers were <em>new</em>, just introducing unstable low-bandwidth connections back into the equation.</p><p>How would a web framework built in 2025 look like? HTTP/2 brought a much higher simultaneous connection limit, smartphones are ubiquitous and mobile connectivity has improved by leaps and bounds.  This allows for a different set of tradeoffs in the design and implementation of the framework, unencumbered by history.</p><p>But agentic engineering has lowered the cost of code generation so much, that exploring <em>rebuilding </em>infrastructure on new foundations is feasible:</p><ul><li><p>what if you built an implementation of your favorite programming language that used WASM as its internal bytecode or sole compilation target?</p></li><li><p>what if you built something like Ruby on Rails, Next.js or any other fullstack framework with coding agents in mind, under the assumption that developer won&#8217;t be even looking at the code?</p></li><li><p>Supabase gives you Postgres through an API call, what if you gave every customer their own database?</p></li><li><p>Server-Sent-Events have become mainstream and well-supported, how would building a web-application realtime first look like?</p></li></ul><p>I&#8217;m exploring this direction currently by re-implementing TCL in the form of <a href="https://www.feather-lang.dev">Feather</a> &#8211; TCL was created at a time when most applications were written in C and has a great story for embedding it in C.</p><p>But today&#8217;s applications are different: they provide a lot of the infrastructure that TCL does, like garbage collection and rich datastructures, and having to map back-and-forth in the host language is tedious.</p><p>How can we reimagine this so that the embedded language only provides the syntax and semantics, but data, memory and I/O are managed by the host?</p><p>And why even care in the first place?</p><p>An interactive Read-Eval-Print-Loop (REPL) allows for much faster feedback cycles both for humans and agents, but the options for embedding languages for that purpose are pretty slim.</p><p>The models are well-trained in Bash, and TCL has a lot of syntatic and semantic overlap that hopefully this carries over.</p><p>Like in this prototype, where the UI is defined through Feather/TCL and can be inspected and changed at runtime, just like in the browser:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e0288267-bc7a-4cb5-b26a-b0b442a8b32b&quot;,&quot;duration&quot;:null}"></div><h2>What&#8217;s Next</h2><p>My goal for 2026 is to write in general, and especially here.  To make this work, I&#8217;ve decided to focus on reporting on my active side projects.</p><p>The biggest non-Amp projects in the works currently are:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BAyN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BAyN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BAyN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png" width="128" height="128" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:512,&quot;resizeWidth&quot;:128,&quot;bytes&quot;:207206,&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://blog.cultivated.engineer/i/183149829?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.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_!BAyN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 424w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 848w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 1272w, https://substackcdn.com/image/fetch/$s_!BAyN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a4caf35-35b2-419d-94f1-e76cf9546ce0_512x512.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><a href="https://www.feather-lang.dev">Feather</a>, a tiny programming language for adding interactivity to applications, fully built by coding agents.</p><p>And the <a href="https://t.me/decode_estonian_tutor_bot">Decode Estonian Tutor Bot</a> where I explore architecture approaches that sound good in theory, to see whether they are a good fit in practice &#8211; like giving every user their own complete instance of the system.</p><p>Stay tuned, and have a great start into the New Year!</p>]]></content:encoded></item><item><title><![CDATA[Not All Gems Are Rubies]]></title><description><![CDATA[A peek into a parallel branch of software evolution]]></description><link>https://blog.cultivated.engineer/p/not-all-gems-are-rubies</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/not-all-gems-are-rubies</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Thu, 18 Sep 2025 15:00:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BpdG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BpdG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BpdG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BpdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png" width="398" height="398" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:398,&quot;bytes&quot;:1595711,&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://blog.cultivated.engineer/i/172456139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BpdG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BpdG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc1523-1b1f-4a52-9f31-ea7a6543ebe7_1024x1024.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><h1>Intention</h1><p>Maybe I spent too much <a href="https://www.youtube.com/watch?v=vagyIcmIGOQ">time listening to DHH</a> but one point from that interview stuck with me: there is beauty in programming, unfortunately we often forget about it.</p><p>Beauty of course is in the eye of the beholder, but simplicity is not.</p><p>Over time I&#8217;ve come to associate these two notions with the shortest path from <em>intention </em>to <em>execution</em>.</p><p>Good tools, including programming languages, libraries, and frameworks make this path as short as possible for the common case, while exposing the necessary knobs and levers to make more veering off that path possible.</p><p>I chalk the enduring success of command languages like Bash up to this property.</p><p>Nobody wants to type <code>require("fs").unlinkSync("temp.md")</code> when they can type <code>rm temp.md</code> instead.</p><p>The <code>rm</code> command does much more than calling <a href="https://man7.org/linux/man-pages/man2/unlink.2.html">unlink(2)</a> under the hood, like supporting removing both files and directories and protecting against accidental destruction with interactive prompts.</p><p>All of these features surface on the <em>intention </em>layer of the command: adding <code>-r</code> makes rm remove files recursively, <code>-f</code> turns off any kind of approval prompts.</p><p>"I want to remove all files here, don't ask, I'm sure" </p><p>becomes simply</p><p>"<code>rm -rf .</code>"</p><p>Every character is imbued with meaning in this command, there is nothing that can be left off without losing information from the intention.</p><p>This is beautiful.</p><p>It pushes all of the complexity of achieving a goal into a blackbox you don't need to worry about, unless building that blackbox <em>is </em>your job.</p><p>It is <em>abstraction </em>that is so powerful by <em>pulling us away from unnecessary detail</em>.</p><p>Finding the right abstractions is hard, and you know when you have found the <em>wrong </em>one when the abstraction actively gets in your way and makes achieving your goal hard.</p><p>Ruby on Rails made waves when its latest release <a href="https://guides.rubyonrails.org/security.html#authentication">included an authentication generator</a>, with DHH half-jokingly proclaiming on stage that he artisanally crafted every line of code of that generator and that core functionality needn't be outsourced to third parties if implementation is easy and you can <em>own </em>the implementation.</p><p>And easy it is: <em>rails generate authentication </em>is the shortest path from intention to execution again, creating <strong>15(!)</strong> files in your project, in the right places with the right content.</p><p>Notably, the generator stops just shy of a full system: your application still needs to create users, and you&#8217;ll have to build the signup page.</p><p>These &#8220;gaps&#8221; are key: there a many possible valid solutions to both of these problems, and providing one out of the box is guaranteed to be only <em>sometimes right</em>.</p><p>"Should you store cryptographically secure password hashes in your database" on the other hand has only one objectively right answer and is thus included as part of the generated code.</p><p>Generating the code and writing it directly into your project gives you a naked abstraction without a protective layer: you can just go ahead and modify the code to your needs.  You have the power to do so, with the accompanying responsibility.</p><p>It gives you a clear path to <em>ownership</em>.</p><h1>AI</h1><p>Agentic coding tools are great when employed for the right purpose.</p><p>DHH advocates for asking ChatGPT to learn more about a subject, but actually type out all of the code to <em>learn yourself</em>.</p><p>He used this technique to finally learn Bash properly when creating <a href="https://omarchy.org/">Omarchy</a>, his for-developers Linux distribution.</p><p>At first this sounded silly to me.</p><p>Kind of like when <a href="https://tailwindcss.com/">tailwindcss</a> was new and everyone who learned CSS was scratching their head wondering about how this could possibly be a good idea.</p><p>Well, I tried the suggestion in the meantime in an area outside of my expertise and oh boy did it help with learning.</p><p>It's the best tutor I didn't know I needed.</p><p><em>Learning </em>and <em>execution</em> are different modes of operation, requiring different approaches.</p><p>Having <a href="https://ampcode.com">Amp</a> conjure up an executable toy example of a problem I&#8217;m trying to understand is a great tool when I'm at a stage of not yet knowing what I want.</p><p>It encourages progressively going deeper, until the picture is finally clear in my head.</p><p>Clarity about inner workings is essential to developing your own sense of intention.</p><p>Clear intention is what enables successful use of agentic coding tools: without knowing what you want, you cannot transfer your intention to the eager code writing machine.</p><p>Exchanges with LLMs aren't one-sided and gaps in your intention and understanding are surfaced when you feel unsatisfied with the output generated by state of the art models.</p><p>More often than not it's not a shortcoming of the model, but a few critical bits of information missing from the data provided to the model.</p><h1>TCL</h1><p>TCL is short for Tool Command Language.</p><p>An old version of it is pre-installed on your Mac.</p><p>Development started in the late 80s, when the Internet was essentially limited to academia.</p><p>A language like TCL is what happens when you make <em>ease of abstraction </em>and <em>meta-programming</em> guiding principles, while still maintaining a simple syntax.</p><p>TCL syntax is limited to the bare essentials necessary for expressing intent, and evaluation is delayed until the very last moment.</p><p>If you run this in the wish interpreter, you&#8217;ll get a native UI window in four lines of text:</p><pre><code>wm title . "hello, dear reader"
label .message -text "Hey &#128075;" -padx 24 -pady 24
pack .message
focus .</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BTmu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BTmu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 424w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 848w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 1272w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BTmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png" width="386" height="293.50798722044726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:626,&quot;resizeWidth&quot;:386,&quot;bytes&quot;:98812,&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://blog.cultivated.engineer/i/172456139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.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_!BTmu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 424w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 848w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.png 1272w, https://substackcdn.com/image/fetch/$s_!BTmu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e22b313-f32b-4090-baa8-9616be3d5f29_626x476.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>This sits very high on the tower of abstraction, and that is what made the language so attractive to me.</p><p>For the last four weeks, I&#8217;ve been idly playing with it, and it has lured me in deeper and deeper with it&#8217;s ability to strip down code to its bare essentials.</p><p>In my quest for knowledge, I learned that there is a whole parallel universe running on mostly native code, with a sprinkle of Tcl on top:</p><ul><li><p>sqlite3 started as a Tcl extension,</p></li><li><p>there&#8217;s a git-compatible version-control system called <a href="https://fossil-scm.org/">Fossil</a> which ships half of GitHub&#8217;s features in a 4 MB native binary,</p></li><li><p>Tk which makes GUIs like the one above possible is native glue between the operating system&#8217;s native widgets and Tcl,</p></li><li><p>almost the entire community-provided code just ships with Tcl in the form of tcllib (imagine installing all npm packages alongside node),</p></li><li><p>the main source of information is the <a href="https://wiki.tcl-lang.org/">wiki</a> where information is interspersed with comments from users.</p></li></ul><p>After the initial shock of "this is weird", I noticed that this encourages an engineering culture which:</p><ul><li><p>values backward compatibility,</p></li><li><p>fearlessly relies on the system package manager for dependency management,</p></li><li><p>is mindful of performance,</p></li><li><p>and encourages <a href="https://web.stanford.edu/~ouster/cgi-bin/book.php">narrow-but-deep modules</a>.</p></li></ul><p>The latter is no coincidence, as the author of &#8220;A philosophy of Software Design&#8221;, the creator of TCL, and the Raft distributed consensus protocol <em>are the same person</em>.</p><p>With AI making code generation cheap, especially the formulaic kind that is necessary for creating programming language bindings, this culture and the associated software stack is suddenly viable again.</p><p>This raises a couple of questions:</p><ul><li><p>is generating bindings for libraries a <em>skill </em>that you can get better at, or can this be done fully automatically without much oversight?</p></li><li><p>which technologies become viable now that weren&#8217;t before?  Maybe Ruby is fast enough for more things, when you can easily port over some modules to native code.</p></li><li><p>how important are external dependencies when you can get the precise subset of the functionality you need in code you control?</p></li></ul><p>I intend to find out by writing a small command line utility in C with a sprinkling of TCL on top.</p><p>Just to see how: how will this feel like?</p><p>Maybe it&#8217;s good, and we&#8217;ve just forgotten.</p><p></p>]]></content:encoded></item><item><title><![CDATA[How I work with subagents]]></title><description><![CDATA[...or how I rarely use more than 50% of the available context window anymore]]></description><link>https://blog.cultivated.engineer/p/how-i-work-with-subagents</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/how-i-work-with-subagents</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Sun, 27 Jul 2025 14:28:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aNrp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aNrp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aNrp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 424w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 848w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aNrp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png" width="498" height="517.5600942655145" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1323,&quot;width&quot;:1273,&quot;resizeWidth&quot;:498,&quot;bytes&quot;:176495,&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://blog.cultivated.engineer/i/169372398?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.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_!aNrp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 424w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 848w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!aNrp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11792c04-1caa-4cad-8745-bdf13d688ebe_1273x1323.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>When I started working with <a href="https://ampcode.com/manual#subagents">subagents</a>, I first viewed them as a convenience to <em>produce </em>more.</p><p>It is easy to tell the model to use many subagents in parallel and then watch your coding agent call N times as many tools in parallel and get a sense of satisfaction from this.</p><p>While this is a clear benefit when you already have a plan with easily parallelizable chunks of work like adding new UI components in the frontend and a matching API endpoint in the backend, I found subagents to offer greater value when using them for long <em>sequential </em>tasks.</p><p>The key to this is that <em>every subagent gets its own context window</em>.</p><p>With a bit of care while prompting the agent in the main conversation, you essentially keep <em>progress information</em> in the main agent context, while <em>small implementation decisions </em>are encapsulated in the subagent context windows.</p><p>This &#8220;progress overview&#8221; in the main conversation helps with keeping the subagents on track and surfaces gaps in your initial prompt - I usually notice this when the subagent made a decision that was not in line with the plan given to the main agent.</p><p>Following this process I have gotten 5-10 subagent calls done within the context of one main agent conversation, which for the most part felt like turning the crank of a manual coffee grinder.</p><p>The crank-turning prompt usually looks like this:</p><blockquote><p>Study @docs/implementation.md, the plan is X</p></blockquote><p>Where docs/implementation.md describes the general development process and how the input is used:</p><blockquote><p>Study the plan in X.</p><p>Find the next incomplete step.</p><p>You must ask the user whether this step is correct and you should proceed.</p><p>Then, if the plan is correct:</p><p>1. Prepare a test for the step</p><p>2. Run the test and watch it fail</p><p>3. Implement a fix</p><p>4. Run the test again</p><p>5. If it fails, update the implementation until tests pass</p><p>6. When done, report back to the user.</p><p>Use a subagent for each step, running the steps in sequence, one at a time.</p></blockquote><p>With this in place, the main conversation mostly looks like this:</p><blockquote><p>Me: Study &#8230;</p><p>Agent: can I proceed with step X</p><p>Me: Yes</p><p>Agent: I am done - &lt;long report&gt;.</p><p>Me: Commit; Study &#8230;</p><p>&#8230;</p></blockquote><p>I found this process to give good control over results, while increasing the time the agent works independently to multiple minutes before another check-in is required.</p>]]></content:encoded></item><item><title><![CDATA[Thinking Traps from the pre-agentic age]]></title><description><![CDATA[Just like water is invisible to fish, so are habits that I&#8217;ve built up over the years before agentic coding.]]></description><link>https://blog.cultivated.engineer/p/thinking-traps-from-the-pre-agentic</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/thinking-traps-from-the-pre-agentic</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Tue, 24 Jun 2025 17:45:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b7605020-65a6-4b97-a18d-e6744b3886f4_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;6670a51f-8861-4f72-89ca-23d1b59d06ec&quot;,&quot;duration&quot;:null}"></div><p>Just like water is invisible to fish, so are habits that I&#8217;ve built up over the years before agentic coding.</p><p>Only last week did I wake up to the fact, that yes, even invisible parts of the process need to be re-examined.</p><p>Here are some of the things I found &#8211; if you have any to share, I&#8217;m all ears!</p><p>If you only have one minute, the guiding idea here is this:</p><div class="pullquote"><p>What do I assume that the agent doesn&#8217;t know about?</p></div><h2>tmux for everything</h2><p>I use <a href="https://github.com/tmux/tmux">tmux</a> for everything I do, because it turns the terminal into a tool more powerful than any desktop application could be &#8211; you get:</p><ul><li><p>infinite scrollback,</p></li><li><p>persistent execution environments,</p></li><li><p>infinite terminal real-estate,</p></li><li><p>easy, global key bindings,</p></li><li><p>full automation access to everything.</p></li></ul><p>The thing is, I&#8217;ve gotten so used to tmux, that I stopped &#8220;seeing&#8221; it.</p><p>It just became muscle memory, invisible like air.</p><p>For a reason I don&#8217;t remember, I became <em>aware </em>again of being inside tmux and realized: of course, the agent is not aware! It can&#8217;t be!</p><p>So <em>telling the agent that it has access to tmux </em>unlocked all of the benefits above for the agent:</p><ul><li><p>managing long-running processes is not an issue anymore,</p></li><li><p>giving it access to the history of failed commands in context allows it to make better decisions going forward,</p></li><li><p>execution context/history persist <em>across context windows </em></p></li></ul><p>If you want to try this out yourself, here is the prompt I use to inform that agent about this:</p><pre><code>You are running inside tmux (${SRC}) - from now on, when you need to execute commands, you run them in ${DEST}.

To inspect the output, capture the contents of ${DEST}:

```
# capture visible area
tmux capture-pane -p -S 0 -E -
# capture 200 lines before visible output until the end
tmux capture-pane -p -S -200
```

When using the bash tool, you must run all commands through tmux.
</code></pre><p><a href="https://github.com/dhamidi/proompt">Replace</a> ${SRC} with where the commands should go and ${DEST} with where it&#8217;ll find the output (often these will be the same).</p><p>For example, if you have one session named x, then setting SRC and DEST to `x:1.1` will run commands in the first pane of the first window in that session, scraping that for the output.</p><p>This is similar in spirit to giving the agent access to the browser to inspect the results of frontend code changes &#8211; here we just apply the same idea to the terminal.</p><p><strong>Next up: </strong>finding a remote-control extension for VSCode and testing whether I can use the same trick there.</p><h2>The ecosystem is too small&#8230;</h2><p>This one bit hard &#8211; I found myself opposing a technology, because it looked like it does not have much of an ecosystem around it.</p><p>The problem space was well-known: interactive terminal applications, it&#8217;s just that in node.js land there aren&#8217;t many options to do this well compared to Go and Rust.</p><p>So the natural impulse was to &#8220;pick the right tool for the job&#8221;.</p><p>Careful! This is pre-agentic thinking!</p><p>Porting over libraries while staying in the same programming paradigm/problem domain is <em>essentially free now</em>.</p><p>The cost of porting over e.g. charmbracelet&#8217;s <a href="https://github.com/charmbracelet/x/tree/main/ansi">ansi terminal library to node.js</a> is minimal - the only challenges to solve are accessing the underlying platform (e.g. Windows) portably, but that too can be handled as a separate problem by an agent.</p><p>Once this work has been done, libraries that build on top of <em>that </em> can be ported over&#8230;</p><p>And so on, until you reach the level of abstraction you were looking for originally.</p><p>Of course, this requires skill and practice, but &#8220;let&#8217;s rewrite X in $LANGUAGE&#8221; has rarely been cheap enough to actually follow through.</p><p>The crucial bit here which makes this approach work is that <em>you already have an objective definition of correct</em>.</p><p>Namely: whatever the library you are porting does, is correct.</p><p>This allows the agent to self-correct and iterate toward a solution.</p><div><hr></div><p>Have you identified any &#8220;thinking traps&#8221; in your own thinking?</p><p>What are they?</p><p>If not &#8211; where would you look first?</p>]]></content:encoded></item><item><title><![CDATA[Introducing texted – a text editor for LLMs]]></title><description><![CDATA[...what happens when LLMs edit text like humans?]]></description><link>https://blog.cultivated.engineer/p/introducing-texted-a-text-editor</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/introducing-texted-a-text-editor</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Thu, 05 Jun 2025 12:54:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ni0o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ni0o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ni0o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ni0o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png" width="202" height="202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:202,&quot;bytes&quot;:14949,&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://blog.cultivated.engineer/i/165262260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.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_!ni0o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!ni0o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c42cdb-a2b1-4bb4-ab3b-fcadb8721325_500x500.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/dhamidi/texted&quot;,&quot;text&quot;:&quot;View on Github&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/dhamidi/texted"><span>View on Github</span></a></p><p>Seeing LLMs struggle with file edits sometimes degenerates into this:</p><blockquote><p><strong>Model</strong>: let me edit the file to remove comments.</p><p><strong>Tool(edit_file)</strong>: old_str is not present in the file</p><p><strong>Model</strong>: I see there is an issue with editing the file, let me try again</p><p><strong>Tool(edit_file)</strong>: old_str and new_str must be different</p><p><strong>Model</strong>: Let me try a different approach</p><p><strong>Tool(bash): </strong>sed -i "s/\"old_str\\"/new_str" file.go<br>Unexpected EOF while looking for matching `"'</p><p><strong>Model: </strong>Let me rewrite the entire file from scratch</p></blockquote><p>This got me thinking &#8211; what if instead of `sed` there was a more powerful tool that the LLM could use?</p><p>One that is easier to understand.</p><p>The desire to get an answer was so strong, I had to get to work right away.</p><p>The result is <a href="https://github.com/dhamidi/texted">texted</a>, a headless, scriptable text editor meant to be used by LLMs (or you, if you don&#8217;t like writing sed scripts).</p><p>After 7 hours and $50 in Anthropic credits, the first version came out of the oven and still steaming, I plugged into the Claude Code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!poT4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!poT4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 424w, https://substackcdn.com/image/fetch/$s_!poT4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 848w, https://substackcdn.com/image/fetch/$s_!poT4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!poT4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!poT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164972,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.cultivated.engineer/i/165262260?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.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_!poT4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 424w, https://substackcdn.com/image/fetch/$s_!poT4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 848w, https://substackcdn.com/image/fetch/$s_!poT4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!poT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa702de35-adb2-41a6-9404-cc7b79a0ffcc_1600x840.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>To my surprise: it worked!</p><p>I mean, edited a file successfully without reading it more than once &#8211; that&#8217;s a win already.</p><p>But more interestingly, it provided some evidence that LLMs can handle made up languages just fine, which opens up all kind of interesting doors</p><h2>Designing texted</h2><p>Quick, what programming language is:</p><ul><li><p>has been around for 40 years,</p></li><li><p>is specialized for text editing,</p></li><li><p>and easy on the eyes.</p></li></ul><p>It can&#8217;t be Vimscript - on account of not being &#8220;easy on the eyes&#8221;.</p><p>Nor sed.</p><p>So that left <strong>Emacs Lisp</strong>.</p><p>Sure, using Emacs as the backend to texted would have been the more capable solution.</p><p>But also more cumbersome to integrate, and definitely not something everyone wants to have installed on their machine.</p><p>Since code is cheap, I settled on implementing a subset of Emacs Lisp that is not turing-complete to guarantee termination of the edit operations.</p><p>All functions implemented by texted follow the elisp functions provided by Emacs, so that the LLM can leverage its existing knowledge.</p><p>For funsies, I threw in shell-like syntax which is a bit easier to type, so that:</p><pre><code>search-forward "func main"
replace-match "func run"</code></pre><p>is the same as writing:</p><pre><code>(search-forward "func main")
(replace-match "func run")</code></pre><p>And since the world doesn&#8217;t run on Lisp &#129394; and we're not implementing an actual programming language, instructions can also be easily serialized as JSON to integrate with other systems:</p><pre><code>["search-forward", "func main"]
["replace-match", "func run"]</code></pre><p>Guess which format the LLM ended up preferring?</p><p>Hint: it&#8217;s not S-expressions.</p><h2>The spec</h2><p>With these ideas in mind, I wrote a <a href="https://gist.github.com/dhamidi/0b9f9b8728a0a2fd8f87eb52b3284695">spec</a>.</p><p>A rough outline of what I want, why I want it how the pieces fit together.</p><p>This is were experience comes into play: I&#8217;ve implemented Lisp interpreters before, so I knew what to look for and how to paint in broad strokes:</p><blockquote><p>In fact, the regular texted script parser just uses a specialized reader:</p><ol><li><p>Leading whitespace is stripped</p></li><li><p>If the next character is <code>(</code>, read a regular S-expression list, ignoring whitespace between elements.</p></li><li><p>Otherwise build a list reading invoking the reader repeatedly until a single <code>\n</code> is encountered.</p></li></ol></blockquote><p>If you know about the Lisp reader, the new syntax is easy to describe in terms of the differences to the regular reader.</p><p>Otherwise&#8230;its more difficult.</p><h2>Driving Claude mad</h2><p>With the spec in hand, it was mostly smooth sailing &#8211; in projects like this I&#8217;m still trying to see how far I can push my process to have LLMs write all of the code.</p><p>Here are the parts that needed manual intervention still:</p><ul><li><p>designing and adjusting expectations in the made-up XML integration tests,</p></li><li><p>defining desired behavior in the CLI spec,</p></li><li><p>helping it with inconsistent method naming in the Go MCP library I&#8217;m using</p></li><li><p>designing the code for the pseudo-Lisp implementation</p></li></ul><h2>Let&#8217;s talk about quality</h2><p>My definition of quality is this:</p><blockquote><p>Does it meet expectations?</p></blockquote><p>&#8220;it&#8221; referring to texted here, and &#8220;expectations&#8221; referring to the expectations of different roles:</p><ul><li><p>as a <strong>user </strong>of the software: does it do what it says on the tin?</p></li><li><p>as a <strong>developer </strong>of the software: can I keep evolving it without breaking things?</p></li></ul><p>The current implementation satisfies both.</p><p>Yes, the interpreter is far from optimal &#8211; more time could make it more performant, the code &#8220;cleaner&#8221;, and allow implementing more Lisp features.</p><p>None of these things are relevant to finding out whether LLMs work better with an LLM-friendly text editor.</p><h2>What&#8217;s next</h2><p>I&#8217;ll be using texted over the next days and weeks to see what needs improvement.</p><p>Claude at least seems to be pretty capable at using it, but I can already see that the set of functions provided by texted is not a good fit.</p><p>To get the current selection, you need to do something like this:</p><pre><code>(buffer-substring (region-beginning) (region-end))</code></pre><p>This would be less error-prone and shorter:</p><pre><code>(region-text)</code></pre><p>There are more such inconsistencies and improvements, and only extended use will uncover them.</p><p></p>]]></content:encoded></item><item><title><![CDATA[A million beginner projects]]></title><description><![CDATA[...how to leverage vibe-coding for your own learning]]></description><link>https://blog.cultivated.engineer/p/a-million-beginner-projects</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/a-million-beginner-projects</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Tue, 03 Jun 2025 06:01:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!m1UE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m1UE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m1UE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 424w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 848w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 1272w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m1UE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png" width="661" height="402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:402,&quot;width&quot;:661,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Happy Birthday SELFHTML - GNU/Linux.ch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Happy Birthday SELFHTML - GNU/Linux.ch" title="Happy Birthday SELFHTML - GNU/Linux.ch" srcset="https://substackcdn.com/image/fetch/$s_!m1UE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 424w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 848w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.png 1272w, https://substackcdn.com/image/fetch/$s_!m1UE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a236242-4d46-4d02-814c-f5a93b998ed3_661x402.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">This was my bible for learning HTML, JS, and CSS back when the internet and I were both young.</figcaption></figure></div><p>LinkedIn is full of posts complaining about vibe-coding creating unmaintainable piles of tech debt.</p><p>Twitter frequently features tech failures of non-technical people building products.</p><p>The dominant opinion in the public discource around Gen-AI assisted coding is that it&#8217;s a shiny toy, creating more problems than it solves, especially dangerous in the hands of untrained individuals.</p><p>Let me ask you this: how did <em>your </em>first programming projects look like? How many people saw them and commented on them?</p><p>Most professionally established engineers got established professionally in an era where one does not:</p><ul><li><p>post all their beginner failures online,</p></li><li><p>failed beginner projects look like anything a stranger on the internet could understand.</p></li></ul><p>What we&#8217;re seeing now is <em>future junior developers, getting their feet wet in the world of programming</em>.</p><p>What they are receiving from their potential mentors, established engineers: disdain and ridicule, instead of encouragement.</p><p>Every non-techie I&#8217;ve talked to or worked with who had tried building something with Loveable or Cursor quickly ran into the limitations of their own knowledge.</p><p>They stumble upon this choice: </p><blockquote><p>Should I go deeper?</p></blockquote><div class="pullquote"><p>I can roll up my sleeves and ask ChatGPT about &#8220;JSON&#8221; and &#8220;Markdown&#8221;, and learn more and push the project further</p></div><p>Most people don&#8217;t.</p><p>A few will expand their knowledge &#8211; ask more questions, get more answers, produce interesting results on the way.</p><p>We&#8217;ll get more junior developers joining the workforce <em>through vibecoding</em>.</p><p>It&#8217;s just that beginner projects a whole lot more interesting to look at now, than they used to be.</p><p>I mean, how exciting is generating a sales dashboard from a prompt, compared to writing &#8220;hello, world&#8221; and building up from there?</p><h1>Not all experience is created equal</h1><p>For established engineers, the biggest opportunity I see here is getting <em>broad experience, with different kinds of systems</em>.</p><p>Have you done all of these?</p><ul><li><p>Built a local-first web application,</p></li><li><p>Built a realtime collaboration system (e.g. multiplayer document editing),</p></li><li><p>Built an event-sourced application,</p></li><li><p>Built a highly-concurrent all-state-in-memory application,</p></li><li><p>Built a framework for others to use,</p></li><li><p>Built a library for others to use (and published it),</p></li><li><p>Built a system with a REPL to manipulate the system while it&#8217;s running,</p></li><li><p>Built a system using only AWS basic building blocks, reducing custom code to a minimum,</p></li><li><p>Built a cross-platform desktop app,</p></li><li><p>Built a system with 100% I/O-free unit tests,</p></li><li><p>Built a custom networking protocol, complete with a client and server implementation,</p></li><li><p>Built an application around geospatial information,</p></li><li><p>&#8230;and the list goes on and on.</p></li></ul><p>As a Senior Engineer today, you might have still only done 1-2 of the items on this list.</p><p>You're still a Senior Engineer at $WORK.</p><p>But your experience definitely isn&#8217;t &#8220;senior&#8221; in all areas.</p><p>To collect your XP required finding and joining the right companies and projects to get relevant first-hand experience.</p><p>Now you can create smaller versions of all of the items listed above to get a feel for what is hard and what is easy in that context.</p><p>What&#8217;s the texture of the problems you encounter there?</p><p>It&#8217;s close to free now, because AI-assisted coding can get you to the starting point, where you can finally experiment appropriately to your experience level much faster.</p><p>Even if you start with an established project (e.g. adding a custom command to Redis), AI-assisted coding will help you with onboarding while Antirez is busy implementing vector storage.</p><p>Don&#8217;t hestitate to add your own vibe-coded projects to the pile of dumpster fires &#8211; as long as you are honest about your project&#8217;s purpose, you can learn <em>so much</em> now.</p>]]></content:encoded></item><item><title><![CDATA[⏩ joining Sourcegraph to work on Amp]]></title><description><![CDATA[Everything is changing]]></description><link>https://blog.cultivated.engineer/p/joining-sourcegraph-to-work-on-amp</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/joining-sourcegraph-to-work-on-amp</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Mon, 02 Jun 2025 09:21:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EP7p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EP7p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EP7p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EP7p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg" width="316" height="421.415625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1707,&quot;width&quot;:1280,&quot;resizeWidth&quot;:316,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alternative text description for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alternative text description for this image" title="No alternative text description for this image" srcset="https://substackcdn.com/image/fetch/$s_!EP7p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 424w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 848w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!EP7p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065e7d59-6b04-408c-b429-c39c9448ae45_1280x1707.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">From a side-event at <a href="https://latitude59.ee/">Latitude59</a> - announcing my move.</figcaption></figure></div><h1>Moving forward</h1><p>Today marks my first day out of <a href="https://modash.io">Modash.io</a> and the first of 7 days before starting at <a href="https://sourcegraph.com/">Sourcegraph</a> to work on <a href="https://ampcode.com">Amp</a> - an agentic coder that does not try to protect your wallet, in exchange for better results.</p><p>This means that staying abreast of the tectonic plate movements with their associated volcanic erruptions in software development is now my bread and butter.</p><p>Things I learn, I&#8217;ll share here.</p><h1>Seven Days of Building</h1><p>In this 7 day period between two engagements, I have many questions to answer:</p><h2>Will deterministic building blocks improve LLM performance?</h2><p>How will an LLM perform, if <em>all </em>actions you want to take in the development of a project are accessible through a CLI / MCP server?</p><p>Put the precise bits into deterministic machines, leave the fuzzy bits to the LLM.</p><p>I really need to find out and the only way to do so it to build something.</p><p>A few more days and I should have something presentable (code is already public, but it&#8217;s very much WIP).</p><h2>What is key to managing multiple agents at the same time?</h2><p>The agentic software development endgame seems to be managing multiple agents with a lot of input at the beginning of the process, and more at the end, with the agent quietly chugging away and working its way through the problem.</p><p>Right now it still requires oversight, and I&#8217;m trying to figure out how to best manage that process for the time being.</p><p>Yesterday was a success by leveraging extensive plans, git worktrees and tmux to run two instances of the Amp CLI.</p><p>I could work through two big features in parallel, generating around 5000 lines of code in the process.</p><p>Half of that was essentially what I would have written, the other half needed more babysitting because I wasn&#8217;t clear enough in my specification.</p><h2>What constitutes a good test?</h2><p>My notion of test quality is changing &#8211; I&#8217;m relying more and more on end-to-end test, exercising the application fully (which is easy for my toy projects) so that the LLM gets the necessary context to figure out what&#8217;s wrong.</p><p>The issue with e2e tests is finding out what&#8217;s wrong exactly, when things go wrong.</p><p>But with LLMs in your toolbox, this is less of an issue now - they excel at reading logs and analyzing root causes of failures.</p><p>So I find myself building more and more little helper programs that poke, prod and exercise a system in an LLM friendly manner.</p><p>I call these things &#8220;inspectors&#8221; because of what they do &#8211; the notable difference to e2e tests is that you can point them <em>at any instance of the system</em>.</p><p>They are not built using test frameworks, because they are not tests, they are <em>tools</em>.</p><p>Mind you, this is in addition to regular unit and integration tests.</p><h1>Observations so far</h1><p>When I get a new computer, I like to set up things from scratch to only select things as part of my workflow that make sense.</p><p>Here&#8217;s what I&#8217;ve learned in the process:</p><ul><li><p>I write lots of tiny custom utilities now, in Go, because it has become so easy.  These tools cater to <em>my </em>preferences, like this <a href="https://github.com/dhamidi/tmux-urlview/">URL opener for tmux</a>.</p></li><li><p>I learn more &#8211; the threshold to action has lowered so much, that I do more as a result.  For example, I&#8217;d like better Finder integration for Markdown and JSON files &#8211; they should automatically open in a new terminal window with a dedicated program (e.g. nvim).  Turns out that&#8217;s easy to do, but only thanks to LLMs I bothered to find out exactly <em>how </em>to do it.</p></li><li><p>My notion of quality is changing more towards evaluating constructs as black boxes &#8211; I care more about how the cake tastes than about how it&#8217;s made.</p></li></ul><p>That&#8217;s it for today, more content is on the way!</p>]]></content:encoded></item><item><title><![CDATA[Grow your own agent]]></title><description><![CDATA[...build on what Thorsten encouraged you to do]]></description><link>https://blog.cultivated.engineer/p/grow-your-own-agent</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/grow-your-own-agent</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Tue, 13 May 2025 17:40:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nCpA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2475d6e-519e-4556-8ef0-8a88454e7361_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you haven&#8217;t done so already, take 60 minutes to type out <a href="https://ampcode.com/how-to-build-an-agent">Thorsten&#8217;s widly popular guide on building a minimal agent</a>.</p><p>It really doesn&#8217;t take long.</p><p>This post is not about agents being essentially simple while loops.</p><p>No, this is about what happens <em>after.</em></p><p>Because with the simple toolbox given to you by Thorsten you now have a <em>self-modifying agent.</em></p><p>Let me repeat that: with three tools, the agent can modify itself.</p><p>You can <em>grow </em>the agent into one you like to use.</p><p>Unlike Cursor, it can be <em>yours</em>.</p><p>You can experiment freely.</p><p>And most importantly, you understand, on a deep level, what&#8217;s actually going on under the hood.</p><p>My goal with this project was to see how far I can push developing the agent developing itself into a more an more capable version of itself.</p><p>But first things first: if you want to play or read along, the code is here:</p><p><a href="https://github.com/dhamidi/smolcode">https://github.com/dhamidi/smolcode</a></p><p>Mind you, this is a messy construction zone, not a pristine temple of software engineering best practices.</p><div><hr></div><p>&#9888;&#65039; <strong>Warning: </strong>the following is raw, messy, unedited and unscripted.</p><div><hr></div><p>Watch smolcode cleaning up messy workspace files and highlight a bug with my implementation of caching prompts:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;bb7b3a63-89ce-49f3-bef1-8dda2fec201a&quot;,&quot;duration&quot;:null}"></div><p>The point of this is not to impress you, but to get you to build your own.</p><p>Building your own allows you play around with all kinds of things, just look at all these tools:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!soav!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!soav!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 424w, https://substackcdn.com/image/fetch/$s_!soav!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 848w, https://substackcdn.com/image/fetch/$s_!soav!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 1272w, https://substackcdn.com/image/fetch/$s_!soav!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!soav!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png" width="1456" height="184" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:184,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136533,&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://blog.cultivated.engineer/i/163138755?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.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_!soav!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 424w, https://substackcdn.com/image/fetch/$s_!soav!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 848w, https://substackcdn.com/image/fetch/$s_!soav!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 1272w, https://substackcdn.com/image/fetch/$s_!soav!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5496108-7cf9-4013-85d2-a2d5ae69ee4b_2998x378.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>On top of the original read_file, list_files, and edit_file we have:</p><ul><li><p>create_checkpoint for writing detailed commit messages based on changed files as reported by list_changes</p></li><li><p>create_memory and recall_memory to remember things about the project (e.g. the build command)</p></li><li><p>manage_plan for making plans, reordering tasks, etc without needing to mess around with markdown files</p></li><li><p>and finally write_file because sometimes Gemini is failing hard at replacing strings in files.</p></li></ul><p>That&#8217;s more than enough to get a working agent.</p><p>Since demos are few and far between, let&#8217;s debug the caching issue &#8211; notice how Gemini repeated that it &#8220;already removed files&#8221; and &#8220;already committed&#8221; changes.</p><p>That&#8217;s because I&#8217;m using prompt caching, and most likely I&#8217;m using it wrong.</p><p>Let&#8217;s run a simple conversation with tracing enabled to get more intel:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;98fab559-fcff-4c5b-86d1-17e3e19d3028&quot;,&quot;duration&quot;:null}"></div><p>Now I could analyze this myself to answer the question whether there&#8217;s an issue with cached requests sending duplicate prompts, but where'd be the fun in that?</p><p>After copying the contents of the interaction to `transcript.txt`, let&#8217;s ask smolcode to reflect on its nature:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;49c835c5-1c43-4e7f-80a7-a179314c5c19&quot;,&quot;duration&quot;:null}"></div><p>Here&#8217;s the outcome of the analysis:</p><pre><code>Therefore, I do not see evidence that the *same user input* is being sent and processed twice *within the same turn*. The transcript shows that the full conversation history, including previous user prompts, is sent with each new request, but the latest user prompt is unique in that request.</code></pre><p>This is good enough for now to continue experimenting without worrying too much about caching.</p><h2>How to work with an unleashed model?</h2><p>Cursor is doing all kinds of things behind the scenes to reduce/distill the amount of context that is sent to the model.</p><p>Smolcode embraces the model and is eager to burn through tokens.</p><p>How does the workflow change?</p><p>In an ideal world, an interaction with smolcode looks like this:</p><pre><code>You: Study instruction.md
Gemini: Here's my plan ...
Tool: read_file
Tool: read_file
Tool: edit_file
Tool: edit_file
Tool: create_checkpoint
Gemini: I'm done
You: </code></pre><p>What&#8217;s interesting here is that after giving it the initial prompt (here in instruction.md), it just goes off on its own until it thinks its done.</p><p>Meaning we get to do other things in the meantime, like managing another instance of the agent.</p><h2>Let&#8217;s build a feature</h2><p>Now let&#8217;s ask smolcode to build a feature that we need: persistent conversation histories.</p><p>We&#8217;ll start by drafting a specification together with smolcode and then in a separate conversation, we&#8217;ll turn it into an executable plan and execute the plan.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;200bffb2-2ebd-4bc0-88fd-7908cdaa67e7&quot;,&quot;duration&quot;:null}"></div><p>Since the session is rather long, here are some highlights:</p><ul><li><p>the detailed instructions paid off and the model actually produced a workable plan for persisting conversation histories</p></li><li><p>while it was busy implementing the plan, I got bored and thought about the next problem: how are we actually going to use the history?</p></li><li><p>to that end, I started a new session in another tmux pane to make a new plan for integrating the history with the agent</p></li><li><p>intermittently we ran into rate-limits / opaque internal errors that we just had to sit out with retries,</p></li><li><p>Gemini messed up with editing the history_test.go file and goimports couldn&#8217;t format it.  It got itself out of that predicament.</p></li></ul><h2>&#129346; Cheers to uncertainty</h2><p>At this point I have no clue what we just built.</p><p>Or how whether it works.</p><p>I <em>could </em>review the code now, but since I expect it to change <em>yet again</em>, I&#8217;ll delay my review.</p><p>Instead, let&#8217;s throw more tokens at it and ask the agent to figure this out.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f8fe2516-593b-4269-97c5-d96f4e135c8c&quot;,&quot;duration&quot;:null}"></div><p>The outcome: we have the history package but are not using it in the agent</p><p>The reaction: ask the agent to plan the integration.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OPhN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OPhN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 424w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 848w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 1272w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OPhN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png" width="1456" height="162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:162,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92886,&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://blog.cultivated.engineer/i/163138755?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.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_!OPhN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 424w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 848w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 1272w, https://substackcdn.com/image/fetch/$s_!OPhN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F893d5cac-7b07-4ea0-a225-33dfb66afdf9_3006x334.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>But first it needs to fix the tests:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;8fb2e404-dd05-4fd6-a97f-cbbc64869141&quot;,&quot;duration&quot;:null}"></div><p>Now that the tests are working, we can continue with the integration.</p><p>Except that the tests aren&#8217;t working <em>the way we think</em>.</p><p>Running the tests actually overwrites the database file used by smolcode for storing history, because the initially envisoned API had no notion of multiple database files.</p><p>This is fixed off-screen in the same manner as we&#8217;ve done so far.</p><h2>Time for a review </h2><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;0bf7e8b0-a682-4472-9782-194bbc228de8&quot;,&quot;duration&quot;:null}"></div><p>It worked &#127881;</p><p>The code we ended up with is pretty straightforward, thanks to a thoughtful first prompt.</p><p>A few comments were superficial, but we could let the agent take care of that.</p><h1>Where next</h1><p>If you have made it this far, then here are few ideas of where this agent can go:</p><ul><li><p>evolve `write_file` into a `generate_code` tool, using a different model,</p></li><li><p>give the model access to Perplexity&#8217;s web search API to get up to date information about frameworks and libraries,</p></li><li><p>create a `tmux` tool that allows the model to manage multiple interactive programs</p></li></ul><p>All of these tools are just example of interesting questions to ask.</p><p>The answers need to be found through experimentation.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Where are all the clients?]]></title><description><![CDATA[Specialized UIs will be just that &#8211; tools for special occasions]]></description><link>https://blog.cultivated.engineer/p/where-are-all-the-clients</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/where-are-all-the-clients</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Thu, 08 May 2025 14:45:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Sdzg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sdzg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sdzg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sdzg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png" width="304" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:304,&quot;bytes&quot;:140251,&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://blog.cultivated.engineer/i/161901425?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Sdzg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Sdzg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd14aad9-3561-40b9-91a4-3c552885b196_1024x1024.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">We have hands, and we have clients &#8211; when will they be connected?</figcaption></figure></div><h1>Why would you ever leave Slack?</h1><p>Take a moment to think about it.</p><p>You are on Slack most of the day, communicating with your teammates and the rest of your company.</p><p>You gather information.</p><p>You synthesize it.</p><p>And then you convert it into concrete actions.</p><p>Over and over again.</p><p>There are only two reasons to leave Slack:</p><ul><li><p>the information you are looking for is not reachable through Slack,</p></li><li><p>the action you want to take is not exposed in Slack.</p></li></ul><p>Critically, taking an action outside of Slack creates follow-up work: you now need to inform your team about the action you have taken to prevent double-work and miscommunication.</p><p>For long-lived complicated actions, like writing code or longer documents, Slack is of course not a suitable tool.</p><p>But the average workday is full of smaller actions &#8211; querying disparate sources of data, nudging people, following up on tasks.</p><p>Why can&#8217;t these actions be taken in Slack?</p><p>Why can&#8217;t you just ask in your team&#8217;s channel whether task XYZ is done, and <em>someone </em>will go to Jira, read through the task&#8217;s history, find mentions of the task in Slack and emails and gives <em>your entire team </em>a summary?</p><p>Why can&#8217;t you ask &#8220;<em>which pull requests have been in review for too long?&#8221; </em>&#8211; and follow up with &#8220;ping the reviewers please&#8221;.</p><p>Why can&#8217;t you schedule a calendar meeting directly in Slack, at a suitable time slot referring to your team mate by their first name?</p><h1>The future is here already&#8230;</h1><p>All of these things are <em>technically possible</em> already.</p><p>In fact, they have been possible for over a year already.</p><p><a href="https://help.openai.com/en/articles/8554397-creating-a-gpt">Giving ChatGPT hands doesn&#8217;t even require writing code</a>, yet nobody uses this functionality, and only few people know about it.</p><p>Only in the area of writing code, we&#8217;re seeing a strong move to conversational interfaces and agentic workflows, interacting closely with a coding agent, and giving the agent more and more hands to do more and more work for us.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xU0a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xU0a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xU0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94185,&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://blog.cultivated.engineer/i/161901425?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xU0a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xU0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a763da6-ed7d-42aa-bb04-02fc75277b8f_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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 selection of the tools we&#8217;re interfacing with daily at my work</figcaption></figure></div><p>Connecting everything to Slack means we can re-use the multi-modal conversational UI built and polished over the years by Slack.</p><p>Everyone has access to Slack.</p><p>It&#8217;s literally just about plugging in everything.</p><h1>&#8230;but not evenly distributed</h1><p>This literal plugging is unfortunately only accessible to highly technical folks.</p><p>However, just last week <a href="https://www.anthropic.com/news/integrations">Anthropic announced that MCP servers can now be plugged directly in Claude on the web</a>.</p><p>A great step forward.</p><p>However this is still limited &#8211; most people don&#8217;t spend their days in Claude.</p><p>I doubt that people ever will, because &#8220;Let me use Claude&#8221; is a specialized usecase currently as opposed to &#8220;Let me exist&#8221; which is what a company&#8217;s chat tool boils down to.</p><h1>Redistributing</h1><p>I expect that these integrations <em>will </em>get built over the next two to three years.</p><p>And that exposing your services through MCP or whatever will be the dominant protocol then will be <em>expected</em> of your product.</p><p>The crucial questions to answer here are:</p><ul><li><p>how do you change your UI/UX if you now only expect power users to use a specialized UI for your product?</p></li><li><p>how do you design UX around performing actions on the user&#8217;s behalf in another platform?</p></li><li><p>how do you manage context in environments like Slack?</p></li></ul><p>Now if you think about it a bit more, you will find that you are already using many different conversational interfaces.</p><p>Here are the ones I can come up with:</p><ul><li><p>Your main messaging app (e.g. WhatsApp or Telegram),</p></li><li><p>Your secondary messaging app because not all of your friends are on the first</p></li><li><p>Your work email inbox</p></li><li><p>Your private email inbox</p></li><li><p>Slack or Teams for work communications</p></li><li><p>If you work in a customer facing role: your CRM.</p></li></ul><p>All of these interfaces already exist.</p><p>And they all are waiting for a capable pair of hands.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Agentic coding with examples]]></title><description><![CDATA[Relinquish control for a bigger reward]]></description><link>https://blog.cultivated.engineer/p/agentic-coding-with-examples</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/agentic-coding-with-examples</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Sat, 19 Apr 2025 13:13:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LmYg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LmYg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LmYg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 424w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 848w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 1272w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LmYg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png" width="1456" height="799" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122748,&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://blog.cultivated.engineer/i/161669323?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.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_!LmYg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 424w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 848w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.png 1272w, https://substackcdn.com/image/fetch/$s_!LmYg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01c41b97-04ef-47df-9f7b-c152d354022a_1524x836.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">50 files changed, 3145 lines of code added in 20 minutes.</figcaption></figure></div><h2>From scalpels to self-driving cars</h2><p>Last time we looked into <a href="https://aider.chat">aider</a>, a precise and powerful tool for writing code.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6f716afd-f617-44c5-b001-5c07dddfab07&quot;,&quot;caption&quot;:&quot;You can stop reading now and check out aider.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How I use aider&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:84612146,&quot;name&quot;:&quot;Dario Hamidi&quot;,&quot;bio&quot;:&quot;Finding adventure in unexpected places&quot;,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/20b37f45-32c1-45d0-a2cb-a243805fca35_1824x2736.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-04-09T06:01:56.921Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.cultivated.engineer/p/how-i-use-aider&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:160877521,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;The Cultivated Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2475d6e-519e-4556-8ef0-8a88454e7361_500x500.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Unlike Cursor, Cline, and others, Aider has a tight, pre-scripted control loop, which includes you &#8211; the human operator.</p><p>In a way, Aider is like a scalpel &#8211; a sharp tool, excellent for precise cuts.</p><p>If you know <strong>exactly</strong> what you need to do, this magic scalpel can do it much faster than you could do it yourself.</p><p>Contrast this with agentic coding environments like Cursor.</p><p>They don&#8217;t have a pre-scripted top-level loop.</p><p>Instead, the model decides on the fly, what it should do next.</p><p>You still need a rough idea of where you want to go.</p><p>But the &#8220;how&#8221; is taken care of by the agent.</p><p>Like a self-driving a car &#8211; you give it the destination and then supervise the process of actually reaching the destination.</p><h2>Drawing a map</h2><p>Using agentic coding tools daily now, here is what works best in my experience.</p><h3>Define the &#8220;what&#8221;</h3><p>First, you define the &#8220;what&#8221; by creating a specification of the desired outcome.</p><p>You don&#8217;t need to write this yourself.</p><p>Use an agent to iterate on a Markdown file until the outcome is crystal clear.</p><p>In this phase, you want to:</p><ul><li><p>seed conversations with all relevant context,</p></li><li><p>get the agent to ask <strong>you </strong>questions about the design,</p></li><li><p>and end up with a very detailed <strong>spec</strong>.</p></li></ul><h3>Example: a large scale refactoring</h3><p>Here is an example from <strong><a href="https://github.com/dhamidi/petrock">Petrock</a></strong>, a web framework I&#8217;m writing at the moment.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gist.github.com/dhamidi/8fb2fd43f54a77f9bfa6df3782dbff9e&quot;,&quot;text&quot;:&quot;View spec&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gist.github.com/dhamidi/8fb2fd43f54a77f9bfa6df3782dbff9e"><span>View spec</span></a></p><h3>Define the how</h3><p>Once you are done with the spec, it&#8217;s time to turn it into a series of concrete steps.</p><p>Again, this will take multiple iterations, so tell your agent to work with you on the plan Markdown file.</p><p>We&#8217;re still not writing code.</p><p>You should seed the context with the specification from earlier and relevant bits about code that the specification touches upon.</p><p>Use your agent to help you here.</p><h3>What makes a plan good</h3><p>A good plan has:</p><ul><li><p>clear identifiers for tasks,</p></li><li><p>a definition of done for each task,</p></li><li><p>references to relevant parts of the code for each task,</p></li><li><p>and examples of patterns you want to see respected.</p></li></ul><p>If you include all of this information, the agent will be able to work through the plan step by step with little oversight.</p><p>Here&#8217;s the plan for implementing the specification above:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gist.github.com/dhamidi/0617fbf7bc224be18e5a55fbfa1dc1bd&quot;,&quot;text&quot;:&quot;View plan&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gist.github.com/dhamidi/0617fbf7bc224be18e5a55fbfa1dc1bd"><span>View plan</span></a></p><h2>Taking off</h2><p>With everything in place, you can finally take off.</p><p>Here&#8217;s the prompt I use to start the agent:</p><pre><code>Implement the plan, task by task:

1. pick the next unfinished task
2. implement it
3. mark the task as DONE in the plan file
4. commit the changes, including the plan file.
5. Ask the user whether you should continue

Only implement one task at a time.</code></pre><p>This is essentially the same loop that Aider is using, except that we don&#8217;t have to hardcode it, but just need to tell the agent.</p><p>At this point it&#8217;s almost becoming like a video game:</p><ol><li><p>the agent implements a change,</p></li><li><p>you check quickly whether it&#8217;s deviating from the plan (usually it&#8217;s not)</p></li><li><p>you say &#8220;continue&#8221;</p></li></ol><p>And then you keep turning the crank until you reach the end of the plan.</p><h2>Orienting yourself</h2><p>Naturally, the first question is &#8220;but what about reviewing the code?&#8221;.</p><p>Yes, reviewing the code is important.</p><p>But more important are the general direction and approach you are taking when making a large-scale change.</p><p>By now you will have reached a destination:</p><ul><li><p>the plan is executed,</p></li><li><p>you have a documented history of all changes in git</p></li></ul><p>This is a good time to reorient yourself: is this the place you want to be in?</p><p>If it&#8217;s not, you have two choices:</p><ul><li><p>make small adjustments (your almost where you need to be),</p></li><li><p>or go through the spec-plan-execute process again for larger changes.</p></li></ul><p>In any case, a little bit of planning allows you to go much faster.</p><h2>Concrete examples</h2><p>You can find the entire conversation for implementing the refactoring <a href="https://ampcode.com/threads/T-c1096f5f-4340-42be-8f74-17b5351b4e61">here</a>.</p><p>After the agent was done, I had a lot of compilation errors left, which got fixed <a href="https://ampcode.com/threads/T-d49284e6-ddd1-4953-a6da-e26d3dddfea8">here</a>.</p><p>The <a href="https://ampcode.com/">agent</a> was working through this refactoring in 45 minutes while I was writing this blog post.</p><p></p>]]></content:encoded></item><item><title><![CDATA[How I use aider]]></title><description><![CDATA[No, you don't need to write your own agent]]></description><link>https://blog.cultivated.engineer/p/how-i-use-aider</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/how-i-use-aider</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Wed, 09 Apr 2025 06:01:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MZMZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MZMZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MZMZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 424w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 848w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 1272w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MZMZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png" width="1456" height="2377" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2377,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:545160,&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://blog.cultivated.engineer/i/160877521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.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_!MZMZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 424w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 848w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.png 1272w, https://substackcdn.com/image/fetch/$s_!MZMZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6435f5e-69c2-41a8-b262-9c79e87dab32_2258x3686.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"></figcaption></figure></div><div class="poll-embed" data-attrs="{&quot;id&quot;:300247}" data-component-name="PollToDOM"></div><p>You can stop reading now and check out <a href="https://aider.chat/">aider</a>.</p><p>No really, go check their website or, even better, play around with it yourself.</p><h1>What is aider?</h1><p>At its core, <a href="https://aider.chat/">aider</a> runs in your terminal, reads prompts from you, and changes files in return.</p><p>The screenshot at the beginning of the article shows the entire 78 lines of Python code necessary for this.</p><p>Well, that&#8217;s how it started.</p><p>Over the last ~2 years, it got a whole range of features:</p><ul><li><p>linting,</p></li><li><p>testing,</p></li><li><p>voice input,</p></li><li><p>token analysis</p></li></ul><p>and much more.</p><h1>How is it different from Cursor?</h1><p>What&#8217;s notably absent compared to Cursor:</p><ul><li><p>no tool calls,</p></li><li><p>no MCP support,</p></li><li><p>no behind-the-scenes &#8220;we manage the context for you&#8221; magic</p></li><li><p>no tool use prompts</p></li></ul><p>You see, Aider does something special: it essentially encodes the higher-level feedback loop that you go through when developing software:</p><ol><li><p>write code,</p></li><li><p>write tests (or write tests first if that&#8217;s your cup of tea),</p></li><li><p>run linters and formatters,</p></li><li><p>run tests,</p></li><li><p>repeat until tests pass</p></li></ol><p>We only need the LLM for step 1 and 2.</p><p>Cursor is your virtual pair programming buddy.</p><p>Aider is a sharp knife in comparison.</p><h1>Why does it matter?</h1><p>A while ago, I wondered whether I needed to encode this high-level feedback loop myself by writing an agent:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;fff61e7e-ee28-44be-aa49-ac0a6e660ea5&quot;,&quot;caption&quot;:&quot;Practical experience is hard currency right now&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Questions to ask yourself&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:84612146,&quot;name&quot;:&quot;Dario Hamidi&quot;,&quot;bio&quot;:&quot;Finding adventure in unexpected places&quot;,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/20b37f45-32c1-45d0-a2cb-a243805fca35_1824x2736.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-03-12T10:02:16.256Z&quot;,&quot;cover_image&quot;:&quot;https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.cultivated.engineer/p/questions-to-ask-yourself&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:158905080,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;The Cultivated Engineer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2475d6e-519e-4556-8ef0-8a88454e7361_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Now I know that I don&#8217;t &#8211; Aider is the program I would have written.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_1cA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_1cA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 424w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 848w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 1272w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_1cA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png" width="1454" height="412" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:412,&quot;width&quot;:1454,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106217,&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://blog.cultivated.engineer/i/160877521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.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_!_1cA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 424w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 848w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.png 1272w, https://substackcdn.com/image/fetch/$s_!_1cA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9d20d85-5597-486a-9fed-2ec107c249f0_1454x412.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>This command invokes aider in a Python repository with the linter and tester preconfigured.</p><p>As a result, <em>the LLM does not have to figure out how to run the tests</em>.</p><p>When you use Cursor, the LLM needs to think to get the idea that maybe now is a good time to run the tests &#8211; aider does this automatically, which makes the process much <em>faster </em>and <em>cheaper</em>, because you save on LLM requests.</p><p>Just look at this &#8211; this prompt:<br></p><blockquote><p>&gt; Write a comprehensive test suite in test.py for a function that declines an Estonian noun when provided with the four base forms of a noun as an array: nominative singular, genitive singular, partitive singular, partitive plural.</p></blockquote><p>Yielded lines and lines of code:</p><blockquote><p>Okay, I will write a comprehensive test suite for the Estonian noun declension function in test.py. This suite will use pytest and include tests for various noun types and all 14 grammatical cases in singular and plural.</p><p>Since the function decline_noun doesn't exist yet in main.py, these tests are expected to fail until the function is implemented.</p><p>Here is the SEARCH/REPLACE block to populate test.py:</p></blockquote><p>Note last bit: <strong>Here is the SEARCH/REPLACE block</strong></p><p>Aider asks the LLM to provide diffs and then parses the response to figure out what replacements to make.  It&#8217;s super primitive compared to tool calling, but it also means you don&#8217;t need to wait around for tool calls with the associated back-and-forth communication between your client and the LLM provider.</p><p>And now the icing on the cake:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4RVj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4RVj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 424w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 848w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 1272w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4RVj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png" width="1456" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:112075,&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://blog.cultivated.engineer/i/160877521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.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_!4RVj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 424w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 848w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.png 1272w, https://substackcdn.com/image/fetch/$s_!4RVj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff432cbe9-9df6-4ecd-ac26-8c73f5bf516a_1514x658.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>You can see that it:</p><ol><li><p>automatically committed the changes,</p></li><li><p>ran the linter (&#8220;All checks passed&#8221;)</p></li><li><p>and is ready for you to run the tests</p></li></ol><p>If you hit enter, it runs the tests and asks you whether you want the output in your context window:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VL4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VL4t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 424w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 848w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 1272w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VL4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png" width="1424" height="330" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:330,&quot;width&quot;:1424,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65331,&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://blog.cultivated.engineer/i/160877521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.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_!VL4t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 424w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 848w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 1272w, https://substackcdn.com/image/fetch/$s_!VL4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e0039fe-3f32-4626-a635-0c5aec635149_1424x330.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In this case, I don&#8217;t, because I messed up the pytest integration, and pytest doesn&#8217;t pick up the newly generated test file automatically.</p><p>Fixing this was again easy:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xNDQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xNDQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 424w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 848w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 1272w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xNDQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png" width="1456" height="1133" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27652966-3610-4522-8bd6-5734954aa747_1514x1178.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1133,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177852,&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://blog.cultivated.engineer/i/160877521?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.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_!xNDQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 424w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 848w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.png 1272w, https://substackcdn.com/image/fetch/$s_!xNDQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27652966-3610-4522-8bd6-5734954aa747_1514x1178.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>Aider commits all changes automatically, as checkpoints so going back to a prior version is easy.</p><p>If you make changes outside of aider running <strong>/commit</strong> will commit them to git with a message following <a href="https://www.conventionalcommits.org/en/v1.0.0/">conventional commits</a>.</p><h1>On slowness</h1><p>After using Aider extensively for a side project, together with Gemini&#8217;s humongous context window, going back to Cursor feels so strange.</p><p>Cursor is great at cranking out code without oversight, i.e. it doesn&#8217;t &#8220;wait&#8221; for you to take a turn unless you tell it to.</p><p>Which on one hand means you're &#8220;faster&#8221; because you can twiddle your thumbs while Cursor is working hard.</p><p>With Cursor, you wait on the order of <strong>minutes</strong><em> </em>before your input is required.</p><p>Aider, on the other hand, will be busy on its own for 60 <strong>seconds</strong><em> </em>at most.</p><p>You stay engaged.</p><p>You keep evaluating and feeding it input.</p><p>So far, my impression is that I can go faster that way &#8211; I&#8217;m not waiting for the LLM to come up with obvious things.</p><h1>My workflow right now</h1><p>With LLMs I treat planning documents as code, so the first part of working on anything is &#8220;coding up a plan&#8221;.</p><p>I add all relevant design documents from docs to the context with <strong>/add docs</strong>.</p><p>Then I ask for the feature, and specifically a plan for implementing it.</p><p>Each step of the plan needs to include:</p><ul><li><p>a definition of done,</p></li><li><p>names of files/function signatures that the model would touch</p></li></ul><p>Aider writes that plan directly into `docs/plan-&lt;feature&gt;.md`</p><p>Then I take that plan, add it to the context together with the files we&#8217;ll be working on.</p><p>From that point on, my job is to turn the crank:</p><blockquote><p>Implement step 1 of the plan, and mark it as done in the plan document.</p></blockquote><p>&#9203; aider is busy working, I&#8217;m glancing over the code as it swooshes through the terminal.</p><p>It then runs the linter automatically, and depending on whether I need it or not, I ask it to run the tests with <strong>/test</strong>.</p><p>Then I keep turning the crank:</p><blockquote><p>Continue</p></blockquote><p>The process repeats until we&#8217;re done with executing the plan.</p><p>For larger features, I check out a separate branch because Aider commits are very granular.</p>]]></content:encoded></item><item><title><![CDATA[Cursor without rules]]></title><description><![CDATA[Yes, you can use Cursor without rules]]></description><link>https://blog.cultivated.engineer/p/cursor-without-rules</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/cursor-without-rules</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Thu, 20 Mar 2025 13:24:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PgJq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PgJq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PgJq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 424w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 848w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PgJq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png" width="1456" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217574,&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://blog.cultivated.engineer/i/159476924?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.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_!PgJq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 424w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 848w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!PgJq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa682a03c-6aa8-4a2d-966e-1faa7f8db9e5_1636x1204.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><h1>Is Cursor useful without rules?</h1><p><a href="https://blog.cultivated.engineer/i/158905080/are-simple-prose-rules-enough">One of the questions</a> to which I wanted to find an answer was whether simple prose rules are enough for getting good results out of Cursor.</p><p>The promise of simple prose rules is that:</p><ul><li><p>they are <strong>portable</strong> and not tied to a specific tool,</p></li><li><p>they are written in an <strong>understandable format</strong> and <strong>can be edited by hand</strong></p></li></ul><p>To answer this question I set out ot write a small project from scratch &#8211; or rather, have Cursor write it for me.</p><h1>The rules of the game</h1><p>I really only set two rules for myself:</p><ol><li><p><strong>No artisanal code &#8211; </strong>I&#8217;m not allowed to commit any code written by hand &#8211; all committed code needs to be written by the agent</p></li><li><p><strong>No Cursor rules &#8211; </strong>Recurring mistakes need to be encoded in rules written in docs/tech.md</p></li></ol><p>This way I hoped the experiment would give me a better understanding of the limits of LLMs and coding agents.</p><h1>The result</h1><p>First of all &#8211; I got working software!</p><p>It meets the criteria set out in the initial specification.</p><p>I&#8217;ve delayed writing a project like this multiple times, because &#8220;having to figure out OAuth with Gmail&#8221; was enough of a hurdle for me to never overcome.</p><p><strong>Cursor mostly stuck to my rules, despite them just being in a Markdown file.</strong></p><p>The one it broke consistently: &#8220;no mocking&#8221; &#8211; it ended up using Python&#8217;s MagicMock in a bunch of situations to stub out interactions with Gmail.</p><h1>The process</h1><p>Writing the software felt like turning a crank:</p><ol><li><p>Open plan, copy LLM-generated LLM prompt,</p></li><li><p>Set up context for Cursor in Agent mode,</p></li><li><p>Submit</p></li><li><p>Do something else</p></li><li><p>Check in later &#8211; the agent reached a stable state, ask it to commit the changes</p></li></ol><p>Occasionally I&#8217;d run the tool to verify everything works in a non-test environment, run into issues, and have Cursor fix them.</p><h2>Tweaks discovered along the way</h2><h3>Bake rules into the prompt</h3><p>Compare these two prompts:</p><blockquote><p>Review the Gmail CLI codebase for quality and consistency. Run 'uv run pyright' for type checking, 'uv run ruff check --fix' for linting, and 'uv run ruff format' for code formatting. Check that: 1) Type hints are used everywhere with no Any types, 2) Error handling uses custom exception hierarchies defined in errors.py, 3) Code follows dependency injection over global state, 4) All business logic has unit tests, 5) All I/O operations use async/await. Fix any issues found to meet these technical guidelines.</p></blockquote><p>And:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wqEK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wqEK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 424w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 848w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wqEK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png" width="1456" height="958" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:958,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:379895,&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://blog.cultivated.engineer/i/159476924?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.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_!wqEK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 424w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 848w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!wqEK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4987ad17-0062-4b74-b950-08a041496ca4_2122x1396.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 first one is generic and short, the second one very detailed.</p><p>When I asked the LLM for a specific plan, I also asked it to include prompts like the first one.</p><p>Usually I&#8217;d go ahead and just paste them directly, and it worked out well enough.</p><p>I&#8217;ve noticed that these prompts actually reflect the guidelines set out in the tech document nicely.</p><p>Towards the end, I wanted to get more out of this, so I just selected a prompt in the plan document, and asked Cursor to make it more detailed based on the development guidelines.</p><p>The longer prompt worked better, because it was more specific.</p><p>In hindsight I should have done this for every prompt.</p><h3>Save your prompts</h3><p>I would find myself asking essentially the same question multiple times, and after doing this a couple of times, I started to commit prompts to the repository.</p><p>These prompts correspond to tasks I need to perform regularly:</p><ul><li><p>fix newly introduced test failures,</p></li><li><p>make sure user-facing documentation actually reflects the code,</p></li><li><p>test adherence to coding standards.</p></li></ul><p>Keeping these prompts close by in the repository made it easy to perform these tasks more frequently and especially when fixing test failures, the model would sometimes prefer <em>mypy</em> over <em>pyright </em>for type-checking.</p><p>Since the &#8220;fix the tests&#8221; prompt explicitly mentions which tools to use, the LLM doesn&#8217;t pick the wrong tool anymore.</p><h1>Next steps</h1><p>This was a small project, using essentially <em>too few </em>rules.</p><p>Going forward, I want to introduce more rules (~50 to 100 would be good) and see how it affects performance of the LLM &#8211; will it make fewer mistakes?</p><p>Until then, have fun reading the code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/dhamidi/read-my-mail/blob/main/README.md&quot;,&quot;text&quot;:&quot;read-my-mail on Github&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/dhamidi/read-my-mail/blob/main/README.md"><span>read-my-mail on Github</span></a></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Maybe the problem is you]]></title><description><![CDATA[if you are not getting enough value out of LLMs for coding.]]></description><link>https://blog.cultivated.engineer/p/maybe-the-problem-is-you</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/maybe-the-problem-is-you</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Fri, 14 Mar 2025 07:55:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Bf2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Changing your identity &#8211; how you look at yourself in the world &#8211; is hard.</p><p>Unfortunately, this is very often the key to making lasting improvements in your life.</p><p>If you have spent any time around experienced software developers, you&#8217;ll hear a lot of comments like this about using LLMs for coding:</p><blockquote><p>They are useless &#8211; they make up functions left and right.</p><p>The code is terrible &#8211; buggy, slow, and hard to read.</p><p>It can&#8217;t work in a <em>real </em>codebase &#8211; it gets confused all the time.</p></blockquote><p>I held the same opinions, actually.</p><p>But seeing more and more people out-shipping me (you know, with actually completed projects &#8211; even if they are small), got me worried.</p><p>And worry grew into despair.</p><p>Until I stumbled over <a href="https://ghuntley.com/stdlib/">Geoffrey Huntley&#8217;s article about leveraging Cursor.</a></p><p>You can teach the machine to get better?</p><p>The <em>rate </em>of improvement will increase?</p><p>Wow, that actually sounds exciting!</p><p>This rekindled the excitement that got me into programming in the first place.</p><p>Fast feedback loops, a steady stream of achievements delivered to your brain.</p><p>But now the <em>level </em>on which these achievements happen has changed.</p><h2>Achievements, high and low</h2><p>Accepting The New Way of developing software, I&#8217;ve found two things to be great sources of a sense of achievement and wonder:</p><ul><li><p>getting better at steering models &#8211; &#8220;wow, it wrote code for 5 minutes without me watching, and I got a working solution&#8221;.</p></li><li><p>iterating on <em>useful results, fast</em> &#8211; the unit of work is now the completed, usable feature, not some kind of abstract programming artifact.</p></li></ul><p>Here&#8217;s an example of the former:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bf2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bf2e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 424w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 848w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 1272w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bf2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png" width="1440" height="1762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1762,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:298041,&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://blog.cultivated.engineer/i/158571446?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.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_!Bf2e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 424w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 848w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.png 1272w, https://substackcdn.com/image/fetch/$s_!Bf2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63c3d4cc-d6af-4e17-bde4-36b747fee40c_1440x1762.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>This Cursor is generating <em>multiple rules for itself</em>, after I asked to <em>generate one</em>.</p><p>I provided enough of the right context so that it actually figured out what we wanted to achieve, so it proactively provided solutions &#129327;</p><p>Seeing this created a euphoric feeling!</p><p>It&#8217;s the same dopamine rush as regular programming, just the source is different.</p><h2>That&#8217;s cool, but I still don&#8217;t get good results</h2><p>Neither did I for a long time!</p><p>What changed:</p><ul><li><p>I started to visualize working with the LLM as working with a fresh hire,</p></li><li><p>they have zero context of what&#8217;s going on: what is the business about, what problems are urgent, how does the codebase look like, etc.</p></li><li><p>they are happy to learn and adjust their behavior to how things work around here.</p></li></ul><p>Providing the right context is <em>crucial</em>.</p><p>For inspiration look <a href="https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/">here</a>.</p><p>I&#8217;ll post more of my own workflows soon.</p><p>The point is: <em>you </em>need to experiment and learn.</p><p><em>Nobody </em>has &#8220;figured it all out&#8221; yet.</p><p>Only practice can teach you.</p><h2>You are your own obstacle</h2><p>And that&#8217;s why the responsibility for results lies with <em>you.</em></p><blockquote><p>Too much context for the LLM to consider?</p></blockquote><p>Maybe you don&#8217;t know the domain well-enough.</p><p>Or the codebase isn&#8217;t structured well enough to limit the necessary context.</p><blockquote><p>The LLM can&#8217;t work its way out of a tricky situation?</p></blockquote><p>I once had the LLM get stuck on working with multiple nested async context managers in Python.</p><p>I couldn&#8217;t help it out of that situation <em>because I wasn&#8217;t familiar enough </em>with that particular corner of Python.</p><p>Had I been, I could have guided it to the right solution.</p><blockquote><p>Too many hallucinations &#8211; it&#8217;s building a house of cards!</p></blockquote><p>Mmh, looks like you don&#8217;t have practical tests or other ways to give the LLM quick, automated feedback to arrive at a solution.</p><h2>What&#8217;s next?</h2><p>Experiment.</p><p>Learn.</p><p>Iterate.</p><p>If you don&#8217;t have a side-project you are working on, it is high time by now.</p>]]></content:encoded></item><item><title><![CDATA[Questions to ask yourself]]></title><description><![CDATA[when coding with an LLM]]></description><link>https://blog.cultivated.engineer/p/questions-to-ask-yourself</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/questions-to-ask-yourself</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Wed, 12 Mar 2025 10:02:16 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="2304" height="1536" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:2304,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;plasma ball digital wallpaper&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="plasma ball digital wallpaper" title="plasma ball digital wallpaper" srcset="https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1530973428-5bf2db2e4d71?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8c2NpZW5jZXxlbnwwfHx8fDE3NDE3MDM5MzF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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">Photo by <a href="true">Josh Riemer</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h1>Practical experience is hard currency right now</h1><p>What&#8217;s fun about coding with LLMs right now is that literally nobody <em>knows </em>anything right now.</p><p>The few people who know a few things will find that their knowledge can change overnight with the release of a new model or a new version of the AI tooling.</p><p>This is great!</p><p>The only currency that counts right now is <em>experience</em>.</p><p>And getting experience is accessible to everyone.</p><p>I have been and still am actively trying to hit the limits when working with Cursor and Sonnet 3.7.</p><p>An important part of that is asking the right questions.</p><p>Here are mine.</p><h2>Are simple prose rules enough?</h2><p>I&#8217;m getting good leverage &#8211; fewer mistakes &#8211; from Cursor rules, written in their undocumented format, generated by Cursor itself.</p><p>Making sure the right rules end up in the context window is often tricky, but not unmanageable.</p><p>What I need to try: would a simple markdown file with instructions, explicitly included in the context, yield better or worse results when coding with an AI?</p><p>This would make the rules independent of a concrete environment like Cursor or Windsurf.</p><h2>What would happen if I encoded all rules in the linter?</h2><p>Rules encode a <em>request </em>or <em>wish </em>for the LLM to do the right thing.</p><p>Would I get better results by writing a project-specific linter that <em>enforces</em> every rules, thus providing a closed feedback loop to the LLM?</p><p>How would I approach process-related rules, like writing tests first? My hunch is that to create a notion of <em>first</em>, there needs to be a notion of <em>before </em>and <em>after.</em></p><p>Leveraging git history or planning documents for this comes to mind.</p><h2>When is the feedback loop fast enough?</h2><p>I&#8217;ve used Plan-Implement-Test cycles successfully in an existing large project (~10000 files, multiple backend services, large frontend codebase) to implement well-scoped changes</p><p>But the feedback loop is terribly slow (multiple seconds to run IO-less tests).</p><p>What if I write my next project in such a way that the feedback loop stays under 1s for component: for running all kinds of static checks, compilation, tests, etc</p><p>Would being this fast get me better results?</p><h2>Can I script the high-level development flow?</h2><p>Over and over I find myself in the same loop:</p><ol><li><p>Draft specification with the AI,</p></li><li><p>Convert the specification into a step-by-step plan according to the project rules,</p></li><li><p>Ask the LLM to code up the first step</p></li><li><p>Verify result using tests &#8211; keep doing this until all tests pass</p></li><li><p>Mark plan item as completed and move to the next plan item</p></li></ol><p>To what degree is automation possible here?</p><p>Do I need to code my own agent?</p><p>Is a command line tool enough to make this process smoother?</p><p>Do I need to write a VSCode extension for this and load it into Cursor?</p><h2>Should I express expectations with code-samples?</h2><p>Often I tell the LLM what I want in English and I get working results.</p><p>Sometimes I learn something new about the technology I&#8217;m using.</p><p>At other times, I find the result hard to relate to and understand.</p><p>Would I get code that&#8217;s easier to keep in my head if I prompted it with concrete code example, e.g. function signatures without an implementation?</p><h1>The promised land</h1><p>This list of questions is not exhaustive and finding answers to all of this is a lot of work.</p><p>What is the motivation behind this?</p><p>Why dig deeper?</p><p>Because the end goal is compelling &#8211; the machine chugging away with little oversight, until it hits a stable state, freeing up my time to refine the execution plan.</p><p>And then, in the next step, running two of these busy workers, then three, then four, until I manage an entire &#8220;team&#8221;.</p>]]></content:encoded></item><item><title><![CDATA[I have seen the light]]></title><description><![CDATA[How LLMs change what it means to be a software developer]]></description><link>https://blog.cultivated.engineer/p/i-have-seen-the-light</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/i-have-seen-the-light</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Fri, 07 Mar 2025 07:24:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pHlc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pHlc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pHlc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 424w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 848w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 1272w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pHlc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png" width="1456" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pHlc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 424w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 848w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.png 1272w, https://substackcdn.com/image/fetch/$s_!pHlc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F706b535e-437e-41c2-a3a4-0a6aa9f2655c_1600x643.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 href="https://ghuntley.com/ngmi/">Some are not going to make it</a></figcaption></figure></div><p>The last four weeks have been tumultuous, as I crossed a particularly important chasm.</p><p>I came to accept that software development as we know it is gone.</p><p>Not yet for all, but eventually for almost everybody.</p><p>As somebody who took pride in fundamentally understanding the tools I use every day, getting proficient and effective at using Emacs, and Vim, and the whole array of low-level UNIX tools like Make, this was a bitter pill to swallow.</p><p>LLMs have become so good at writing code &#8211; if you just &#8220;hold them right&#8221; &#8211; that none of the things I valued are relevant for the creation of end-user products, to any significant degree.</p><p>This requires an identity shift &#8211; mastery of the craft is not relevant, when the craft itself becomes irrelevant.</p><h2>Sharp knives not a kitchen make</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4898" height="3265" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3265,&quot;width&quot;:4898,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person slicing raw meat on chopping board&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person slicing raw meat on chopping board" title="person slicing raw meat on chopping board" srcset="https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1618862633131-289f00c6a09e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNnx8cmVzdGF1cmFudCUyMGtpdGNoZW58ZW58MHx8fHwxNzQxMzMyMjQ4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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">Photo by <a href="true">Brands&amp;People</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Why get really good at forging and smithing kitchen knives when you can just buy one and move on with the task of <em>making food</em>?</p><p>Sometimes it is fun to create objects for yourself.</p><p>The process sure is enjoyable.</p><p>You learn a lot.</p><p>But when starting a restaurant, you wouldn&#8217;t hire someone to forge bespoke knives for your restaurant.</p><p>You wouldn&#8217;t burden your chefs with that.</p><p>No, ideally your chefs are free to focus on what matters:</p><ul><li><p>picking high quality ingredients,</p></li><li><p>establishing processes that enable effective collaboration in the kitchen,</p></li><li><p>devising new signature dishes that set your restaurant apart from others.</p></li></ul><p>While the restaurant business has solved this problem over a century ago, programming is going through a similar transition only now.</p><p>The programming world up until recently was a world of knife-forging.</p><p>Your business needs a website that&#8217;s tightly integrated with your business processes?</p><p>Time to hire a team of software-smiths, creating bespoke software for you.</p><p>Every single time, for every single business.</p><p>None of this matters anymore to the degree of economic relevance.</p><h2>Old questions, new answers</h2><blockquote><p>What programming language should you use?</p></blockquote><p><strong>Old me: </strong>it&#8217;d be amazing to write more code in Common Lisp &#8211; live-reloading everything! Performant, but also dynamic! I&#8217;ll settle with Ruby (an acceptable substitute), or Go for now (when performance matters). JavaScript &#8211; I&#8217;ll write it begrudgingly, because it&#8217;s needed.</p><p><strong>New me: </strong>The one that allows you to do what you need, and can be easily written by LLMs.</p><blockquote><p>What editor/IDE should I use?</p></blockquote><p><strong>Old me: </strong>let&#8217;s learn Emacs &#8211; I can program it exactly to my liking! Vim has such an interesting approach to text editing, let me learn that too.  Finally, with LSPs I can bring IDE-like features to any editor!</p><p><strong>New me: </strong>The one that allows you to monitor, instruct, and manage coding agents the easiest. Today this is Cursor, but it really doesn&#8217;t matter.</p><blockquote><p>This code &#8220;feels bad&#8221; &#8211; I need to rewrite it</p></blockquote><p><strong>Old me: </strong>what even makes code &#8220;good&#8221;? Can I list the traits? Let me rewrite this piece of code five times until I arrive at something that &#8220;feels right&#8221;.  Now I only need to convince my team that this is better.</p><p><strong>New me: </strong>The LLM does not have feelings &#8211; if it passes the tests and you can understand what&#8217;s going on, then probably the code is good enough.</p><h2>What&#8217;s next</h2><p>I feel like I&#8217;m constrained by time &#8211; I want to drive Cursor harder, faster, more, further.</p><p>When it works, the experience is magical: the machine writes working code and while it does that, I plan out the next step.</p><p>The challenge is getting good enough at instructing the machine so that it&#8217;ll get it right 99% of the time and doesn&#8217;t require baby-sitting anymore.</p><p>That&#8217;s called Prompt Engineering.</p>]]></content:encoded></item><item><title><![CDATA[The big divide]]></title><description><![CDATA[LLMs will create a larger divide between skilled and unskilled people]]></description><link>https://blog.cultivated.engineer/p/the-big-divide</link><guid isPermaLink="false">https://blog.cultivated.engineer/p/the-big-divide</guid><dc:creator><![CDATA[Dario Hamidi]]></dc:creator><pubDate>Mon, 17 Feb 2025 08:32:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zcjU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zcjU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zcjU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 424w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 848w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 1272w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zcjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png" width="1456" height="897" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.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;:145109,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zcjU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 424w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 848w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.png 1272w, https://substackcdn.com/image/fetch/$s_!zcjU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3fa148d-1db1-4bd4-99d1-5aa5108a7636_2228x1373.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><h1>Deliberate practice, eliminated deliberately</h1><p>People like to take the path of least resistance whenever one presents itself.</p><p>Programming after the growing <em>immediate </em>usefulness of AI coding assistants is no different.</p><p>Why struggle through understanding a problem deeply, carefully developing a solution, and ultimately having to maintain something yourself,</p><p>When the alternative is to literally just hit the &#8220;TAB&#8221; key?</p><p>The appearance of the &#8220;solve my problem, right now&#8221; button is a new form of instant gratification, now in the field of programming.</p><p>Using this tool is a choice and a deliberate one at that.</p><p>However, each time you do, it&#8217;s a trade-off.</p><p>A deal with the devil.</p><p>Solve your immediate problem right now, but don&#8217;t learn anything new, nor practice anything familiar.</p><p>It&#8217;s convenient, it makes you feel good.</p><p>It even allows you to ship things faster.</p><p>But it also makes your skills trophy.</p><p>Steve Jobs envisioned computers as &#8220;bicycles for the mind&#8221;.</p><p>AI coding assistants are &#8220;cars for the mind&#8221;.</p><p>They take you from A to B, with little effort on your own.</p><p>As a result, you&#8217;ll slowly use the ability to exert effort in the first place.</p><p>And finally, once everything seems difficult, you&#8217;re beholden to the tool and what its creators have envisioned for it.</p><h1>Where this will lead</h1><p>I&#8217;m convinced this development will lead to a very different distribution of skills.</p><p>Before the advent of AI-assisted coding, the distribution of skill approached a normal distribution:</p><p>Anybody with a laptop could get started with programming, yielding many programmers in total, a smallish amount of beginners, the bulk of the population having an average skill level, and then a few hardened veterans who are experienced and skilled by virtue of having had years and years of practice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Bml!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Bml!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 424w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 848w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 1272w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Bml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png" width="1456" height="897" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.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;:216594,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6Bml!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 424w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 848w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.png 1272w, https://substackcdn.com/image/fetch/$s_!6Bml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d8c4e1-410f-47d9-885e-e73e9863635b_3342x2060.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>With the incentive for practice eliminated, there will be few people left with the patience and access to opportunities to accumulate the years of experience necessary to become true masters of the skill.</p><p>In other words, there will be very few experienced senior engineers left &#8211; people who have the ability to see novel solutions, and to implement them.</p><h1>Brace for impact</h1><p>This is going to be a problem for everyone, not just current junior or mid-level software engineers.</p><p>The whole world runs on software now.</p><p>Think of the software:</p><ul><li><p><a href="https://teslamotorsclub.com/tmc/threads/tesla-software-update-bricked-my-car.329215/">in your car</a>,</p></li><li><p><a href="https://en.wikipedia.org/wiki/2025_Potomac_River_mid-air_collision">the software used by air-traffic controllers to prevent planes from colliding mid-air</a>,</p></li><li><p><a href="https://www.forbes.com/councils/forbesagencycouncil/2021/03/16/automated-filters-gone-wrong-the-small-business-social-media-conundrum/">the software deciding what you can talk about in public</a></p></li></ul><p>Hitting &#8220;TAB&#8221; to solve the problem isn&#8217;t going to cut it.</p><p>First of all, no current LLM can even comprehend real-life large codebases in detail to understand what the exact problem even is.</p><p>Second, even if they could, it would be slow and expensive.</p><p>But without having trained the skills of analyzing problems and developing your own solutions, you won&#8217;t be in a position to make any meaningful change to these systems.</p><p>That&#8217;s &#8220;press this key and pray&#8221; software development.</p><p>Experienced software engineers will be in demand again, in those niches at the very least.</p><p>Until then, the challenge becomes preserving skills and developing the next generations of developers.</p><h1>Where we&#8217;ve seen this before</h1><p>This is not a new dynamic.</p><p>The popularization of automated high-quality translations has allowed many more people to communicate successfully that otherwise would not have been able to.</p><p>Yet using Google Translate is not a substitute for actually knowing a language &#8211; when it&#8217;s off you&#8217;re hopelessly lost if you don&#8217;t know the target language at all.</p><p>We still have translators, we still have people learning languages.</p><p>What&#8217;s changed is that language learning has become a choice in many cases.</p><p>There are those who persist through the difficulty of learning a language, and there are those who outsource this to a machine.</p><p>Only one of these groups reaps great long-term benefits.</p><p></p><p></p>]]></content:encoded></item></channel></rss>