<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Altair</title>
    <description>The latest articles on DEV Community by Altair (@altair_alter).</description>
    <link>https://dev.to/altair_alter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4189997%2F54eb9a49-a509-4db3-a27f-d6cd779d4253.png</url>
      <title>DEV Community: Altair</title>
      <link>https://dev.to/altair_alter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/altair_alter"/>
    <language>en</language>
    <item>
      <title>Which Session Is Waiting for Me? Claude Code Hooks on a Stream Deck</title>
      <dc:creator>Altair</dc:creator>
      <pubDate>Sat, 24 Oct 2026 03:14:24 +0000</pubDate>
      <link>https://dev.to/altair_alter/which-session-is-waiting-for-me-claude-code-hooks-on-a-stream-deck-3moo</link>
      <guid>https://dev.to/altair_alter/which-session-is-waiting-for-me-claude-code-hooks-on-a-stream-deck-3moo</guid>
      <description>&lt;p&gt;I usually have several Claude Code sessions running side by side — a document here, a small fix there, some research. On a busy day, around five.&lt;/p&gt;

&lt;p&gt;Delegating the work wasn't the problem. Noticing was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A session asking "may I run this?" gets buried behind other windows.&lt;/li&gt;
&lt;li&gt;A session finishes, and I don't notice for a while.&lt;/li&gt;
&lt;li&gt;I keep switching windows just to check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI wasn't the slow part. &lt;strong&gt;The time until I noticed&lt;/strong&gt; was. The more sessions I ran, the worse it got.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: three small pieces
&lt;/h2&gt;

&lt;p&gt;I put the state of each session on a small button box on my desk (a Stream Deck Neo: 8 keys and a thin info bar).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code hooks&lt;/strong&gt; run a small script at fixed moments — a prompt is submitted, a tool is about to run, permission is requested, the turn stops.&lt;/li&gt;
&lt;li&gt;The script writes &lt;strong&gt;one tiny JSON file per session&lt;/strong&gt;: which folder, which session, which state. No prompt text, no tool output.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Stream Deck plugin&lt;/strong&gt; reads those files every second and colors the keys.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The hook side is mostly a mapping from hook events to four states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// hook events -&amp;gt; key state&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;stateFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hook_event_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UserPromptSubmit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PostToolUse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                  &lt;span class="c1"&gt;// blue&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PreToolUse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                   &lt;span class="c1"&gt;// asking me a question also counts as waiting on me&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AskUserQuestion&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ExitPlanMode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ask&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PermissionRequest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ask&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                      &lt;span class="c1"&gt;// red&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Notification&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notification_type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;permission_prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ask&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notification_type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;idle_prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;waiting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Stop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;waiting&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                  &lt;span class="c1"&gt;// orange: done, please look&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SessionStart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                     &lt;span class="c1"&gt;// gray&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The colors:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red&lt;/td&gt;
&lt;td&gt;Waiting for my permission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;td&gt;Done — please look&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gray&lt;/td&gt;
&lt;td&gt;Idle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pressing a key brings that session's window to the front. See red, press it, approve in that window. No more hunting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it broke
&lt;/h2&gt;

&lt;p&gt;The bug that took longest: &lt;strong&gt;a session finished, but its key stayed blue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hook writes to a temp file and renames it over the real one. The plugin reads that file every second. On Windows, if the rename lands at the exact moment the plugin is reading, the rename can fail with &lt;code&gt;EPERM&lt;/code&gt;. My first version silently swallowed that error — so the "done" state was never written, and the key stayed blue. By the time I found it, 28 orphaned temp files had piled up.&lt;/p&gt;

&lt;p&gt;The fix is boring: retry a few times with a short wait.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;replaceFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renameSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;Atomics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Int32Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SharedArrayBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ~30 ms&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boring, but necessary. &lt;strong&gt;A status light you can't trust is just decoration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smaller one: after &lt;code&gt;/clear&lt;/code&gt;, the session continues under a new ID, so I briefly had two keys with the same name. Now the hook removes the old record when a session starts from a clear, and keeps an old-ID → new-ID map for the plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then a character moved in
&lt;/h2&gt;

&lt;p&gt;Colors alone felt a bit dry, so I drew a pixel-art chick into the keys. Her name is &lt;strong&gt;Aqui&lt;/strong&gt; (from Aquila, the eagle constellation).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working: juggling a ball&lt;/li&gt;
&lt;li&gt;Waiting for permission: holding up a "?"&lt;/li&gt;
&lt;li&gt;Done: a "!"&lt;/li&gt;
&lt;li&gt;Idle: eyes closed, "z"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the next key is also working, she passes the ball over. I wanted a box I &lt;em&gt;like&lt;/em&gt; looking at, not just another notification.&lt;/p&gt;

&lt;p&gt;That turned into a series of YouTube Shorts — over 20 episodes now. These days she rides around in a pixel-art WRX S4 through the seasons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shorts playlist: &lt;a href="https://www.youtube.com/playlist?list=PLOctjyutDnug" rel="noopener noreferrer"&gt;https://www.youtube.com/playlist?list=PLOctjyutDnug&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How it works (2:25, Japanese with visuals): &lt;a href="https://www.youtube.com/watch?v=m7cUQ3Owqv0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=m7cUQ3Owqv0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only do one thing
&lt;/h2&gt;

&lt;p&gt;Put &lt;strong&gt;"waiting for permission"&lt;/strong&gt; somewhere you'll see it. It doesn't need a Stream Deck — a colored corner of the screen or a sound works. For me, the time a session spent waiting on me was the least visible and the most wasted.&lt;/p&gt;

&lt;p&gt;I haven't measured how much time this saves, so I won't claim a number. What I can say is that I stopped hunting through windows.&lt;/p&gt;

&lt;p&gt;Japanese version (note): &lt;a href="https://note.com/modern_elk8749/n/n516084403556" rel="noopener noreferrer"&gt;https://note.com/modern_elk8749/n/n516084403556&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A personal project by a Claude Code fan. Not affiliated with Anthropic or Elgato.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Ask, Don't Just Read: Keeping Up With Code an AI Wrote</title>
      <dc:creator>Altair</dc:creator>
      <pubDate>Sat, 17 Oct 2026 07:46:22 +0000</pubDate>
      <link>https://dev.to/altair_alter/ask-dont-just-read-keeping-up-with-code-an-ai-wrote-4hdi</link>
      <guid>https://dev.to/altair_alter/ask-dont-just-read-keeping-up-with-code-an-ai-wrote-4hdi</guid>
      <description>&lt;p&gt;I'm the person in charge of digital transformation at a Japanese company. I build internal tools and workflow automations, and these days an AI coding agent (Claude Code) writes almost all of the code.&lt;/p&gt;

&lt;p&gt;I thought my problem was "code review can't keep up." When I looked closer, it was something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck wasn't review. It was understanding.
&lt;/h2&gt;

&lt;p&gt;To be honest, for most of this work I no longer read diffs line by line. What I was actually stuck on was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I couldn't tell whether the change did &lt;strong&gt;what I intended&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;I couldn't &lt;strong&gt;explain it to anyone else&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools that make diff review faster don't help if you've already stopped reading diffs. I needed a way to say "I understand this" without reading everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  It turns out everyone is hitting the same wall
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic's own Claude Code team has said the bottleneck has moved from writing code to reviewing it.&lt;/li&gt;
&lt;li&gt;Margaret-Anne Storey (2026) splits the problem into three kinds of debt: &lt;strong&gt;technical debt&lt;/strong&gt; in the code, &lt;strong&gt;cognitive debt&lt;/strong&gt; (the team's understanding erodes), and &lt;strong&gt;intent debt&lt;/strong&gt; (the reasons and constraints never get written down). It's a conceptual paper, not an experiment.&lt;/li&gt;
&lt;li&gt;In a 2026 survey in Japan, 86.3% of engineers who review AI-generated code said the burden had increased, and the top problem (49.5%) was "the submitter can't explain the code."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The study that changed how I approached it was Anthropic's randomized trial from January 2026. 52 mostly junior engineers learned a new library. The group using AI scored 50% on a comprehension quiz versus 67% for the hand-coding group, and &lt;strong&gt;the biggest gap was in debugging&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But the result depended on &lt;em&gt;how&lt;/em&gt; people used the AI. People who fully delegated to it scored under 40%. People who &lt;strong&gt;asked conceptual questions and fixed errors themselves&lt;/strong&gt; scored 65% or higher. (The authors are clear that this is correlation, not causation.)&lt;/p&gt;

&lt;p&gt;So maybe reading an AI's explanation isn't enough. Maybe what matters is &lt;strong&gt;the human asking the question&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now: an intent check
&lt;/h2&gt;

&lt;p&gt;Spec-driven development plus automated review is great for a big team, but it's too heavy for one person. I cut it down to four things.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Write the intent before building
&lt;/h3&gt;

&lt;p&gt;One line of purpose, then 3–5 success criteria in the form "when X, Y happens." The AI drafts them, I confirm. One round-trip.&lt;/p&gt;

&lt;p&gt;This is where mismatches between the goal and the approach show up — much cheaper than finding them afterward.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Judge the result with a table, not the diff
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Success criterion&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;…&lt;/td&gt;
&lt;td&gt;✓ / ✗ / unverified&lt;/td&gt;
&lt;td&gt;test run, actual output, screen, counted numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Evidence must come from &lt;strong&gt;actually running it&lt;/strong&gt;. "The code says so" doesn't count as ✓. The last row is always: "Do the comments and design notes still match what it does now?"&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Leave one or two questions — without answers
&lt;/h3&gt;

&lt;p&gt;Under the table, the AI writes one or two "questions worth asking to understand this better." &lt;strong&gt;It doesn't write the answers.&lt;/strong&gt; I decide whether to ask. If I don't, that's fine.&lt;/p&gt;

&lt;p&gt;If the study above is right, asking beats reading. This just leaves the door open.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep four lines for explaining it to others
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- What changed: (from the user's point of view)
- Why:
- How to check it:
- What it doesn't do:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These go into the design notes. The table is for &lt;em&gt;me&lt;/em&gt; to judge "did it do what I meant." These four lines are for explaining it to &lt;em&gt;someone else&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A one-line change, two surprises
&lt;/h2&gt;

&lt;p&gt;The first change I tried this on was a single line: keep 3 daily backups instead of 7. The goal was to free up disk space.&lt;/p&gt;

&lt;p&gt;The table showed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✓ It keeps the latest 3 plus one per week for 4 weeks.&lt;/li&gt;
&lt;li&gt;✗ &lt;strong&gt;It barely frees any space.&lt;/strong&gt; Old backups go to the Recycle Bin, so the disk space doesn't come back until the bin is emptied.&lt;/li&gt;
&lt;li&gt;✗ The comment at the top of the file still said "keep 7."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither problem was visible from the diff. They showed up &lt;strong&gt;because I wrote down the purpose first&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a replacement for automated code review. That finds defects; this finds gaps against intent.&lt;/li&gt;
&lt;li&gt;Not a replacement for having the actual users check the output against real data.&lt;/li&gt;
&lt;li&gt;When something is ✗, the AI doesn't quietly fix it. A human decides whether the intent or the implementation was wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I don't know yet
&lt;/h2&gt;

&lt;p&gt;I've only just started. To avoid judging it by how it &lt;em&gt;feels&lt;/em&gt;, I log four things each time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Number of ✗ results&lt;/li&gt;
&lt;li&gt;Time spent on the up-front back-and-forth&lt;/li&gt;
&lt;li&gt;Whether I asked the questions&lt;/li&gt;
&lt;li&gt;Later, when someone asked me about it, whether I could answer without asking the AI again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In one study, developers felt 20% faster with AI while actually being 19% slower (METR, 2025). I'll write a follow-up once I have a few months of data.&lt;/p&gt;

&lt;p&gt;As AI writes more of our code, the human job seems to be shifting from "read everything" to "decide what to trust." If so, the key to keeping our understanding might be &lt;strong&gt;not how much we read, but how often we ask&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, research on AI assistance and coding skill formation (Jan 2026): &lt;a href="https://www.anthropic.com/research/AI-assistance-coding-skills" rel="noopener noreferrer"&gt;https://www.anthropic.com/research/AI-assistance-coding-skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;METR, early-2025 AI and experienced open-source developer productivity (Jul 2025; marked out of date in Feb 2026): &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;M-A. Storey, From Technical Debt to Cognitive and Intent Debt (2026): &lt;a href="https://arxiv.org/abs/2603.22106" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2603.22106&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Survey on reviewing AI-generated code in Japan (&lt;a class="mentioned-user" href="https://dev.to/it"&gt;@it&lt;/a&gt;, Jun 2026, Japanese): &lt;a href="https://atmarkit.itmedia.co.jp/ait/articles/2606/16/news041.html" rel="noopener noreferrer"&gt;https://atmarkit.itmedia.co.jp/ait/articles/2606/16/news041.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>codereview</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
