<?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[AI-Native Engineer: Build with Agents]]></title><description><![CDATA[Weekly videos on shipping real software with AI agents. Configs, workflows, and breakdowns from a CTO using Claude Code and Codex in production]]></description><link>https://hjaveed.substack.com/s/build-with-agents</link><image><url>https://substackcdn.com/image/fetch/$s_!VGIl!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5e637a3-17ad-4aed-9c3b-c6e097a95392_1066x1066.png</url><title>AI-Native Engineer: Build with Agents</title><link>https://hjaveed.substack.com/s/build-with-agents</link></image><generator>Substack</generator><lastBuildDate>Tue, 21 Jul 2026 10:43:20 GMT</lastBuildDate><atom:link href="https://hjaveed.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Hadi Javeed]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[hjaveed@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[hjaveed@substack.com]]></itunes:email><itunes:name><![CDATA[Hadi Javeed]]></itunes:name></itunes:owner><itunes:author><![CDATA[Hadi Javeed]]></itunes:author><googleplay:owner><![CDATA[hjaveed@substack.com]]></googleplay:owner><googleplay:email><![CDATA[hjaveed@substack.com]]></googleplay:email><googleplay:author><![CDATA[Hadi Javeed]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[3. Fable 5 Without the Token Anxiety]]></title><description><![CDATA[Orchestrate with the big model, execute with cheap ones, and plan in artifacts instead of plan mode]]></description><link>https://hjaveed.substack.com/p/3-fable-5-without-the-token-anxiety</link><guid isPermaLink="false">https://hjaveed.substack.com/p/3-fable-5-without-the-token-anxiety</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Tue, 14 Jul 2026 19:27:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VGIl!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5e637a3-17ad-4aed-9c3b-c6e097a95392_1066x1066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Episode 3 of Build with Agents. Two things this time: the delegation setup that keeps my Fable 5 limits sane even when I am coding all day, and why I stopped using plan mode in favor of a living artifact.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;1d235e2c-75f8-48e1-9504-2fe53018cc66&quot;,&quot;duration&quot;:null}"></div><h2>The best model, and the hungriest</h2><p>We all felt it last December when Opus 4.5 launched. Everything you threw at it just felt right. It got your intent, it debugged well, it figured things out. And then no model gave me that feeling again, until Fable 5. This is a great time to be building.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The problem is Fable 5 consumes tokens aggressively. You live in constant token anxiety: &#8220;I am running out, I need more, this model is too good to stop using.&#8221; And I think Anthropic will eventually move it to API-based pricing. Who knows when, but it is coming.</p><p>So the question becomes: how do you keep this level of intelligence available without burning through tokens?</p><h2>Plan big, execute small</h2><p>I wrote the full thesis, the router-era argument and the economics, in <a href="https://hjaveed.substack.com/p/the-llm-router-era-starts-with-fable">The LLM Router Era Starts with Fable 5</a>. This episode is the practice.</p><p>Full write-up, the router-era thesis plus the skill to copy: <a href="https://hjaveed.substack.com/p/the-llm-router-era-starts-with-fable">here</a></p><h2>Stop using plan mode</h2><p>Second thing from the video. I truly believe plan mode was created because models were not good enough. Sitting in a loop of planning, planning, planning, reading long documents before anything happens, is counterintuitive now. At least it was for me.</p><p><a href="https://steipete.me/posts/just-talk-to-it">Peter Steinberger</a> made this argument way ahead of time in &#8220;Just Talk To It&#8221;: do not ceremonialize planning, talk to the agent like you would talk to a pair programmer and iterate with it. So I start in auto mode and just chat.</p><p>The iteration is fun, but sometimes you want to see things visually: the plan, the design decisions, the architecture. This is where Claude artifacts changed my workflow. Instead of downloading HTML files and reopening them over and over, I ask Claude to maintain a single artifact of everything it is doing: every design decision, every architectural call, all the implementation details. I keep it open in a browser tab, refresh it, and iterate on top of it.</p><p>It matters most at review time. Agents write code really fast, and I do not want to be the bottleneck, developer ego and all. The best way to review is end to end: queue it up, ask the agent to help you review, have it generate component diagrams in the artifact, and move through the code quickly instead of pretending you will read every line.</p><p>That is the episode. Fable 5 plans big, cheaper models execute small, and the plan lives in an artifact instead of plan mode. More videos coming. Thank you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[A Few Weekends with a Coding Agent Replaced My $30/Month Email App]]></title><description><![CDATA[A Cmd+K palette for Gmail, an extension that cannot read your mail, and why AI makes personal software possible again.]]></description><link>https://hjaveed.substack.com/p/a-few-weekends-with-a-coding-agent</link><guid isPermaLink="false">https://hjaveed.substack.com/p/a-few-weekends-with-a-coding-agent</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Wed, 08 Jul 2026 18:14:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bDgg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I used to be slow at email. Threads sat unread for days. Replies took a weekend of guilt. Archiving was something I did with a mouse, one click at a time.</p><p>Superhuman fixed that. It taught me that email is a keyboard problem. <code>c</code> to compose, <code>e</code> to archive, <code>j</code> and <code>k</code> to move, <code>Cmd+K</code> for everything else. Within a month I stopped treating my inbox as a place I visit and started treating it as a queue I clear.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So this is partly a thank-you note. Superhuman genuinely made me productive at email, and I paid $30 a month for years, happily.</p><p>But at some point I did an honest audit of what I was actually using. It came down to three things: the keyboard shortcuts, the Cmd+K palette, and split inbox.</p><p>Three features. $360 a year for muscle memory.</p><p>Then two things happened. Superhuman got acquired, and the pace slowed. They tried to make AI the story. Meanwhile Gmail quietly shipped the same AI natively: summaries, drafting, smart search, all free, and honestly better, because Google owns the data.</p><p>That is when it clicked: Superhuman&#8217;s moat was never going to be AI. The moat was feel. And feel is exactly the kind of thing you can own.</p><h2>The era of personalized software</h2><p>When I built <a href="https://hjaveed.substack.com/p/i-built-my-own-personal-finance-app">Fino, my personal finance app</a>, I wrote that AI makes small, personal software worth building again. Not generic SaaS with an AI button. Software you own, shaped around how you already work.</p><p>Email was the obvious next candidate. The muscle memory was already mine. The features should be too. When a coding agent can build and maintain a Chrome extension over a few weekends, the question stops being &#8220;which subscription do I renew&#8221; and becomes &#8220;which ten features do I actually use, and why don&#8217;t I own them?&#8221;</p><p>So I built <a href="https://github.com/hadijaveed/open-superhuman">Inbox Keys</a>. It is open source, free, and <a href="https://chromewebstore.google.com/detail/inbox-keys-gmail-command/bfcdnkjplofjddlecpojhpoomdialafa">on the Chrome Web Store</a>.</p><p><a href="https://www.youtube.com/watch?v=oyiEgL7-68s">&#9654; Watch the 2-minute demo</a></p><h2>The feel, kept</h2><p>Hit <code>Cmd+K</code> and every action is a fuzzy search away: compose, triage, jump to any folder, tab, or account. If you forget a shortcut, the palette is the shortcut.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bDgg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bDgg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bDgg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Inbox Keys command palette over Gmail&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Inbox Keys command palette over Gmail" title="The Inbox Keys command palette over Gmail" srcset="https://substackcdn.com/image/fetch/$s_!bDgg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!bDgg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac611b37-4d4e-4b94-bee6-139a431f4ad8_2560x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The hotkeys are the ones my hands already knew: <code>c</code> compose, <code>e</code> archive, <code>r</code> reply, <code>s</code> star, <code>h</code> snooze, <code>g i</code> for inbox, <code>g 1</code> through <code>g 8</code> to jump between Google accounts.</p><p>Split inbox is a tab bar over Gmail where each tab is any Gmail search: <code>in:inbox is:unread</code>, <code>label:Clients</code>, <code>from:boss@x.com</code>. <code>Tab</code> cycles through them. Gmail renders the lists itself, so it never breaks the way scraped inboxes do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1gNp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1gNp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1gNp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Split-inbox tabs over the Gmail thread list&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Split-inbox tabs over the Gmail thread list" title="Split-inbox tabs over the Gmail thread list" srcset="https://substackcdn.com/image/fetch/$s_!1gNp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!1gNp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4eab1e8-274a-494f-bbfc-ca52ccb98f73_2560x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And because this is personal software, nothing is sacred: every shortcut is remappable from a settings modal inside Gmail. Click a shortcut, press the new key, done.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vrjb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vrjb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vrjb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Remapping keyboard shortcuts inside Gmail&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Remapping keyboard shortcuts inside Gmail" title="Remapping keyboard shortcuts inside Gmail" srcset="https://substackcdn.com/image/fetch/$s_!Vrjb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!Vrjb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eaffc66-7c22-4ae8-a262-980bb9b970d1_2560x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>My calendar came along</h2><p>The feature I did not plan and now cannot live without: press <code>0</code> and Google Calendar opens beside Gmail for the account you are in. On the calendar, <code>Cmd+K</code> opens a layer palette that merges everything into one view: toggle or focus any calendar, switch accounts, add another Google account or an Outlook/iCal feed in a guided two-step flow.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QoxR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QoxR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QoxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The calendar layer palette: add accounts, Outlook feeds, and toggle calendars from the keyboard&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The calendar layer palette: add accounts, Outlook feeds, and toggle calendars from the keyboard" title="The calendar layer palette: add accounts, Outlook feeds, and toggle calendars from the keyboard" srcset="https://substackcdn.com/image/fetch/$s_!QoxR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 424w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 848w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!QoxR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1eecc20-dee6-43fe-a7a9-af660b5713a3_2560x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I run three Google accounts and one Outlook feed through it. One view, one keyboard.</p><h2>Nobody gets my email</h2><p>Here is where it gets fundamentally different from Superhuman, or any AI email startup.</p><p>Superhuman works by keeping a copy of your entire mailbox on their servers. Inbox Keys needs nothing. No Gmail API, no server, no AI, no analytics. The only permission it asks for is <code>storage</code>, for your settings, kept locally. It works by driving Gmail&#8217;s own UI, the same clicks you would make, just faster, so it never reads, sends, or stores a single email.</p><p>Even the screenshots in this post are the real extension running over a demo inbox, because pointing it at real mail for a screenshot felt wrong.</p><p>Gmail&#8217;s DOM is famously hostile to extensions, so the engineering leans defensive: navigation rides Gmail&#8217;s own URL router, every load-bearing selector lives in one registry with a built-in smoke check, and failures are loud instead of silent. When Gmail redesigns something, it is a one-minute fix, not a mystery.</p><h2>Try it</h2><p>Grab it from the <a href="https://chromewebstore.google.com/detail/inbox-keys-gmail-command/bfcdnkjplofjddlecpojhpoomdialafa">Chrome Web Store</a>. Works on Chrome, Edge, Brave, and Arc. Open Gmail, hit <code>Cmd+K</code>, and you are home.</p><p>Prefer to read the code first? <a href="https://github.com/hadijaveed/open-superhuman">Clone the repo</a> and load the <code>extension/</code> folder unpacked. Same thing the store ships, no build step.</p><h2>The bigger bet</h2><p>First money with Fino, now email with Inbox Keys. The pattern is the same: figure out which features you actually use, then own them.</p><p>Superhuman was a $30 a month lesson in what those features were. I am keeping the lesson and dropping the subscription.</p><p>That is the era of personalized software. It does not need to scale to millions of people. It needs to fit one life extremely well. For email, this is the version that fits mine.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The LLM Router Era Starts with Fable 5]]></title><description><![CDATA[Judgment stays expensive. Execution gets cheap. Fable 5 is the first glimpse of what that looks like]]></description><link>https://hjaveed.substack.com/p/the-llm-router-era-starts-with-fable</link><guid isPermaLink="false">https://hjaveed.substack.com/p/the-llm-router-era-starts-with-fable</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Tue, 07 Jul 2026 13:42:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mbxe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Fable 5 is the most incredible model I have used. Not a nicer version of the last one. Another level of increment in capability.</p><p>But that is not the part that stuck with me. After days of heavy use, the thing I keep noticing is not what Fable does. It is what Fable chooses not to do itself.</p><p>It delegates. And it is good at it. That is the first real glimpse of something I have been waiting for: the LLM router era. This post is the thesis and the playbook: why routing is about to become the default economics, and the exact skill I use to make Fable route work to cheaper models.</p><h2>What actually makes Fable different</h2><p>Benchmarks will not tell you this. What you feel in practice is judgment:</p><ul><li><p>It holds a long thread without drifting</p></li><li><p>It knows when a task deserves its full attention and when a cheaper model can grind through it</p></li><li><p>It verifies work instead of declaring victory</p></li></ul><p>That last one is the unlock. A model you can trust to check other models&#8217; work is a model you can put in charge.</p><h2>Your subscription is a loss leader</h2><p>Here is the uncomfortable math. Anthropic and OpenAI are subsidizing most of the model usage happening today. You are not paying what your tokens cost.</p><p>That does not last. I believe the next generation of best-in-class models will be metered by API usage. They will not live comfortably inside any subscription under $200. The frontier is getting too expensive to hand out flat-rate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mbxe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mbxe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mbxe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png&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;:null,&quot;alt&quot;:&quot;The subsidy runs out: subsidized era vs metered era&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The subsidy runs out: subsidized era vs metered era" title="The subsidy runs out: subsidized era vs metered era" srcset="https://substackcdn.com/image/fetch/$s_!mbxe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!mbxe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe566e3f-5d2c-4574-9c81-f9b94ba6e50c_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When that happens, &#8220;use the right model for the right task&#8221; stops being a power-user trick. It becomes the only economics that make sense. Paying frontier prices for grunt work will feel like hiring a staff engineer to rename variables.</p><p>Plenty of software factory products claim they have routing figured out already. I have not seen Devin, Droid, or any of the others truly nail it. The router was never going to be a traffic cop with a lookup table. It was always going to be the smartest model in the room. Fable is the first model with enough judgment to play that role.</p><p>So how do you actually run it that way? There is a name for the pattern.</p><h2>Plan big, execute small</h2><p>Anthropic published a recipe in their official <a href="https://github.com/anthropics/claude-cookbooks">Claude Cookbooks</a> called <a href="https://github.com/anthropics/claude-cookbooks/blob/main/managed_agents/CMA_plan_big_execute_small.ipynb">Plan big, execute small</a>, and it reframed how I think about cost. The expensive model is the coordinator. It plans, decomposes, verifies, and synthesizes. Everything token-heavy, reading files, searching code, trawling logs, fetching docs, gets fanned out to cheaper worker models running in parallel.</p><p>The counterintuitive part: the savings do not come from reading less. In the cookbook&#8217;s own measurements, the split team read roughly the same volume as a solo frontier agent but came out 2.5x cheaper and 3x faster, because 84-98% of the input tokens were billed at the worker rate.</p><p>It is rate arbitrage, not rationing:</p><p>ModelInput $/MOutput $/MRoleFable 5$10$50Coordinator: plan, decompose, verify, synthesizeOpus 4.8$5$25Worker for reasoning-heavy sub-tasksSonnet 5$3$15Default worker: reading, searching, transforms</p><p>Every token a Sonnet worker reads instead of Fable is a 3-5x saving on that token. And it compounds: whatever lands in the coordinator&#8217;s context gets re-sent on every subsequent turn.</p><p>In practice the pattern is four moves:</p><ol><li><p>Classify the work. Judgment stays with the coordinator: the approach, conflict resolution between reports, the final deliverable. Mechanical work gets delegated: anything where the procedure is clear and the cost is in volume.</p></li><li><p>Fan out in parallel. Spawn workers with an explicit cheap model, all at once, not one at a time.</p></li><li><p>Write real briefs. Workers know nothing you do not put in the prompt. Each brief needs one self-contained question, rigor instructions (cheap models default to shallow), a required evidence format like file:line references and quotes, and a size cap so reports do not flood the coordinator.</p></li><li><p>Synthesize at the top. Read only the reports, never re-read what workers already read. That pays the expensive rate twice and defeats the whole pattern.</p></li></ol><p>And the ways people screw it up, straight from the cookbook&#8217;s measurements:</p><ul><li><p>Over-sharding. Every worker pays a bootstrap cost. Twenty micro-briefs cost more than the solo agent. 3-6 meaty workers beat 20 tiny ones</p></li><li><p>Delegating judgment. Architecture decisions and final synthesis on a cheap model is saving money in the wrong place</p></li><li><p>Cutting rigor to cut cost. An agent that reads less is a worse product, not a cheaper equivalent. Keep the rigor, move it to the cheap rate</p></li></ul><h2>My setup right now</h2><p>Fable is the orchestrator. It holds the plan, the context, and the taste. Everything else is a worker:</p><ul><li><p>Codex (gpt-5.5) for well spec&#8217;d execution, computer use, and UI/UX verification. It is still WAY better at driving a browser and checking visual work</p></li><li><p>Opus 4.8 or Sonnet 5 for focused implementation forks, reviews, and all the mechanical reading</p></li><li><p>Kimi 2.7 or GLM 5.2 if you are running an open source setup</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9PtM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9PtM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9PtM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png&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;:null,&quot;alt&quot;:&quot;One brain, many hands: Fable orchestrates, cheaper models execute&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="One brain, many hands: Fable orchestrates, cheaper models execute" title="One brain, many hands: Fable orchestrates, cheaper models execute" srcset="https://substackcdn.com/image/fetch/$s_!9PtM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!9PtM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dfa9716-556e-4a7b-b9e7-0ce3ce1fda06_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://x.com/theo">Theo</a> has been minmaxing exactly this, and his CLAUDE.md is the best concrete version I have seen. He scores every model on cost, intelligence, and taste, then routes accordingly: bulk mechanical work to gpt-5.5 because it is effectively free on his plan, anything user-facing to models with taste, reviews to Fable or Opus.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DeOI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DeOI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 424w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 848w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 1272w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DeOI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png" width="1456" height="1273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1273,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Theo's model routing CLAUDE.md&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Theo's model routing CLAUDE.md" title="Theo's model routing CLAUDE.md" srcset="https://substackcdn.com/image/fetch/$s_!DeOI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 424w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 848w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 1272w, https://substackcdn.com/image/fetch/$s_!DeOI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F144ca7e0-69fa-4a50-a931-56a7f16a0bbd_1600x1399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The result, in his words: he was throwing away about 50% of his end-to-end agent-driven PRs before this workflow. After it, he did not close a single one. Read his <a href="https://x.com/theo">strategy post</a>.</p><p>My favorite rule from his setup: the rankings are defaults, not limits. If a cheaper model&#8217;s output misses the bar, escalate without asking. Judge the output, not the price tag. Escalating costs less than shipping mediocre work.</p><h2>Steal the skill</h2><p>Everything above is encoded in one Claude Code skill I use daily, built directly on Anthropic&#8217;s <a href="https://github.com/anthropics/claude-cookbooks/blob/main/managed_agents/CMA_plan_big_execute_small.ipynb">Plan big, execute small cookbook recipe</a>. To install it globally so it works in every project:</p><pre><code><code>mkdir -p ~/.claude/skills/plan-big-execute-small
</code></code></pre><p>Then save the markdown below as <code>~/.claude/skills/plan-big-execute-small/SKILL.md</code>. For a single repo, put it in <code>.claude/skills/plan-big-execute-small/SKILL.md</code> at the project root instead. And if you do not want a skill at all, paste the body straight into your global <code>~/.claude/CLAUDE.md</code> or the project&#8217;s <code>CLAUDE.md</code> and it works as standing instructions.</p><p>Trigger it with <code>/pbes</code> or just say &#8220;do this cheaply&#8221;. It also kicks in on its own when a task involves pulling large volumes of content through the model.</p><pre><code><code>---
name: plan-big-execute-small
description: Cost-saving delegation harness based on Anthropic's "plan big, execute small" cookbook. Keep planning, judgment, and synthesis on the expensive main model (Fable); fan out mechanical token-heavy work (bulk file reads, code searches, web research, log trawls, per-item transforms, doc summarization) to Opus 4.8 subagents (default worker tier; Sonnet 5 allowed for rote volume, NEVER Haiku &#8212; quality floor set by Hadi). Also treat OpenAI Codex (gpt-5.6-sol, xhigh reasoning, via `codex exec`) as a peer work-agent for backend implementation, deep debugging, web research, and cross-vendor second opinions &#8212; it bills to the OpenAI plan, not Claude tokens. NO worktrees ever: all work happens in the main checkout, one writer at a time. Trigger when the user says "/pbes", "do this cheaply", "save tokens", "frugal mode", "delegate to codex", or when a task involves pulling large volumes of content (many files, many web pages, long logs) through the model.
---

# Plan Big, Execute Small

You (the main loop, running an expensive frontier model) are the **coordinator**. Your tokens cost 3&#8211;10x more than a subagent's. The single biggest cost driver in agentic work is *mechanical reading* &#8212; files, web pages, logs, search results pulled into context. Move that reading onto cheaper workers; keep only planning, judgment, and synthesis here.

**Key insight from the cookbook:** the savings come from **rate arbitrage, not reading less**. Both approaches read roughly the same volume &#8212; the split team was 2.5x cheaper and 3x faster because 84&#8211;98% of input tokens were billed at the worker rate, and workers ran in parallel. Do NOT respond to cost pressure by skimping on rigor; respond by changing *who* reads.

## Standing rules (Hadi's preferences)

- **NO worktrees, ever.** Not for you, not for Codex, not for subagents. All work happens in the main checkout, main thread. Worktrees are confusing &#8212; never call EnterWorktree, never pass `isolation: 'worktree'`, never `-C` Codex into a worktree.
- **One writer at a time** (this replaces worktree isolation): never let two things edit files simultaneously. When Codex implements, you don't touch files until it's done. When you implement, Codex runs read-only (`-s read-only`). Investigation subagents are read-only by nature &#8212; always safe in parallel.
- **Quality floor: never Haiku workers.** Opus 4.8 is the default worker tier; Sonnet 5 is allowed for truly rote high-volume reading.
- Hadi commits himself &#8212; don't commit unless he asks.

## Rate table (why this works)

| Model | Input $/M | Output $/M | Role |
|---|---|---|---|
| Fable 5 | $10 | $50 | Coordinator: plan, decompose, verify, synthesize, review every diff |
| Opus 4.8 | $5 | $25 | **Default worker**: reading, searching, web research, transforms, debugging |
| Sonnet 5 | $3 ($2 intro) | $15 ($10 intro) | Optional tier for truly rote volume reading |
| Codex gpt-5.6-sol xhigh | bills to OpenAI plan | ~$0 Claude tokens | **Peer work-agent**: backend implementation, deep debugging, web research, second opinions |

Every token a worker reads instead of you is a 2&#8211;5x saving on that token (or ~free, for Codex). It also keeps your own transcript small, which compounds: your context is re-sent (cache-read billed) on every subsequent turn.

## Step 1 &#8212; Classify the work

Before acting, split the task into:

- **Judgment work** (stays here): understanding the ask, decomposing into sub-questions, deciding the approach, resolving conflicts between worker reports, verifying suspicious findings, reviewing diffs, writing the final deliverable.
- **Mechanical volume** (&#8594; Opus subagents): anything where the *procedure* is clear and the cost is in volume &#8212; read N files and report X, search the web for Y and return evidence, trawl logs for pattern Z, apply the same transform to each item, summarize each document.
- **Deep self-contained units** (&#8594; Codex): one gnarly, well-specifiable problem &#8212; implement a backend module/endpoint/migration, root-cause a hard bug, a meaty research question, a design second opinion. Quality work, not volume work.

If the whole task is mechanical and small (one grep, one file read), just do it &#8212; delegation has a floor (see anti-patterns).

## Step 2 &#8212; Fan out with the Agent tool

Spawn workers with an explicit `model`, in parallel (one message, multiple Agent calls), in the background:

- `subagent_type: "Explore"` + `model: "opus"` &#8212; codebase searches and file-location sweeps.
- `subagent_type: "general-purpose"` + `model: "opus"` &#8212; web research, multi-file reading, per-item transforms, debugging.
- **Opus 4.8 is the default worker tier.** Drop to `model: "sonnet"` only for truly rote high-volume reading where reasoning doesn't matter. Never `model: "haiku"` (quality floor); never spawn `fable` workers (no arbitrage).

For large structured fan-outs (10+ items, multi-stage, verify passes) &#8212; and only when the user has opted into multi-agent orchestration &#8212; use the Workflow tool instead, with per-agent overrides: `agent(prompt, {model: 'opus'})` for worker stages; leave `model` unset (inherit) only for the final judge/synthesis stage. Never pass `isolation: 'worktree'`.

## Step 2b &#8212; Collaborate with Codex (peer work-agent)

OpenAI Codex CLI is installed and authenticated (`codex` on PATH, default model gpt-5.6-sol at xhigh reasoning). It's a **peer, not a subordinate**: strong at backend implementation, deep debugging, web research, and algorithmic work. It bills to Hadi's OpenAI plan &#8212; a Codex delegation costs ~zero Claude tokens (just your brief and its report).

**Invocation** (always via Bash, always `run_in_background: true` &#8212; xhigh takes minutes):

```bash
codex exec --skip-git-repo-check \
&nbsp;&nbsp;-o /path/to/tmp/codex-report.md \&nbsp;&nbsp; # final report &#8594; file; read ONLY that file
&nbsp;&nbsp;-s read-only \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # include whenever it must not edit files
&nbsp;&nbsp;"&lt;self-contained brief&gt;" &lt;/dev/null
```

- `-o` / `--output-last-message` keeps its report out of your context until you choose to read it.
- `--output-schema schema.json` when you need structured JSON back.
- `-s read-only` for review/research/consult briefs; omit (workspace-write) only when Codex is the designated writer.
- It works in the **main checkout** (no worktrees) &#8212; which is why the one-writer rule above is load-bearing.
- Briefs follow the same discipline as Step 3: Codex sees nothing of your conversation, has no access to Claude-side MCP tools (Linear, Slack, byaan, fino&#8230;), so the brief must carry the full spec, constraints, file paths, and acceptance criteria.

**Collaboration patterns:**

1. **Backend implementer** &#8212; you write the spec + acceptance criteria into the brief; Codex implements in the main checkout (you hands-off files meanwhile); you review with `git diff` and run verification. Hadi commits.
2. **Cross-vendor reviewer** &#8212; you implement, Codex reviews read-only (`codex exec review` inside a repo, or a "try to refute this diff" brief). Different model families catch different bugs.
3. **Research peer** &#8212; for meaty questions, fire Codex AND an Opus subagent on the same question in parallel, then triangulate. Two independent takes beat one.
4. **xhigh consultant** &#8212; gnarly bug or design decision: pack the evidence into a brief, let it reason deeply, judge its answer against your own read.

## Step 3 &#8212; Write worker briefs correctly

Workers know NOTHING you don't put in the prompt &#8212; not the conversation, not your plan, not the other workers' briefs. From the cookbook: "Everything the coordinator believes about its workers comes from its own system prompt." (This applies doubly to Codex, which is a different vendor entirely.)

Each brief must contain:
1. **One focused sub-question** &#8212; self-contained, no references to "the task above".
2. **Rigor instructions** &#8212; "try multiple query phrasings / search patterns, follow promising leads, cross-check across sources." Workers default to shallow; the brief supplies the rigor.
3. **An evidence-bearing report format** &#8212; require `file:line` references, URLs, verbatim quotes, exact values. You will verify from evidence, not by re-reading the sources yourself. Ask for structured findings (a list of facts + evidence), NOT polished prose.
4. **A size cap** &#8212; "report at most N findings / keep the report under ~500 words" so worker output doesn't flood your context.

## Step 4 &#8212; Synthesize and verify here

- Read only the reports. Do not re-read what workers already read &#8212; that pays the expensive rate twice and defeats the pattern.
- Review every diff (yours or Codex's) at the expensive rate &#8212; but only the diff, not the whole tree.
- Spot-check: if a finding is load-bearing and the evidence looks thin, send ONE targeted verification (a single file read, a cheap verify-subagent with a refute-this brief, or a read-only Codex cross-check) rather than redoing the sweep.
- Conflicting reports &#8594; resolve with judgment here, or spawn one tie-breaker worker with both claims and their evidence.

## Anti-patterns (from the cookbook's measurements)

- **Over-sharding.** Delegation has a floor: each worker pays a bootstrap cost (system prompt + brief + report). Narrowly-scoped micro-briefs *increased* total cost in the cookbook's tests. A brief should represent at least several tool calls' worth of mechanical work. 3&#8211;6 meaty workers beat 20 tiny ones.
- **Delegating judgment.** Final synthesis, architecture decisions, security-sensitive conclusions, diff review, and anything needing the full conversation context stay on the main model. That's what the expensive tokens are *for*.
- **Two writers at once.** You and Codex (or any two writers) editing the same checkout simultaneously &#8212; there is no worktree isolation, so sequence it or make one side read-only.
- **Using Codex for volume.** Codex xhigh is slow and deep &#8212; wrong tool for "read these 40 files" (that's an Opus subagent's job); right tool for one hard, self-contained problem.
- **Prose reports.** Workers returning essays waste their output tokens and your input tokens. Demand structured findings + evidence.
- **Cutting rigor to cut cost.** A solo agent that "reads less" is a lower-rigor product, not a cheaper equivalent. Keep the rigor; move it to the cheap rate.
- **Doing the sweep yourself first "to understand it".** Scout minimally (list files, scope the diff &#8212; cheap), then delegate the heavy reading. Don't pull 50 files into your own context and then also spawn workers.

## Cheap-by-default habits (apply even without fan-out)

- Noisy investigation (grep sweeps, log trawls, broad search) &#8594; always a subagent; keep only the conclusion in the main transcript.
- Long web pages / docs &#8594; an `opus` worker fetches and distills; you read the distillation.
- A meaty self-contained question with no urgency &#8594; consider firing a background Codex run in parallel with your own work; its answer costs no Claude tokens.
- When the user asks for a quick answer, answer directly &#8212; this skill is for volume, not for adding ceremony to small tasks.

</code></code></pre><h2>Add loops and it compounds</h2><p>Routing decides who does the work. Loops decide when it happens. I wrote about this in <a href="https://hjaveed.substack.com/p/agent-workflows-and-loops">Agent Workflows &amp; Loops</a>, and Anthropic just published a solid primer on <a href="https://x.com/ClaudeDevs/status/2074208949205881033">getting started with loops</a>.</p><p>Put the two together and you get the shape I think this job is settling into:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8fKL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8fKL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8fKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png&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;:null,&quot;alt&quot;:&quot;Judgment stays expensive, execution gets cheap: orchestrator, routing, and loops&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Judgment stays expensive, execution gets cheap: orchestrator, routing, and loops" title="Judgment stays expensive, execution gets cheap: orchestrator, routing, and loops" srcset="https://substackcdn.com/image/fetch/$s_!8fKL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!8fKL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cf6ffb8-49c6-4e27-956b-9e82e4545d26_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The orchestrator keeps the context warm. Cheap models grind through the passes. Loops keep everything moving while you sleep. Your attention goes to product calls and the weird edge cases, not to being the cron job for your own codebase.</p><h2>The new shape of the job</h2><p>Fable is the first model where delegation feels less like a workaround and more like the architecture. The frontier model becomes the staff engineer you pay a premium for, managing a team of cheaper, faster, good-enough models.</p><p>Judgment stays expensive and centralized. Execution gets cheap and distributed. That is the LLM router era, and we are just getting the first glimpse of it.</p><p>It is also the most fun I have had building in years.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://hjaveed.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[2. Agent Workflows & Loops]]></title><description><![CDATA[The model writes the code. The loops handle everything after the merge]]></description><link>https://hjaveed.substack.com/p/agent-workflows-and-loops</link><guid isPermaLink="false">https://hjaveed.substack.com/p/agent-workflows-and-loops</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Tue, 30 Jun 2026 13:53:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5pL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Episode 1 was about using agents to ship faster. Episode 2 is about the part agents still have not solved: production follow-through.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;05e34956-b120-4da6-b76f-497bd24e5a4b&quot;,&quot;duration&quot;:null}"></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>Writing code by hand is mostly automated now. Shipping to production is not, and shipping means more than getting a PR merged. It is testing the feature live, telling your team and your customers how it works, watching logs and analytics for a few days, and iterating on what you learn. Loops are what finally help with that.</p><p>A workflow is not just a clever prompt. It is the shape around the agent. What does it read? What does it ignore? When does it fork? When does it stop? When does it wake you up?</p><p>That is the difference between a useful long running agent and an expensive tab that slowly drifts away from reality.</p><p>People have been talking about loops a lot recently. I think that is the right conversation. The model matters, but the loop matters more than people want to admit.</p><p>A good loop lets an agent start from the source of truth again and again. It reads the plan, checks the repo, checks the PR, checks production signals, compares what changed, then decides whether anything needs attention.</p><p>The goal is not to make an agent that never stops. The goal is to make an agent that knows how to stop, sleep, wake up, and re-enter the work with context.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5pL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5pL2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5pL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png&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;:120628,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hjaveed.substack.com/i/204274009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.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_!5pL2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!5pL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034e4585-1fb6-4c21-a8ad-b13d74ee1e4f_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>The long running orchestrator</h2><p>The simplest useful loop looks like this:</p><ol><li><p>read the plan</p></li><li><p>read the current code</p></li><li><p>read the latest external signal</p></li><li><p>decide if the signal is new or important</p></li><li><p>act only if there is a focused next step</p></li><li><p>verify the result</p></li><li><p>write down what changed</p></li><li><p>stop</p></li></ol><p>That last step matters. A loop that does not know how to stop becomes a bug factory.</p><p>I like to think of the orchestrator as a staff engineer that keeps the context warm. It is not always coding. Most of the time it is watching, comparing, and deciding whether something deserves a focused fork.</p><p>Over time this thread becomes your PRD. It carries the research, the tool calls, and the decisions, so you never have to re-explain how you got here. You can start a fresh session, but then you are handing over all of that intent by hand.</p><p>The orchestrator should be able to start over from clean inputs:</p><ul><li><p>the PRD or plan</p></li><li><p>the current branch</p></li><li><p>the open PR</p></li><li><p>logs and errors</p></li><li><p>user feedback</p></li><li><p>previous decisions</p></li><li><p>the checklist for what good looks like</p></li></ul><p>Then it asks one question: did anything change enough that we should act?</p><h2>Breadth first, then depth first</h2><p>When I start a new feature, I still like breadth first. I want the agent to explore the codebase, read neighboring patterns, understand the product surface, and find the risky edges.</p><p>Breadth first is for context.</p><p>Depth first is for changing code.</p><p>If you mix those up, the agent gets lost. It starts solving a local problem before it understands the shape of the system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tC2E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tC2E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tC2E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad2c1956-eb6e-406f-a632-489207007492_1600x900.png&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;:119234,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hjaveed.substack.com/i/204274009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.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_!tC2E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!tC2E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad2c1956-eb6e-406f-a632-489207007492_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>My preferred pattern is:</p><ol><li><p>use the orchestrator to map the system</p></li><li><p>ask it to write a real plan</p></li><li><p>pick the riskiest slice</p></li><li><p>fork a focused agent into that slice</p></li><li><p>stay in the thread for product and architecture calls</p></li><li><p>bring the result back to the orchestrator</p></li></ol><p>The fork is not the boss. The orchestrator is the boss.</p><p>The fork is a focused engineer. It should be deep in one slice: the API boundary, the UI state machine, the data layer, the test harness, or whatever needs real attention.</p><p>The orchestrator stays responsible for whether the whole system still makes sense.</p><h2>The PR workflow loop</h2><p>The first loop I want for almost every serious feature is the PR loop.</p><p>I do not want to babysit a PR. Waiting on CI and on review comments, from a human or from a coding agent like Codex, Claude, or Greptile, can burn fifteen or twenty minutes a pass, and shepherding one PR across a day can eat hours. I want an agent to keep checking the same boring things until the PR is either mergeable or blocked by a human decision.</p><p>A useful <code>/pr workflow loop</code> reads:</p><ul><li><p>the branch diff</p></li><li><p>the original plan</p></li><li><p>failing checks</p></li><li><p>reviewer comments</p></li><li><p>unresolved threads</p></li><li><p>test output</p></li><li><p>files touched since the last pass</p></li></ul><p>Then it does the smallest safe next step.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P7Be!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P7Be!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P7Be!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png&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;:104515,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hjaveed.substack.com/i/204274009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.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_!P7Be!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!P7Be!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F324a7f6b-eba4-47f4-985f-5f2cc127cefc_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The PR loop should not rewrite the feature every time it wakes up. That is how you get churn.</p><p>It should be boring:</p><pre><code><code>Read the PR.
Read the plan.
Read CI and review comments.
Fix only the root cause of the current failure.
Run the relevant checks.
Leave a short summary.
Ping me in Slack when it needs my eyes.
Stop if blocked.
</code></code></pre><p>The best PR loop feels like a careful senior engineer doing follow-through. It does not need applause. It just keeps the branch from getting stale.</p><h2>Production loops</h2><p>After the feature ships, the loop changes.</p><p>Now I care less about implementation momentum and more about signal quality. I want the agent to watch production without inventing work.</p><p>These are the loops I care about:</p><ul><li><p><code>/sentry loop</code> every 4 hours: check for new user impacting errors</p></li><li><p><code>/cloudwatch loop</code>: check for new log spikes or unexpected failures</p></li><li><p><code>/data skills improvement loop</code>: check if the agent made repeated data mistakes and update the skill or checklist</p></li><li><p><code>/pr workflow loop</code>: keep open work moving without me babysitting it</p></li></ul><p>That is enough.</p><p>The dangerous version is when every loop creates another loop. I do not want recursive busywork. I want a small number of boring loops with clear stop conditions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YSPI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YSPI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YSPI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png&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;:140802,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://hjaveed.substack.com/i/204274009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.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_!YSPI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!YSPI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1c04f8e-7a98-489f-909d-882bf883002a_1600x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>For production loops, the rule is simple:</p><pre><code><code>If it is new and user impacting, escalate.
If it is old noise, write it down and sleep.
If it needs code, create a focused task.
If it needs judgment, wake me up.
</code></code></pre><p>The loop should compare against the previous run. Otherwise every wake-up looks urgent.</p><p>None of this is hands off. You are still babysitting these loops, only now at a higher level, fixing what matters instead of refreshing dashboards all day.</p><h2>The data skills improvement loop</h2><p>This one is underrated.</p><p>Agents make mistakes for two reasons. Sometimes the model fails. Sometimes the loop failed to teach the agent what good looks like.</p><p>If I ask an agent to do data work and it repeatedly makes the same mistake, I do not want to just fix the query. I want to improve the skill, checklist, or harness so the next agent is less likely to repeat it.</p><p>That loop looks like this:</p><ol><li><p>inspect the mistake</p></li><li><p>decide whether it is a one-off or a repeated pattern</p></li><li><p>update the skill, prompt, test, or validation script</p></li><li><p>run the workflow again</p></li><li><p>record what changed</p></li></ol><p>This is how the system gets better over time. Not because the model magically learned from one chat, but because the surrounding workflow got stricter.</p><h2>What I want from loops</h2><p>I want loops that are boring, auditable, and small.</p><p>A loop should have:</p><ul><li><p>a source of truth</p></li><li><p>a wake-up schedule</p></li><li><p>a narrow job</p></li><li><p>a comparison against the previous run</p></li><li><p>a stop condition</p></li><li><p>an escalation rule</p></li><li><p>a place to write the result</p></li></ul><p>If one of those is missing, the loop will probably drift.</p><p>The biggest mistake is giving the loop too much agency too early. Do not start with &#8220;go fix production.&#8221; Start with &#8220;tell me what changed since last time and whether it matters.&#8221;</p><p>Then let the orchestrator decide if a focused fork should exist.</p><h2>The actual pattern</h2><p>The pattern I keep coming back to is simple:</p><pre><code><code>orchestrator maps the system
focused fork changes one slice
orchestrator vets the integration
loops watch the world after shipping
human makes the product calls
</code></code></pre><p>That is it.</p><p>The loop is not there to replace taste. It is there to keep attention on the right things.</p><p>I still want to make the product and architecture decisions. I still want to talk to users. I still want to read the weird errors. But I do not want to be the cron job for my own codebase.</p><p>That is what agent workflows are really becoming for me: not a giant swarm, not a fully autonomous company, just a set of loops that keep the work alive without losing the thread.</p><p>Have fun building.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[1. Your Claude + Codex Setup, and Why You Shouldn't Fear the CLI]]></title><description><![CDATA[Why I drive every coding agent from the CLI, and the exact terminal, aliases, and settings that make it fast.]]></description><link>https://hjaveed.substack.com/p/1-your-claude-codex-setup-and-why</link><guid isPermaLink="false">https://hjaveed.substack.com/p/1-your-claude-codex-setup-and-why</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Tue, 23 Jun 2026 14:13:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VGIl!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5e637a3-17ad-4aed-9c3b-c6e097a95392_1066x1066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is the first episode of Build with Agents, where I record my coding agent setup, the ergonomics and developer tools I have wired up locally to stay productive. I will keep these short and ship them often, because my setup keeps changing and I would rather share what I have now than wait for it to be perfect.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;fc88c743-67d0-48f4-84bd-030223e9af7e&quot;,&quot;duration&quot;:null}"></div><h2>Why the CLI, and why you shouldn&#8217;t fear it</h2><p>I am a CLI-first user. Not to look cool, but because I genuinely think the terminal is the best surface for this kind of work. Coding agents are fundamentally simple: a loop inside a harness, a long-running prompt with a bunch of tools. They do not need to be complicated.</p><p>The real reason is that I keep flip-flopping between Claude Code, Codex, and even <a href="https://opencode.ai/">opencode</a> with the GLM model, because not everything needs Claude-level intelligence. The question becomes: what is the one common surface where I can trigger all of these? VS Code is one option. But the terminal, split into a few panes, is better. These days you are not writing much code by hand. Your job is to generate it and review it as fast as you can, and the CLI is where that workflow lives.</p><p></p><h2>Recommended terminal: Ghostty</h2><p>If you are on Mac or Linux, download <a href="https://ghostty.org/">Ghostty</a>. It is a GPU-accelerated terminal emulator that renders beautifully and has great defaults out of the box. On Windows it is not available yet. Please do not use the default macOS Terminal, it is not great.</p><p>If you want alternatives that also support GPU rendering, look at <a href="https://alacritty.org/">Alacritty</a> or <a href="https://wezterm.org/">WezTerm</a>.</p><p>A few Ghostty commands worth memorizing:</p><ul><li><p><code>cmd+d</code> to split right</p></li><li><p><code>cmd+t</code> to create a new tab</p></li><li><p><code>cmd+shift+enter</code> to zoom the current split to fullscreen (hit it again to come back)</p></li><li><p><code>cmd+shift+p</code> to open the command palette, then type <code>split</code>, <code>tab</code>, or <code>rename</code> to find everything else</p></li></ul><p>I usually run three splits so I can drive agents in parallel: one Claude Code instance, one Codex, and a pane for reviewing code.</p><h2>Shell aliases for your agents</h2><p>Spin up agents faster with a few aliases. Depending on your shell, add these to <code>~/.zshrc</code>, <code>~/.bashrc</code>, or your profile:</p><pre><code><code>alias cc="claude --permission-mode auto" # Claude Code in auto mode
alias co="codex"                         # Codex
alias cca="claude agents"                # the parallel Claude Agents UI
</code></code></pre><p>Notice that <code>cc</code> always spins up in auto mode. Clicking approve on every single command is what kills your flow, so I let the agent run on its own. The reason I am comfortable with it is the sandbox in my settings.json (next section): it blocks agents from reading secrets and limits what they can touch, so auto permissions become a productivity win instead of a footgun. Auto mode plus a sandbox, never auto mode alone.</p><h2>Running agents in parallel, and from your phone</h2><p>The <code>cca</code> UI (Claude Agents) is where most of my knowledge work happens: reading email, scanning Slack, planning features, running my personal finance and task loops. It lets you run multiple threads in parallel over a directory, pin the ones you care about, and background the rest. Hit <code>?</code> inside it for the full list of keyboard shortcuts, and <code>ctrl+s</code> to cycle between the session view, the directory view, and the needs-input view.</p><p>A few habits that make this work:</p><ul><li><p>Name your sessions. Use the rename command and give each one a clear label like <code>build-with-agents</code> or <code>backend-implementation</code>. Names persist locally, so you can recognize them both here and on your phone.</p></li><li><p>Branch instead of starting cold. Run a long-lived orchestration thread where you plan, then <code>/branch</code> from it into a focused session. The handoff is natural because all the planning context comes along. It is breadth-first when you start a feature, then depth-first once you go heads-down on one piece. Use <code>/resume</code> to find a session by name.</p></li><li><p>Loop the recurring stuff. <code>/loop</code> runs a session on a schedule, so my daily task review and email reader just fire every day at 5 without me touching them.</p></li><li><p>Background with <code>/bg</code> to move a thread out of the way while it keeps working.</p></li></ul><p>Turn on remote control and every session shows up on your phone and the web. I never expected to be planning and steering work from my phone against my always-on Mac mini, but it is genuinely useful. You can set it once in your settings.json so you do not have to enable it per session.</p><h2>A secure Claude settings.json</h2><p>This one matters. You do not want Claude going rogue, reading your <code>.env</code> files, and exfiltrating secrets. I wrote a separate post on why that is dangerous and how it can be exploited, so a setup that gives you peace of mind is worth it. The key piece is the sandbox setting.</p><p>You can grab mine here and adapt it:</p><p><a href="https://github.com/hadijaveed/build-with-agents/blob/main/config/claude/settings.json">github.com/hadijaveed/build-with-agents/config/claude/settings.json</a></p><p>A few of the defaults in there:</p><ul><li><p>A sandbox so agents cannot read sensitive files</p></li><li><p>Default effort level and remote control enabled for every session</p></li><li><p>Error reporting to Sentry turned off</p></li><li><p>Auto-compact at a sane token size, because the one-million-context window never worked well for me</p></li><li><p>Voice input enabled (I use Wispr Flow, but long-pressing space in Claude works well too)</p></li></ul><h2>Code review tools: LazyGit, hunk, and lumen</h2><p>Since you are not typing most of the code, reviewing fast is the whole game. I will do a proper deep dive on review workflow in a later episode, but set these up now.</p><p><a href="https://github.com/jesseduffield/lazygit">LazyGit</a> is an excellent terminal UI for git and the hub I review from. Then two tools that plug into it:</p><ul><li><p><a href="https://github.com/modem-dev/hunk">hunk</a>, a review-first terminal diff viewer built for agent-authored changes. Install with <code>npm i -g hunkdiff</code>.</p></li><li><p><a href="https://github.com/jnsahaj/lumen">lumen</a> for great diff summaries. Install with <code>brew install lumen</code>.</p></li></ul><p>My LazyGit config, including the custom keybindings below, is here:</p><p><a href="https://github.com/hadijaveed/build-with-agents/blob/main/config/lazygit.yml">github.com/hadijaveed/build-with-agents/config/lazygit.yml</a></p><p>With that config, inside LazyGit:</p><ul><li><p>Press <code>shift+D</code> on any file to open it in the hunk diff view</p></li><li><p>Press <code>shift+L</code> to see it in the lumen view</p></li></ul><p>Both serve their own purpose, one for line-level review, one for a higher-level summary.</p><h2>Next up</h2><p>Effective ways to review code when you can no longer read every line, plus more of the CLI primitives I lean on. See you in the next one.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Build with Agents]]></title><description><![CDATA[A weekly series on building real software with AI agents. Whether you write code for a living or you are just getting started. From a CTO who still ships code every day.]]></description><link>https://hjaveed.substack.com/p/build-with-agents</link><guid isPermaLink="false">https://hjaveed.substack.com/p/build-with-agents</guid><dc:creator><![CDATA[Hadi Javeed]]></dc:creator><pubDate>Tue, 16 Jun 2026 14:11:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VGIl!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5e637a3-17ad-4aed-9c3b-c6e097a95392_1066x1066.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;609820fc-572d-407b-9b6e-3b5d10839a1d&quot;,&quot;duration&quot;:null}"></div><p></p><p>I&#8217;m Hadi, CTO/Co-Founder at RevelAI Health. I still write tons of code. I am a software engineer at heart, and I spend part of almost every day experimenting with AI agents in a real production codebase. Claude Code and Codex, real constraints, regulated healthcare.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Build with Agents is where I share what actually works and what does not. With my team first, and now with you.</p><p>One thing before you scroll. This is not just for engineers. I genuinely believe we are about to have a lot more software builders in the world, not fewer. The tools finally let anyone turn an idea into working software. You do not need a computer science degree. You need the basics, a little patience, and someone showing you the real workflow instead of a polished demo. If that is you, you are exactly who I am writing for.</p><p>And it is not another demo channel. Most agent content is vibe-coding clips that fall apart the moment real code shows up. This is the workflow behind the demo, messy parts included. Every episode ships one concrete thing you can use this week: a config, a prompt, a slash command, a real diff.</p><p>Following is the programming of the videos/content, but I might change it as I learn more through the feedback:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;31d3b52b-28b1-481c-96c5-50ba8e9eea75&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">episodes/
&#9500;&#9472;&#9472; episode-1/  Your Claude + Codex Setup, and Why You Shouldn't Fear the CLI
&#9474;   &#9500;&#9472;&#9472; Your Claude + Codex setup, and why you shouldn't fear the CLI
&#9474;   &#9500;&#9472;&#9472; CLAUDE.md is the most important file in your repo
&#9474;   &#9492;&#9472;&#9472; CLI mastery: sessions, resume, parallel runs (and why worktree fails me)
&#9474;
&#9500;&#9472;&#9472; episode-2/  Agent Workflows and Loops
&#9474;   &#9500;&#9472;&#9472; Code reviews are the highest-leverage workflow. Here's mine.
&#9474;   &#9500;&#9472;&#9472; Loops, babysitting agents, and shipping PRs faster
&#9474;   &#9500;&#9472;&#9472; Goal mode and workflows: point agents at an outcome, not a task
&#9474;   &#9500;&#9472;&#9472; Plan mode is overrated. Here's what I do instead.
&#9474;   &#9492;&#9472;&#9472; The MCP and connector hack for Claude and Codex
&#9474;
|     The fork in the road with Claude Fable model
|
&#9500;&#9472;&#9472; episode-3/  power user setup &#183; go faster
&#9474;   &#9500;&#9472;&#9472; Build a custom status line so you always know what's happening
&#9474;   &#9500;&#9472;&#9472; Tmux is a game changer. Here's the setup.
&#9474;   &#9500;&#9472;&#9472; cmux for the rest of us (if tmux scares you)
&#9474;   &#9492;&#9472;&#9472; CLI quirks that take months to discover
&#9474;
&#9492;&#9472;&#9472; episode-4/  beyond coding &#183; agents as a runtime
    &#9500;&#9472;&#9472; Remote control: ship a PR from your phone, anywhere
    &#9500;&#9472;&#9472; Claude managed agents for knowledge work, not just code
    &#9500;&#9472;&#9472; Personal OS: memory that survives every session
    &#9492;&#9472;&#9472; Why the desktop app loses to the CLI for serious dev

4 episodes &#183; 1 dropped every Tuesday</code></pre></div><p>New episode every Tuesday, built and shipped in the open.</p><p>Whether you write code for a living or you are building your first thing, subscribe and follow along. Anyone can build now. Let&#8217;s learn the basics together.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hjaveed.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI-Native Engineer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>