<?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>Wed, 15 Jul 2026 06:36:24 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[Why I routed Claude Code to my smart glasses.]]></title><description><![CDATA[Agents turned side projects into parallel threads. Now what's worth a glance?]]></description><link>https://blog.samra.dev/p/why-i-routed-claude-code-to-my-smart</link><guid isPermaLink="false">https://blog.samra.dev/p/why-i-routed-claude-code-to-my-smart</guid><dc:creator><![CDATA[Nav]]></dc:creator><pubDate>Tue, 02 Jun 2026 00:39:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1_S0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A couple of weeks ago, I picked up a pair of <a href="https://www.evenrealities.com/smart-glasses">Even Realities G2 smart glasses</a>. They feel like future-tech without the usual hardware-startup delusion that every device needs to replace your phone: real-time translation, a HUD teleprompter, quick voice queries, and just enough display to make information feel ambient instead of invasive.</p><p>But my interest was narrower. I didn&#8217;t buy them to talk to AI in public or read dense logs on my lenses. I was chasing a more specific question: could they become a peripheral display for background agent work?</p><p>I built a small, self-hosted system called <strong>Beacon</strong> around one annoying problem: long agent runs should not require me to sit there and babysit the terminal.</p><p>Last week, during a workout, Beacon crossed from a fun hack into an actual interface.</p><p>Before leaving my desk that afternoon, I kicked off a performance analysis for the puzzle packer for <a href="https://www.rightwords.io/">Right Words</a>. A possible v2 feature for community puzzle submissions had dragged packer runtime out of my terminal and into the user experience.</p><p>Previously, I didn&#8217;t mind if the packer took a few minutes. I&#8217;d kick it off and let it run. But in a real-time user-facing flow, waiting <em>minutes</em> for a puzzle to pack was a non-starter.</p><p>I asked Claude Code to profile the packer&#8217;s phrase-placement loop, with a focus on candidate path generation and dead-space detection. I needed to see which grid constraints caused the heuristics to stall and where the packer was actually spending its time.</p><p>Agents are good at that kind of slog: trace the loop, run the profile, compare the stalls, summarize the bottlenecks. The old cost was attention. I still had to sit there, wait for output, and monitor the terminal logs.</p><p>Instead, I went to the gym.</p><p>Ten minutes into my workout, a line of green text silently flickered into my peripheral vision:</p><blockquote><h5><code>BEACON - rightwords.io</code><br><code>&#9650; packer-opt: packer profiling complete. 3 core bottlenecks diagnosed.</code></h5></blockquote><p>The message gave me just enough signal to know the terminal had produced something worth reading.</p><p>I finished my set, pulled out my phone and remoted into my home session (thx, <a href="https://tailscale.com/">Tailscale</a>). The glasses stayed out of the interaction. They pointed me back to the place where the next judgment call lived. Because a deep performance profile is not a binary execution block, I needed to read Claude&#8217;s analysis, evaluate its diagnostics and decide whether I agreed with its proposed optimizations.</p><p>That gym run reframed the problem around <em>attention routing</em>.</p><p>For agentic tools, the useful interface is a thin peripheral signal that appears only when the machine has reached the edge of its autonomy and needs a human to choose the next move.</p><h3>Beacon: A Router, Not a Dashboard</h3><p>Beacon is the small, self-hosted pipeline I built to test this idea: a local hook, a compression layer, and a push surface that stays quiet until an agent needs my attention.</p><p>1. <strong>The Hook Layer</strong> (Bash): Claude Code&#8217;s Stop/Notification hooks trigger a local script, <code>beacon-watch.sh</code>. The script waits 10 seconds, then checks if my terminal window and <code>tmux</code> pane are focused. If I&#8217;m already editing or observing the terminal, it stays silent. Otherwise, it pings the relay layer.</p><p>2. <strong>The Relay Layer</strong> (Vercel Edge Function): An edge function receives the payload and passes the last assistant message through Claude Haiku, which summarizes it into a ~50-character, dense HUD message.</p><p>3. <strong>The Push Layer</strong> (Expo Go): For this v1 proof-of-concept, the formatted string is pushed through Expo and Apple&#8217;s notification service to my iPhone, where the Even Realities app mirrors it directly to my glasses.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>Beacon is my prototype of an <em><strong>ambient decision surface</strong></em>. It is a sparse peripheral display for routing the state and diagnostic of a background process to your attention.</p><h3>Status Belongs on the Wall</h3><p>My first mistake was routing everything to my glasses, including <code>puzzle_solved</code> events from Right Words. It was fun for about five minutes, then obviously useless. Every solve was a micro-distraction. </p><p>Puzzle solves are pure status notifications: passive, communal updates that do not require my judgment. That class of data belongs on a wall, maybe even a physical one, like a mechanical <a href="https://www.vestaboard.com/">Vestaboard</a> clacking quietly in the background of a room as an information radiator.</p><p>Beacon only matters at the point where status turns into a decision.</p><h3>The Side Project Is Multi-Threaded Now</h3><p>AI changed the topology of my side projects. Historically, developers have worked linearly, picking one repo, focusing on a single branch, and pushing it to completion because the cognitive cost of context-switching is too heavy.</p><p>Now, I keep three to five side projects moving in parallel. I might have Claude Code handling a major refactor in one terminal tab, building out a test suite in another, and profiling the puzzle packer in a third.</p><p>Working like this used to melt my brain. Background agents let you pipeline execution, but then you need to know when one of those threads has stalled. Before Beacon, I was tabbing through terminal windows like a paranoid security guard flipping between CCTV feeds, making the rounds just to see if anything needed me.</p><p>Beacon gives me controlled re-entry. I can leave chained-to-the-desk developer mode entirely. I can go to the gym, cook dinner, or read a book, knowing that if one of those concurrent threads needs me, my glasses will tell me where to look.</p><h3>Parallel Agents, Serial Judgment</h3><p>In my last two posts, I wrote about <a href="https://blog.samra.dev/p/judgment-doesnt-scale-with-speed">comprehension debt</a> and how AI <a href="https://blog.samra.dev/p/i-shipped-a-game-solo-heres-what">makes execution cheap but leaves judgment expensive</a>.</p><p>If an agent can execute ten hours of work in ten minutes, it will inevitably reach ten moments where it needs to ask you: <em>&#8220;Is this actually what you wanted?&#8221;</em></p><p>If the agent has to wait for you to sit down at your desk, load the context, and read a PR to answer those questions, the speed advantage evaporates. But if the agent pages you for every minor lint error, file write, or test run, you will throw your laptop out the window.</p><p>We are currently trying to solve this with two familiar primitives: <strong>notifications</strong> and <strong>dashboards</strong>. Neither quite matches the failure mode of agentic work.</p><h3>Beyond the Push Notification</h3><p>The obvious objection here is: <em>&#8220;Isn&#8217;t this just a phone notification in 2049 cosplay? My CI pipeline already pings Slack when it fails.&#8221;</em></p><p>Most notifications report a closed <strong>event</strong>: <em>X happened</em>. Agent blocks are different. They arrive mid-thread: <em>I ran X, hit Y, and need Z to proceed</em>.</p><p>When a standard CI pipeline fails, it stops. The system has no next move. It pages you because the system is mechanical: it can report failure, but it cannot reason through the next move. The only path forward is a human restart. But when an AI agent blocks, it is not dead; it is <strong>polling for intent</strong>. It has completed 90% of the execution, mapped the immediate tradeoffs, and is waiting for your input to decide the final 10%. It is a living, stateful thread.</p><p>If you route that block as a raw log or a generic Slack ping, you have degraded a stateful, high-leverage agent into a dumb cron job. A generic notification says <em>&#8220;look at this&#8221;</em> and throws you into the pile. A decision surface preserves the useful bit: where judgment is needed.</p><p>More importantly, notifications flatten everything into peers. Your phone treats texts, calendar reminders, and an agent&#8217;s build failure as the exact same kind of interruption.</p><p>An ambient decision surface can take many forms: a HUD in your glasses, a tiny e-ink display on your desk, or a single-line widget on your desktop. The hardware matters less than the rule: keep it sparse, peripheral, and reserved for moments that need judgment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1_S0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1_S0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1_S0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1167305,&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.samra.dev/i/200097904?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.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_!1_S0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1_S0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8862497a-48b1-4a01-bb1f-e4f1ca6e173c_4299x2418.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><figcaption class="image-caption">Behold: the fuckin&#8217; future.</figcaption></figure></div><p>To be clear, Beacon does not replace the terminal. When I remoted in from the gym, I was still using the same command-line <code>tmux</code> session. But there is a fundamental cognitive difference in how I reached that session. I did not get there by polling a dashboard, and I did not get there by letting an ordinary phone notification pull me into the pile. I got there because a compressed ambient signal told me exactly where my judgment was needed.</p><p>I am, admittedly, a sucker for hardware that makes the future feel less theoretical. I want the useful side of cyberpunk: high-agency tools that make one person more capable without turning every surface into an ad slot or another demand for attention. That is what worked about the G2s. They did not try to become my phone. They left me in the real world, adding only a small green status line at the edge of my vision when something was worth my attention.</p><h3>The Dashboard Fallacy</h3><p>The other default response is to build an &#8220;agent dashboard.&#8221;</p><p>Dashboards are fantastic when you want to <strong>inspect</strong> a system. They are terrible when the system&#8217;s primary job is to <em>reduce</em> the need for inspection.</p><p>A dashboard forces you to play the role of the anomaly detector. You have to poll the interface, scan the green checkmarks, read the log lines, and try to deduce where the agent is stuck or where its design is drifting from your intent.</p><p>To put it bluntly: <strong>a dashboard is what you build when you don&#8217;t yet know what actually deserves a human eye.</strong> It means the compression layer has not done its job.</p><h3>Why Your Phone is the Wrong Surface</h3><p>But still, the engineer asks: <em>&#8220;Why not just route these compressed decision boundaries to my phone Lock Screen? It&#8217;s already in my pocket.&#8221;</em></p><p>Because the phone is a <strong>destination</strong> rather than an environment.</p><p>To interact with a phone, you must cross a threshold of conscious intent. You pick it up, aim your face at its sensors, unlock it, and step inside. The phone is physically designed to consume 100% of your central attention.</p><p>Your phone is a focus casino. The moment you unlock it to resolve a build block, you&#8217;re pulling the slot machine&#8217;s lever. You are standing in the middle of a carnival of other apps specifically engineered to hijack your focus. Suddenly, a three-second review task has morphed into thirty minutes of brain-melting doomscrolling. The context-switch has already occurred.</p><p>A true ambient surface, like smart glasses or a physical status indicator on your desk, lives in your <strong>periphery</strong>. It has zero nesting depth. There are no folders to open, no other apps to swipe through, and no keyboard to summon. It sits in the room with you: something you can glance at, resolve with a single tap, and dismiss without ever leaving your current physical or mental state.</p><p>You do not &#8220;go to&#8221; an ambient surface. It occupies the background of your life until a decision requires it to step forward.</p><h3>Calm Technology for Agentic Work</h3><p>This isn&#8217;t a new design challenge, though AI has made it urgent. In the mid-1990s, Xerox PARC researchers Mark Weiser and John Seely Brown <a href="https://calmtech.com/papers/coming-age-calm-technology">introduced the concept</a> of <strong><a href="https://en.wikipedia.org/wiki/Calm_technology">Calm Technology</a></strong>. They argued that the most powerful machines would be those that &#8220;fit our lives&#8221; by moving seamlessly between our peripheral attention and our central focus.</p><p>An ambient decision surface is calm technology applied to the cognitive load of AI.</p><p>To work, a decision surface has to enforce a strict rule of <strong>context compression</strong>. If an agent is blocked, it cannot simply dump a stack trace onto your screen. It has to translate the block into product terms:</p><p>1. <strong>The Context</strong>: What is the active state and diagnostic?</p><p>2. <strong>The Decision Boundary</strong>: Why can&#8217;t the agent proceed autonomously?</p><p>3. <strong>The Resolution Path</strong>: What is required of human judgment to unblock it?</p><p>In practice, that means Beacon should not tell me that a process emitted 400 lines of logs. It should tell me the one thing I need to know:</p><div class="callout-block" data-callout="true"><h5><code>&#9650; packer profiling complete. 3 core bottlenecks diagnosed.</code></h5></div><p>The decision surface does not ask you to fix the problem on your wrist or your lens. It gives you enough shape to know what is waiting. When you return to the terminal, you are not spending ten minutes rediscovering the issue. You already know the diagnostic before your hands touch the home row.</p><h3>Smart Glasses as a Forcing Function</h3><p>This is where the constraints of smart glasses start doing useful design work.</p><p>One reason so many consumer hardware startups struggle is that they try to fit &#8220;phone-sized&#8221; experiences into wearable form factors. They want you to talk to a pin, or look at a wrist-mounted screen, to do things your phone does ten times better.</p><p>Smart glasses punish bad information design. They have almost no room for input, scanning, or explanation, which makes them useful as a forcing function for <strong>information density</strong>.</p><p>Because the G2s have such limited screen real estate and zero keyboard input, they <em>force</em> the developer of the agent interface to write better communication algorithms. If the interface has to explain an architectural block in 15 words, it suddenly becomes very good at summarizing tradeoffs.</p><p>The constraint of the glass lens forces the software to respect your skull.</p><h3>Don&#8217;t Answer Back</h3><p>Even Realities has a built-in &#8220;talk to AI&#8221; voice feature. A tool like Beacon invites an obvious next question: <em>&#8220;Why not let me voice-chat my response back to Claude from my glasses?&#8221;</em></p><p>That is where the interface stops being calm.</p><p>The moment you dictate refactors to your glasses, you have let the machine take over your environment. You are no longer in your periphery; you are actively context-switching. The glasses are no longer calm.</p><p>The useful pattern is the<strong> handoff</strong>. An ambient surface should do exactly one thing: signal when your input is required. If it&#8217;s a binary decision, I might eventually allow a simple physical tap gesture on the frame to choose a default. But if it&#8217;s a real architectural decision, it should simply route your attention back to your actual action-oriented operating surfaces, meaning your terminal, your editor, and your computer. The glasses act as the compass, leaving the terminal to serve as the steering wheel.</p><h3>The Cost of Free Execution</h3><p>We don&#8217;t all need to walk around in smart glasses to make this work. The hardware just makes the interface problem visible: stay out of the way until there is something to judge.</p><p>Five agents create five streams of partially resolved work, and every unresolved thread eventually lands back on the same copy desk.</p><p>AI made execution cheap, but judgment still bottlenecks on one editor, one context window, one red pen. Build the interface around that constraint.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Because this still runs through the default Expo client, the HUD notification header says &#8220;Expo Go.&#8221; Since I am pathologically particular about labels, I will eventually give Apple the $99 so an EAS Preview Build can say &#8220;Beacon&#8221; instead. &#129760;</p><p></p></div></div>]]></content:encoded></item><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>