<?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[load-bearing printf]]></title><description><![CDATA[My personal Substack]]></description><link>https://blog.samra.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!xedS!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8735359a-f313-43b4-b625-02cfd1c9288f_468x468.png</url><title>load-bearing printf</title><link>https://blog.samra.dev</link></image><generator>Substack</generator><lastBuildDate>Sun, 31 May 2026 00:11:52 GMT</lastBuildDate><atom:link href="https://blog.samra.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[NS]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[loadbearingprintf@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[loadbearingprintf@substack.com]]></itunes:email><itunes:name><![CDATA[Nav]]></itunes:name></itunes:owner><itunes:author><![CDATA[Nav]]></itunes:author><googleplay:owner><![CDATA[loadbearingprintf@substack.com]]></googleplay:owner><googleplay:email><![CDATA[loadbearingprintf@substack.com]]></googleplay:email><googleplay:author><![CDATA[Nav]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[I shipped a game solo. Here's what AI couldn't do.]]></title><description><![CDATA[Claude Code made the scope possible. It did not make the product obvious.]]></description><link>https://blog.samra.dev/p/i-shipped-a-game-solo-heres-what</link><guid isPermaLink="false">https://blog.samra.dev/p/i-shipped-a-game-solo-heres-what</guid><dc:creator><![CDATA[Nav]]></dc:creator><pubDate>Thu, 07 May 2026 03:31:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/10518fc0-2216-46c6-b87f-5b1554007a5a_750x381.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Steve Jobs <a href="https://www.youtube.com/watch?v=NjIhmzU0Y8Y">called the computer</a> &#8220;a bicycle of the mind&#8221;: a tool humans build to &#8220;amplify these inherent abilities that we have to spectacular magnitudes.&#8221;</p><p>But what happens when the tools get fast enough to outrun the rider?</p><p>Code has become the cheap part. The expensive parts are constraint definition, taste, validation, and figuring out when a technically impressive system makes the product worse.</p><p><em><strong>the tl;dr</strong></em>: I built a word puzzle game called <a href="https://rightwords.io/">Right Words</a> as a side project while working full-time. You trace two-word phrases in a grid and jump a gap between the two words. Every tile belongs to exactly one phrase.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RC0G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RC0G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 424w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 848w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 1272w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RC0G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png" width="900" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42126,&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://loadbearingprintf.substack.com/i/196644575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.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_!RC0G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 424w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 848w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.png 1272w, https://substackcdn.com/image/fetch/$s_!RC0G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F265f3492-52e9-4f06-9f53-00d3c2bdc598_900x375.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><h3>The Problem Behind the Puzzle</h3><p>A Right Words puzzle is a cluster of six two-word phrases crammed into a grid. The packing has to meet a series of constraints that are, frankly, deceptively convoluted:</p><ul><li><p>every cell can belong to only one answer</p></li><li><p>consecutive tiles have to be grid-adjacent, including diagonals</p></li><li><p>the gap between word1 and word2 of a phrase must be one tile skip (cardinal or diagonal) giving a max of 8 possible tiles to jump to</p></li><li><p>no alternative tile arrangement can spell the same phrase (requires exhaustive path enumeration)</p></li><li><p>if two tiles share a letter, swapping them can&#8217;t produce a valid alternative traversal</p></li><li><p>no repeated words across answers, no word1 that doubles as another answer&#8217;s word2</p></li><li><p>every phrase has to be a real two-word phrase people actually recognize, within a tight character limit</p></li><li><p>the difficulty system optionally requires one answer to have a readable &#8220;gimme&#8221; word while preventing all others from having straight-line words</p></li></ul><p>The packer uses MRV heuristic for phrase selection, seeded RNG for reproducibility, and restart limits to escape dead ends. False positive detection runs DFS against the full grid for every placed answer.</p><p>Friends keep asking when it&#8217;ll go daily. Six valid, non-overlapping, theme-coherent two-word phrases that pack into a grid with zero false positives and the above constraints is not something I can produce on <em>that</em> schedule (hello, Tracy Bennett? <a href="https://x.com/thegridkid">Sam Ezersky?!</a>). &#129394;</p><p>I hadn&#8217;t built a constraint-satisfaction solver before, so I designed the rules and architecture, then used Claude Code to accelerate the implementation. I defined what the solver needed to enforce, Claude built the packer, validator, and path generator. I tested the output and caught the cases it missed, like a path ambiguity bug where two same-letter tiles separated by a different letter could be swapped without breaking adjacency.</p><p>That division (I define, Claude builds, I verify) is what made the scope possible.</p><p><em>note: I previously discussed this dynamic in <a href="https://loadbearingprintf.substack.com/p/judgment-doesnt-scale-with-speed">Judgment Doesn&#8217;t Scale With Speed</a></em></p><h3>The Breadth Problem Solved</h3><p>Justin Searls <a href="https://justin.searls.co/posts/full-breadth-developers/">wrote about &#8220;full-breadth developers&#8221;</a>, people who do both technical execution and product thinking. His take is that AI rewards this combination disproportionately. I&#8217;d say it more plainly: I could design Right Words before AI. But I couldn&#8217;t implement the full stack alone in <em>any</em> reasonable timeframe. It would&#8217;ve sat in the backlog of ideas piled high on my list of purchased and unhosted domain names.</p><p>None of the individual subsystems were impossible. In fact, all of them are pretty doable on their own (a constraint solver, puzzle packer, fun UI/UX interactions when selecting words and creating skip chains, and all the usual mobile game goodness in share cards, etc.). The hard part&#8217;s keeping product intent coherent across all of them at once, <em>and</em> doing it in the margins of a full-time job. That&#8217;s the breadth problem. An AI collaborator that could move between the packer algorithm and a CSS animation timing bug in the same conversation is ultimately what made the scope feasible.</p><p>Peter Steinberger (of OpenClaw fame) <a href="https://steipete.me/posts/2025/understanding-codebases-with-ai-gemini-workflow">has a technique</a> for bulletproofing specs using two AI contexts, one generates, one critiques. I applied that combo to a layered doc hierarchy (<code>SPEC.md</code> &#8594; <code>ARCHITECTURE.md</code>) that the AI reads every conversation (and applies to its own memory &amp; <code>CLAUDE.md</code>), each layer narrowing from broad product intent to specific code constraints. Precise specs meant precise output, which meant speed. Vague specs meant debugging the spec, not the code, and the bugs nearly always came from the vague parts.</p><h3>The Human Element Remains</h3><p>I even had AI try to generate the puzzle content. It returned a Greek mythology theme that included STAR FISH (theme incoherency aside, starfish is one word!). The same list had TROJAN HORSE twice and HERCULES STRENGTH (?), and a bunch of one-word &#8220;phrases.&#8221; <em>You cannot delegate content curation.</em></p><p>Picking themes is harder than it sounds. The theme name itself is a difficulty lever: &#8220;Fast Food&#8221; is obvious, &#8220;Legendary Lines&#8221; requires you to realize these are all idioms from Greek mythology (after <em>ideally</em> spending no more than a couple of minutes looking for a <em>&#8220;Here&#8217;s Johnny!&#8221;</em>). Monday themes run more cryptic than Friday themes, by design. I choose each one knowing that a confused player bounces and a condescended player stops coming back.</p><p>Word selection is worse. Every phrase has to be immediately recognizable, but not so common that it shows up in multiple themes. The two words have to be long enough to create interesting paths (minimum three characters each, for now) but short enough to fit the grid. Some perfect phrases just don&#8217;t pack: too many common letters create false positives, and consecutively repeated letters leave the packer with no room to route other answers around them. I&#8217;ve thrown away dozens of great phrases because the algorithm couldn&#8217;t use them without creating an alternate valid path.</p><p>I hand-curate every word list. I hand-place the paths I care about. For example, I placed GORDIAN KNOT tile-by-tile in the visual designer, locked it, and told the packer to arrange five other phrases around my shape, a <em>puzzlingly</em> unnecessary use of my time to give <em>one</em> phrase of <em><strong>one</strong></em> puzzle a specific aesthetic. This required building shape-shifting, pre-placed chain support, and updating the CLI to support completion of a <code>--partial</code> pack. Claude built the machinery in an hour. I spent three days deciding what the puzzle should look like. It can build anything you want! It just won&#8217;t want it for you (and in an era of creative slop being dispensed like warm soft serve, that&#8217;s a <em>good</em> thing).</p><h3>The Difficulty Trap</h3><p>I spent entirely too much time building a hard mode that rejected any packing where a word read in a straight line. <strong>Maximum difficulty.</strong></p><p>Then, a friend played it and said, &#8220;95% of the addressable market does these puzzles to feel clever. You get better uptake by adding confetti to winning than figuring out how to obscure things.&#8221;</p><p>I&#8217;d been building for my five most hardcore friends. Analytics revealed that the players who actually left were leaving because they had no foothold.</p><p>So I (sadly) scrapped it. Fridays get a word that reads left-to-right. Mondays get one readable vertically on an edge. The &#8220;gimme&#8221; system exists because someone with fresh eyes identified the difficulty I had grown accustomed to (and thus kept trying to crank higher). I cannot stress the importance of early user testing enough!</p><h3>Fast Feels Free</h3><p>The tutorial has a trampoline animation on the gap tile during a jump. Worked fine in the normal game. In the tutorial, it replayed on every subsequent tap.</p><p>I prioritized AI &#8220;correction&#8221; speed over diagnosis and went with the first fix: suppress the pulse on the gap tile. This killed the visual hint showing players which tile to tap next.</p><p>Second attempt: stabilize the key so pulse changes wouldn&#8217;t remount the tile. Pulse animations went out of sync.</p><p>Third: timed effect, apply the trampoline for 500ms then clear it. Rapid tapping re-triggered it.</p><p>Fourth: <code>ref</code>-based tracking. Didn&#8217;t fire at all on one answer due to <code>setState</code> timing.</p><p>Fifth: duplicate the Grid component for the tutorial, decouple the trampoline from React&#8217;s key system entirely.</p><p>Five worked. But I should have gotten there on attempt one. The bug only appeared in the tutorial because the normal game&#8217;s <code>validMoves</code> empties after a jump, a <code>!state.jump</code> gate. The gap tile is never pulsed in normal gameplay. Asking &#8220;why only here?&#8221; instead of &#8220;how do I fix it?&#8221; would have saved four attempts.</p><p>Claude gave me five implementations in the time it would&#8217;ve taken to try two. But I was moving fast because fast felt free, and I skipped the part where you explain the bug to yourself before trying to fix it.</p><blockquote><p><em>&#8220;95% of the addressable market does these puzzles to feel clever. You get better uptake by adding confetti to winning than figuring out how to obscure things.&#8221;</em></p></blockquote><h3>What Stayed Difficult</h3><p>The hard parts were deciding what difficulty means for casual players. Or a puzzle feeling &#8220;less fun&#8221; until I traced a new version that &#8220;felt&#8221; right. Or deciding to duplicate a 250-line component rather than risk a small change to the Grid in production, now that there&#8217;s a small but loyal group of people who play every week.</p><p>That is the part I think people understate about AI-assisted development. It does not remove engineering judgment. It changes where judgment is spent.</p><p>Jobs said we&#8217;re tool builders, and the best tools amplify our inherent abilities to spectacular magnitudes. The bicycle for the mind assumed the rider knew the route. AI is not a bicycle. It&#8217;s an orchestra. You still need a conductor, a score worth playing, and the ear to know when it sounds like shit.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sjE8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sjE8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 424w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 848w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 1272w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sjE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp" width="586" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:586,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24988,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://loadbearingprintf.substack.com/i/196644575?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sjE8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 424w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 848w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 1272w, https://substackcdn.com/image/fetch/$s_!sjE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30977f24-0448-4f7e-a9bb-59f970a2c704_586x446.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">my side projects waiting for me to get to them, 2024 BC (Before Claude)</figcaption></figure></div><p>Without <a href="https://code.claude.com/docs/en/overview">Claude Code</a>, <a href="https://www.rightwords.io/">Right Words</a> would still be a purchased domain name on my list of ideas I&#8217;ll get to someday. &#128128; <em>With</em> it, the game shipped, people play it every week, and I spend my time on what the next puzzle should feel like instead of debugging a path validator at 2am. I mean&#8230; I still debug path validators at 2am. But now it&#8217;s a <em>choice</em>.</p>]]></content:encoded></item><item><title><![CDATA[Judgment Doesn’t Scale With Speed]]></title><description><![CDATA[A few months ago I realized I was merging code faster than I could explain.]]></description><link>https://blog.samra.dev/p/judgment-doesnt-scale-with-speed</link><guid isPermaLink="false">https://blog.samra.dev/p/judgment-doesnt-scale-with-speed</guid><dc:creator><![CDATA[Nav]]></dc:creator><pubDate>Sun, 08 Feb 2026 22:01:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xedS!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8735359a-f313-43b4-b625-02cfd1c9288f_468x468.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few months ago I realized I was merging code faster than I could explain. Everything passed CI. Nothing was broken. But days later, I couldn&#8217;t always tell you why I&#8217;d approved certain decisions over simpler ones.</p><p>One example stuck with me. I merged a refactor last week that passed CI without issue. Three days later, I had to reread the diff to remember why I chose that approach over a simpler one. Nothing was broken, but I wasn't sure it was the right call and that bothered me more than an actual bug would have.</p><h2>Comprehension Debt</h2><p>Technical debt is what happens when the codebase degrades. There&#8217;s another kind: when your <em>understanding</em> of it degrades. I think of that as comprehension debt. You don&#8217;t notice it building until something breaks at 2 a.m., and then you realize you can&#8217;t reason about code with your name on it.</p><p>I&#8217;ve been using AI coding tools aggressively for over a year: agentic tools, chat workflows, autocomplete, all of it. I&#8217;m faster than I&#8217;ve ever been. I&#8217;ve shipped enough code I couldn&#8217;t explain a week later to know going faster without understanding it is a trap. Anthropic's own research <a href="https://www.anthropic.com/research/AI-assistance-coding-skills">backs this up</a>. AI tools can absolutely increase output. They can also weaken your ability to reason about the code you ship.</p><p>If comprehension debt is the problem, the real question is: what am I protecting when I review AI-generated work? I&#8217;m not sure I have this fully answered.</p><h2>What I Protect, What I Don&#8217;t</h2><p>Most of the discourse is useless binary stuff: either you use AI or you don&#8217;t, either you&#8217;re a &#8220;real engineer&#8221; or you&#8217;re dependent. You don&#8217;t want to be the person flooring it toward a wall with blinders on to everything but the speedometer. But I also don&#8217;t want to be the one still taking a horse to work clutching punch cards. The actual skill is knowing which tasks need your full attention and which ones don&#8217;t.</p><p><strong>What I won&#8217;t delegate.</strong> Architecture. System design. Tracing a production issue through three services at midnight when something&#8217;s on fire (log parsing aside, which AI is fantastic at). All this stuff comes from reps, and I don&#8217;t think reviewing AI output builds it the same way.</p><p><strong>What I&#8217;ve let go.</strong> Exact API signatures. CRUD boilerplate. Stuff I've written a hundred times and will never learn anything new from writing again. It's long division at this point. Knowing it exists and when to reach for it is enough.</p><p><strong>The middle ground.</strong> First drafts of tricky logic. Reading docs vs. asking an AI to summarize them. Manually stepping through a stack trace. I still do these because they keep my instincts sharp&#8230; but, the line <em>does</em> move. The question I keep coming back to: <em>is doing this manually still teaching me something, or is it just habit?</em> I don&#8217;t always know.</p><h2>How I Actually Work With These Tools</h2><p><strong>LLMs list the options. I pick.</strong> In unfamiliar territory, I ask for approaches, tradeoffs, and failure modes instead of &#8220;the best solution.&#8221; If I let the AI make the design decision, I&#8217;ve skipped the part of the work that matters most. I&#8217;ve caught myself doing this more than I&#8217;d like to admit.</p><p><strong>I don&#8217;t touch code until I can describe what &#8220;done&#8221; looks like.</strong> What am I building? How will I know it works? What&#8217;s out of scope? No amount of prompting fixes unclear thinking on my end.</p><p><strong>Small pieces, reviewed like someone else wrote them.</strong> Because someone else effectively did! I break work into chunks small enough to hold in my head. That&#8217;s usually the moment I either catch it or let it compound.</p><p><strong>If I&#8217;m getting faster but less sure, something&#8217;s wrong.</strong> These tools should make me faster <em>and</em> more confident. If speed is climbing while certainty drops, I need to change something in the process.</p><h2>Staying Honest</h2><p>After doing this long enough, I&#8217;ve learned to watch for certain signals in myself. Copying prompts without thinking about what I&#8217;m actually asking. Accepting a design I don&#8217;t fully understand because the output looks right. Skipping review because the tests passed. That low-grade unease about a piece of code that I convince myself isn&#8217;t worth investigating.</p><p>When those show up, I take the next piece of work and do it manually. Not because hand-writing code is inherently better, but because the discomfort is telling me I&#8217;m losing the thread.</p><p>Honestly, the biggest fear is needing AI because I can no longer do the work without it. I want it to make me faster, not to become something I can&#8217;t function without.</p><h2>Where This Lands</h2><p>I don't have this fully figured out, and it shifts as the tools do. But I've got a framework that&#8217;s started to move with it. I keep coming back to this: speed is the easy part now. In my experience, judgment is the hardest thing to build and the easiest thing to weaken if you are not paying attention.</p>]]></content:encoded></item></channel></rss>