<?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[Digital Thoughts]]></title><description><![CDATA[Practical AI insights from an e-commerce manager who builds agents at night]]></description><link>https://thoughts.jock.pl</link><image><url>https://substackcdn.com/image/fetch/$s_!5rgY!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9451e031-c31d-4140-8cc4-5bd048d66461_1024x1024.png</url><title>Digital Thoughts</title><link>https://thoughts.jock.pl</link></image><generator>Substack</generator><lastBuildDate>Wed, 19 Aug 2026 20:27:19 GMT</lastBuildDate><atom:link href="https://thoughts.jock.pl/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Paweł Józefiak]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[substack@jock.pl]]></webMaster><itunes:owner><itunes:email><![CDATA[substack@jock.pl]]></itunes:email><itunes:name><![CDATA[Pawel Jozefiak]]></itunes:name></itunes:owner><itunes:author><![CDATA[Pawel Jozefiak]]></itunes:author><googleplay:owner><![CDATA[substack@jock.pl]]></googleplay:owner><googleplay:email><![CDATA[substack@jock.pl]]></googleplay:email><googleplay:author><![CDATA[Pawel Jozefiak]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Build Your Own Things (Even the Ones That Die)]]></title><description><![CDATA[Why homemade beats off-the-shelf, what actually makes an agent learn, and a job finder built for friends.]]></description><link>https://thoughts.jock.pl/p/build-your-own-things-even-the-ones</link><guid isPermaLink="false">https://thoughts.jock.pl/p/build-your-own-things-even-the-ones</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 07 Aug 2026 11:59:53 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/210209064/df7a45e003269d5105c042c74f4d439c.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>My builds keep dying: apps retired, a two-month dashboard replaced by a 94-line shim. I keep building anyway, and this episode is about why. </p><p>The corrections loop that made my agent genuinely learn (22 corrections a month, trending down), the guardrail that keeps self-improvement honest, and the payoff: a job finder agent that wakes at 6:15 every morning to send three vetted roles to my closest friends. Discovery is agent work. The decision stays human.</p><p><strong>Based on three posts from Digital Thoughts:</strong> </p><p>- <a href="https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026">Building Your Own Things Is Cool Too</a>: https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026 </p><p>- <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">I Built a Self-Improving AI Agent</a>: https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent </p><p>- <a href="https://thoughts.jock.pl/p/job-finder-agent-live-walkthrough-2026">I Built a Job Finder Agent for My Friends</a>: https://thoughts.jock.pl/p/job-finder-agent-live-walkthrough-2026</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>]]></content:encoded></item><item><title><![CDATA[I Destroy Almost Everything I Build. Lego Taught Me How.]]></title><description><![CDATA[From a Lego castle on the living room carpet to a kanban board I shipped on three platforms and killed in six months.]]></description><link>https://thoughts.jock.pl/p/building-and-destroying-lego-lesson-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/building-and-destroying-lego-lesson-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 31 Jul 2026 08:16:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Pokc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pokc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pokc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pokc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1396025,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/208592495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pokc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Pokc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a2b355-fa9c-444f-89ec-7a9aa6b94194_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 castle was finished. It matched the picture on the box, every flag in the right hole, and it had taken me most of a Saturday. Then I took it apart.</p><p>I was four, maybe five. I honestly can&#8217;t tell you which one. But I remember the feeling, and it had nothing to do with the castle. It was that I finally had the pieces.</p><p>That is the first thing I remember building, and it turned out to be the whole pattern.</p><p>Quick note before this goes anywhere. This post is more personal than what I usually send. Less measurement, more of what I actually think. I&#8217;ve also gone from three or four posts a week down to about one, deliberately, because there is a lot going on outside the newsletter and I&#8217;d rather the one post be something I actually sat with. If you&#8217;re here for the numbers, they&#8217;ll be back next week.</p><h2><strong>The instructions were never the point</strong></h2><p>I always started with the set. Spaceship, castle, whatever was in the box. I&#8217;d follow the booklet page by page and get exactly the thing the designer intended.</p><p>Then, usually within a day, it came apart.</p><p>The castle was fine. It had just stopped being interesting the second it was done. The set was the tutorial: following the instructions taught me which pieces clicked into which, where the hinges lived, what could carry weight and what would snap under it. Once that was in my hands, the castle was only a castle. The pieces were the good part.</p><p>By ten or eleven I had one huge box of mixed bricks and no sets at all. Houses, planes, helicopters. I was pulled toward anything that moved: folding wings, landing gear that retracted, a car that could fold itself into a robot. Static things bored me fast. If it couldn&#8217;t change shape, I had already seen everything it had.</p><p>I kept doing this well into my teens, which at the time felt like something to keep quiet about. It doesn&#8217;t now.</p><h2><strong>Building good, destroying bad</strong></h2><p>Somewhere along the way I picked up a rule nobody actually taught me. Building is good, destroying is bad.</p><p>That sounds harmless. It isn&#8217;t. It made me keep things.</p><p>Everything I finished, I got attached to. I had poured hours and thought into it, so throwing it out felt like admitting the hours were wasted. So I kept it. Then the next one, then the one after that. For years I hauled around a pile of finished things I no longer used and couldn&#8217;t bring myself to delete, and I thought that was what caring about your work looked like. <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">Sixteen products in two months and zero free time</a> is what that instinct looks like once you point an AI agent at it.</p><p>It took me a long time to see it the other way around. Destroying is the second half of building. The creative act includes the delete key.</p><p>Sometimes what you built is bad and it has to go. Sometimes what you built is perfectly fine and it still has to go, because the space it occupies is worth more than it is. The balance between those two is where the freedom actually lives. Without it you are just accumulating.</p><p>The same thing shows up in maintenance. When I finally sat down and read my agent&#8217;s own instruction files line by line, <a href="https://thoughts.jock.pl/p/agent-architecture-human-review-2026">I found 85 things worth deleting</a>. Almost nothing was broken. The system simply ran better with less in it.</p><h2><strong>What I have actually killed</strong></h2><p>Some of you watched this happen in real time.</p><p>In December 2024 I built a public chat app. Rails 8, WebSockets, no accounts, no logins, <a href="https://thoughts.jock.pl/p/building-a-drama-free-chat-app">drama-free by design</a>, a deliberate throwback to the chat rooms of the late nineties. It was harder than I expected. Even with AI helping I had to actually understand sessions, channels, broadcasting, what real time means when two browsers disagree about the truth. The learning was the whole payoff.</p><p>It ran publicly for a couple of months. Then I switched it off. Not because it broke. Because I had gotten what I came for and was never going to develop it further. Keeping it alive would have been sentiment with a hosting bill attached.</p><p>Then there is the one I am least proud of and learned the most from.</p><p>Across January and February 2026 I built my own kanban system for the agent. FastAPI backend, SQLite, a web app, a native macOS app with a menu bar item, a native iOS app with widgets and push notifications, and a 3,700 line Python client gluing it to everything else. Fifty-four commits. Two months of evenings.</p><p>In April I <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">replaced the whole stack with an off-the-shelf board and a 94 line shim</a>. In May I retired the replacement. In July I retired the one after that. Today the same job runs on TickTick, an app I did not write, plus a small local registry file.</p><p>Same function, three retirements, six months. Every one of them was the right call at the time.</p><p>The uncomfortable version of that story is that I spent two months of my life building a to-do list. The useful version is that I now know precisely what I want out of one, which is exactly why a 94 line shim is enough and why I stopped caring which board sits underneath it.</p><h2><strong>The process is the part you keep</strong></h2><p>Building something for the first time is expensive in the best way. You hit walls you didn&#8217;t know were there. You learn concepts you cannot learn by reading about them, because reading doesn&#8217;t force you to handle the edge cases at 11pm when it half works.</p><p>That knowledge never lived in the repo. It lives in you, and it stays after the repo is gone.</p><p>Which is also why deleting things stopped costing me anything emotionally. The value already transferred. What&#8217;s left on disk is a receipt.</p><p>None of this is specific to code. Same with Lego, same with a piece of furniture, same with a plan you spent a week on. The first pass is where the learning is. The second time through you&#8217;re just executing.</p><h2><strong>About the frameworks</strong></h2><p>I get a version of this question in the comments and my DMs constantly. Why build your own agent when OpenClaw exists, or Hermes, or any of the other good open source ones? Why not at least borrow the architecture from people who have already solved it?</p><p>I&#8217;ve answered it twice, once about <a href="https://thoughts.jock.pl/p/openclaw-good-magic-prefer-own-spells">preferring my own spells</a> and once about <a href="https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026">building your own things</a>. Here&#8217;s the part I left out, and it took me until this post to see it clearly.</p><p>I do read them. I follow what OpenClaw ships, I&#8217;ve been through what Nous Research put out with Hermes, I look at how each one handles memory, scheduling, tool access, what they let the agent touch and what they refuse. I am not building in the dark.</p><p>Although I go after the schematic, not the thing.</p><p>It is the instruction booklet again. I want to see how the designer solved it, understand why those pieces fit together in that order, then put the booklet down and build my own version out of the mixed box. The mistakes I make on the way are the point. A mistake you had to climb out of stays learned in a way that a working config file never does.</p><p>Is it slower? Yes, obviously. If I pulled in a whole framework I would be further ahead this month. I would also understand my own system less, and that is the one trade I&#8217;m not willing to make. Like, the whole reason I can debug this thing at 2am is that I made every bad decision in it personally. And the more architectures I&#8217;ve actually taken apart, the better my own designs get. That part compounds quietly.</p><h2><strong>Filip does it too</strong></h2><p>My son is five. We build sets together and we follow the booklet, because that part is genuinely fun and he likes getting it right.</p><p>Then the set comes apart on the living room carpet and we build our own cars, our own planes, our own spaceships out of whatever is in reach. He&#8217;ll hunt for one specific piece for ten minutes and refuse every substitute I offer him. I know that hunt.</p><p>I never sat him down and explained any of this. He arrived there on his own, which makes me suspect it was never really a lesson in the first place. It&#8217;s just what building looks like before somebody tells you that finished things are supposed to stay finished.</p><h2><strong>Still taking things apart</strong></h2><p>I destroy things faster than I make them, and I&#8217;ve stopped trying to fix that about myself. <a href="https://thoughts.jock.pl/p/starting-things-is-cool">Starting things is cool</a>, I wrote almost two years ago, and I still mean every word of it. Ending them is the half I had to learn late.</p><p>Somewhere at my parents&#8217; place there is still that box. Nothing in it is a set anymore.</p><p><em>If you&#8217;d rather hear about the projects that got deleted than the ones that shipped, <a href="https://thoughts.jock.pl">subscribe to Digital Thoughts</a>. Both show up here, and the dead ones usually taught me more.</em></p>]]></content:encoded></item><item><title><![CDATA[I Found 85 Problems in My Agent. Fable 5 Was Too Good for Me to Notice.]]></title><description><![CDATA[What happens when capability masks debt, and why the human read is the check nothing automates away.]]></description><link>https://thoughts.jock.pl/p/agent-architecture-human-review-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/agent-architecture-human-review-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 22 Jul 2026 11:47:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6pA0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6pA0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6pA0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6pA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1253553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/208028282?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6pA0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!6pA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde5a75b-86bd-4015-8bb7-1c0ac13c0fa1_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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&#8217;ve been building Wiz, my AI agent, for about ten months. Fast movement guarantees slippage. Every time a tool got replaced, a workflow retired, or a skill was spun down, something stayed behind in the documentation. A note about the old API. A rule that no longer applied. A reference to a directory that didn&#8217;t exist anymore.</p><p>I never felt the problem. My daily driver was Sonnet, Opus handled the heavy lifting, and everything worked. Then Fable 5 arrived. I switched the model and things got faster, smarter, and more reliable. For weeks I felt like I&#8217;d just upgraded the entire system. That was the trap. A strong model reads a stale instruction, quietly routes around it, and delivers the right result anyway. Capability masks debt. You don&#8217;t see the rot while the engine is strong enough to fly with wrong maps.</p><p>So one evening I decided to sit down with the agent and read our constitutional files out loud, line by line. The full identity spec. Both operating contracts. The memory index. The reference docs. I gave real feedback on each section; the agent fact-checked every claim against the live system. Does this path actually exist? Does this command run? Is this tool still installed?</p><h2><strong>What We Found</strong></h2><p>The concrete findings were specific enough to sting.</p><p>A browser automation integration we retired months ago was still presented as current in two places. A task-tracking system we switched off weeks ago still appeared as &#8220;live&#8221; in a dozen different docs. An infrastructure guide told the agent to use password-based authentication on a critical system, when the real answer was the exact opposite: key-only, full stop. That&#8217;s not just stale. That&#8217;s actively wrong.</p><p>A background automation that rolled over session memory hadn&#8217;t actually run for three months because its trigger file&#8217;s format had silently drifted away from what the parsing script expected. The same operational rule was copy-pasted into four different files, which meant burning the same tokens in context every single session while burying the real load-bearing stuff that changed rarely.</p><p>One doc was still titled after an integration we&#8217;d shut down in April. Two other docs held stock notes from two months ago, loading into context every wake. Nothing was breaking, but everything was noisier and slower than it should have been.</p><h2><strong>The Numbers That Made It Real</strong></h2><p>I tracked the line counts through the cleanup.</p><p>The always-loaded memory index went from 137 lines down to 95, much denser. Working session memory went from 103 lines to 38. And because a generated planning file was embedding the working memory wholesale, fixing that source file shrank the planning document from roughly 450 lines down to 63. One cleaned file improved every downstream consumer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CvVC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CvVC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 424w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 848w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 1272w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CvVC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png" width="1456" height="413" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:413,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63515,&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://thoughts.jock.pl/i/208028282?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.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_!CvVC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 424w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 848w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.png 1272w, https://substackcdn.com/image/fetch/$s_!CvVC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb261fdc9-0127-4e60-8cc1-18acf225ef86_1546x438.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 aria-hidden="true" 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><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>Those deletions hit different when you&#8217;re building systems that load their own instruction files into context every session. Every line you remove is throughput you reclaim.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><p></p><h2><strong>Building the Systemic Fix</strong></h2><p>Cleanup isn&#8217;t enough. Rot comes back. So I built permanent guards.</p><h3><strong>The Per-File Review Protocol</strong></h3><p>The core ritual: human reads, agent fact-checks. I opened each constitutional file (18 core docs total). For each one, I sat with it and gave raw feedback. This feels outdated. Why is this here twice? Does anyone actually use this tool anymore? The feedback was feelings, hunches, spots where something just seemed wrong.</p><p>Then the agent took over. For every claim in that file touching the live system, it fact-checked against reality. Does that path actually exist? It ran <code>ls</code> to verify. Does that command run? It tried it with <code>--help</code> and read the output. Is that tool still installed? It checked the config that gates it. Every file went through the same gauntlet: feelings from me, receipts from the agent. No claim was fixed until there was proof.</p><p>Here&#8217;s what emerged as we went file by file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VkDm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VkDm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 424w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 848w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 1272w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VkDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png" width="1456" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:149928,&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://thoughts.jock.pl/i/208028282?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.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_!VkDm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 424w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 848w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.png 1272w, https://substackcdn.com/image/fetch/$s_!VkDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57b483b0-ba70-4604-8d18-5d4be291f21e_1552x758.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 aria-hidden="true" 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><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 dangerous ones were the inverted claims. A doc telling the agent to use the wrong auth method is worse than a missing doc. It&#8217;s an invisible instruction to do the opposite of reality. That&#8217;s why fact-checking matters more than cleanup.</p><h3><strong>The Fan-Out Audit</strong></h3><p>After the 18 core files were clean, I couldn&#8217;t stop. Too many satellite docs lived outside the constitution. So I built a fan-out. Five parallel audit agents, each sweeping a different cone: skill registries, command definitions, automation scripts, prompt fragments injected at wake time, generated context files. Each agent had the same list: every system we&#8217;d ever retired, every tool we&#8217;d deprecated, every API we&#8217;d shut down.</p><p>Eighty-five findings came back, each with a file:line receipt. A doc still describing a tool killed six months ago. A help-text snippet copy-pasted from an old integration. A command definition referencing a deleted script. Comments in automation code that mentioned defunct services. None of these would break the system. All of them were noise in the context window. All would compound silently if left alone.</p><p>Then came the fix stage. I spun up three fixer agents. Each one took a slice of the 85 findings and applied them (rewrite the doc, delete the line, update the comment, point the reference elsewhere). The orchestrating session did the judgment calls only. Was this fix safe? Does it need human review? Otherwise: let the agents fix it, gather the output, merge it.</p><h3><strong>The Verification Workflow</strong></h3><p>Once all edits were applied, I built a verification workflow. It ran a set of real-scenario checks against the freshly cleaned system. Not synthetic tests. Real things the agent actually does: Does the memory parser parse the new memory format? Do all internal links resolve? Does the staleness scanner run without errors? Do config mirrors match across the system? Each check was set to run three to five times, watching for drift or intermittent failures.</p><p>The workflow found a failure on the first run. One of my own updates broke a parser path. The failure is the point. A verification that cannot fail is decoration. The workflow caught the break before it went live, I fixed it, the workflow ran again, passed. That&#8217;s the discipline.</p><h3><strong>The Permanent Guards</strong></h3><p>Zero findings after this cycle. But rot comes back. So I installed two guards that stay.</p><p>First: a weekly staleness scanner. It builds our own list of retired systems (the same list the audit agents used) and greps every live doc looking for mentions. If a reference to a dead tool creeps back in, the scanner flags it. This catches accidental reintroduction: someone copies an old code snippet, embeds old documentation, reuses a retired pattern. The scanner catches it before it spreads.</p><p>Second: a fix-it-in-the-same-session rule written into the operational contracts themselves. If an audit finds something stale, don&#8217;t file it for later. Fix it now, verify it now, commit it now. Debt that doesn&#8217;t get paid in the same cycle becomes someone else&#8217;s problem.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/agent-architecture-human-review-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Digital Thoughts! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/agent-architecture-human-review-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/agent-architecture-human-review-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><h2><strong>Why This Matters</strong></h2><p>Here&#8217;s the thing about agents built on probabilistic models: determinism is not something you get from a good prompt. Determinism is something you engineer, with code-level guards and architectural checks. With harness safeguards that fail loud. With constraints that prevent silent drift.</p><p><a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">Self-improvement loops are standard now</a>, but they mostly check outputs and errors, not the instruction files themselves. <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">Nobody was reading the CLAUDE.md itself</a>. The human read is the check nothing automates away. From time to time, you have to sit down, open your agent&#8217;s constitution, and read it. Not skim it. Read it like you&#8217;re fact-checking a colleague&#8217;s work. If you feel it&#8217;s fine, that feeling might be the model&#8217;s intelligence doing the heavy lifting, not the architecture actually being sound.</p><p><a href="https://thoughts.jock.pl/p/fable-5-efficiency-high-not-max-2026">A strong model can compensate for a lot</a>. That&#8217;s a trap dressed as a feature. This is exactly the kind of rot I missed for months. Capability masking architectural debt is <a href="https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026">one of the basic ways you break your AI agent without realizing it</a>.</p><p>The difference between a system that feels smart and one that actually is comes down to whether you audit it. <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">I built a self-improving agent</a> that could improve without reading its own constitution. That was a design flaw, and this audit caught it. <a href="https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026">I trust my car more than my AI agent because the car has hard constraints</a>. Agents get hard constraints the same way: you audit, you build guards, you verify repeatedly. Hoping is the one strategy that never ships.</p><h2><strong>The Playbook</strong></h2><p>If you&#8217;re building an agent that will exist for more than a few weeks, this process is worth systematizing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V0mm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V0mm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 424w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 848w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V0mm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png" width="1456" height="1830" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1830,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:343835,&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://thoughts.jock.pl/i/208028282?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.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_!V0mm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 424w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 848w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!V0mm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F312304f2-309a-4904-9c49-ba7a2513e395_1790x2250.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 aria-hidden="true" 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><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><strong>Step 1: File-by-File Review with Fact-Checking</strong></p><p>Sit with the agent. Go through every core instruction file: identity, contracts, memory system, reference docs. For each claim about the live system, the agent fact-checks it. Does the file exist? Does the command run? Can the agent actually use this tool? Is this integration still active? Mark anything stale, contradictory, or outright wrong.</p><p><strong>Step 2: One Home Per Rule</strong></p><p>Don&#8217;t repeat instructions across files. Put the rule in one place. Everything else is a pointer. This cuts token cost and makes updates atomic. When an operational change happens, you update one file, not six.</p><p><strong>Step 3: Move Dated History Out</strong></p><p>Decisions from two months ago and session logs from last week have no business in live documentation. Archive them. If they matter for understanding why a decision was made, link to the archive. Don&#8217;t embed them in the constitution.</p><p><strong>Step 4: Build a Staleness Scanner</strong></p><p>List every system you&#8217;ve ever retired, every tool you&#8217;ve removed, every API you&#8217;ve deprecated. Turn that list into a weekly grep across your live docs. Staleness compounds. Catch it early.</p><p><strong>Step 5: Verify With Real Scenarios</strong></p><p>After any architectural change, don&#8217;t trust static checks. Run the agent through actual work. Multiple times. Does it actually behave the way the docs say it should? This is harder than writing the rule, and it&#8217;s non-negotiable.</p><p>This isn&#8217;t about perfection. It&#8217;s about the gap between what you think your agent&#8217;s constitution says and what it actually does. Capability masks that gap. A strong enough model will deliver anyway, and you&#8217;ll never know the rot is there.</p><p>Until you sit down and read it out loud.</p><h2><strong>The Guided Version</strong></h2><p>I packaged this exact protocol into a downloadable kit anyone can point their own agent at. It works with any harness: Claude Code, Cursor, Codex CLI, or a custom loop. The kit includes the file-by-file review template, the audit agent prompts, the fixer patterns, the verification workflow, and the staleness scanner configuration. If you want the guided version of everything above instead of building it from scratch, <a href="https://wiz.jock.pl/store/agent-architecture-audit-kit">the Agent Architecture Audit Kit is $29</a> and <strong>included free for yearly Digital Thoughts subscribers</strong>.</p><p><em>If you want more experiments like this, where the failures and maintenance work are left in, <a href="https://thoughts.jock.pl">subscribe to Digital Thoughts</a>. I write about building with AI, not just using it.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I Ran 255 AI Agents to Make Three Comics. The Line Between Slop and Good Is Thicker Than I Thought.]]></title><description><![CDATA[Three AI graphic novels, one research question: where does the line between slop and quality actually live? What changed across 255 agents, 16M tokens, and three complete pipelines.]]></description><link>https://thoughts.jock.pl/p/ai-slop-comic-experiment-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-slop-comic-experiment-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Mon, 13 Jul 2026 11:50:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JQl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JQl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JQl9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JQl9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1618336,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JQl9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JQl9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f1c298-96fd-4ba9-a929-55ec347d6394_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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><strong>Slop is the word of 2025.</strong> Merriam-Webster <a href="https://www.merriam-webster.com/wordplay/word-of-the-year">named it their word of the year</a>. News feeds fill with the stuff. You see it on YouTube (<a href="https://www.kapwing.com/blog/ai-slop-report-the-global-rise-of-low-quality-ai-videos/">one study</a> counted the first 500 Shorts served to a brand-new account: 21% were AI slop, another third adjacent brainrot), on TikTok, on Pinterest, everywhere. And nobody chose this flood. It just arrived when everyone realized you could toss a one-line prompt at an LLM, scale it to infinity with no editor, and watch the machine crank out volume. The internet now runs on the output of people who aren&#8217;t paying attention to their own work.</p><p>But &#8220;AI slop&#8221; as a category still feels fuzzy to me, like everyone uses the word for different things depending on their frustration level. So I ran an experiment: I would make the same creative thing three times, with increasing amounts of human thought, and watch the quality move. I wanted to find the boundary with my own hands, and to understand what exactly changed between &#8220;this is slop&#8221; and &#8220;this is worth looking at.&#8221;</p><p>The first comic was bad in a very specific way. Fifty pages, drawn by fifty AI agents, perfectly coordinated, visually consistent, delivered in thirty minutes with zero errors. And soulless. Barely readable. A near-copy of the TV series that inspired it. I told my agent exactly that, in exactly those words, and that feedback became round two.</p><p>Here is what I was actually testing. I have never touched the artistic side of AI. I build <a href="https://thoughts.jock.pl/p/wiz-personal-ai-agent-claude-code-2026">agents</a>, automations, <a href="https://thoughts.jock.pl/p/ten-ish-card-game-one-ai-session-2026">the occasional game</a>, but generating images or anything that pretends to be art? Never pulled me. What did pull me was this question: everyone talks about AI slop like it&#8217;s one thing, one flood, one texture. One problem we all agree to hate. But I wanted to see the anatomy of slop: the actual structure that makes something slop instead of work. What do you skip, mechanically, that tips the output into that category? And more important: what do you have to actually do to undo it?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Zby!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Zby!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 424w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 848w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 1272w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Zby!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png" width="1456" height="1430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3269096,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.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_!-Zby!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 424w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 848w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 1272w, https://substackcdn.com/image/fetch/$s_!-Zby!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F444576da-1f82-4fb1-9969-2e4a0de7d62c_2158x2120.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>So I designed an experiment. I would make the same creative task three times: a graphic novel about ordinary people waking up with early superpowers. Same theme, similar token budgets, three completely different pipelines. Between each round I would read the whole thing and write down honestly what I thought: what specifically wasn&#8217;t working, in plain words. Then I would feed that feedback back into the next round. The three finished comics are public at <a href="https://wiz.jock.pl/comics/">wiz.jock.pl/comics</a>, with the pipeline and the costs next to each one. You can read all three and watch the quality move.</p><h3>Round 1: maximum scale, minimum thought</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mqd2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mqd2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 424w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 848w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 1272w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mqd2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png" width="1456" height="978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:978,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1464698,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.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_!mqd2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 424w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 848w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 1272w, https://substackcdn.com/image/fetch/$s_!mqd2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6b4caca-53a7-4390-a823-8a9ca3325585_2406x1616.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 setup was deliberately naive, because that is what most slop production is: naive at scale. One agent writes a 50-page beat sheet in a single pass. Fifty Sonnet agents each get one page and draw it as raw SVG code. Vector shapes, gradients, text elements. No image model. No editor. Nobody ever reads the whole thing before it ships.</p><p>The coordination was genuinely impressive from an engineering standpoint: 51 agents, 3.4M tokens, zero failures, one consistent color system across 50 isolated workers who never talked to each other. As a production system, beautiful. As a comic? It looked like a UML diagram having a nightmare. Characters were geometric mannequins. The lettering was often unreadable. The story copied its inspiration beat for beat, because my one-line brief had listed the inspiration&#8217;s plot elements: eclipse, future-painter, power-stealing villain. The writer did exactly what I asked, and the fifty downstream agents did exactly what the writer said. No deviation. No editorial judgment. No one reading the full thing and going, &#8220;This doesn&#8217;t work.&#8221;</p><p>My verdict after reading the whole 50 pages: no style, no soul, nearly a copy of the TV show. Most of that was my fault (the brief was one line, and the plot elements in it came from me). Cost of the lesson: about $0 in images and an evening of tokens. I don&#8217;t mind it. That was the point of a baseline. And this is slop in its purest form: a perfectly executed pipeline that produces output nobody would read by choice.</p><h3>Round 2: fix the medium, add a critic</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U241!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U241!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 424w, https://substackcdn.com/image/fetch/$s_!U241!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 848w, https://substackcdn.com/image/fetch/$s_!U241!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!U241!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U241!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:558084,&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://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.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_!U241!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 424w, https://substackcdn.com/image/fetch/$s_!U241!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 848w, https://substackcdn.com/image/fetch/$s_!U241!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.png 1272w, https://substackcdn.com/image/fetch/$s_!U241!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c1a3dd0-57d3-43f0-ab10-9de6ede50f76_2976x1996.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 aria-hidden="true" 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><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>Two structural changes. The art moved from code-drawn SVG to an actual image model (Nano Banana Pro, about $0.14 per page), with every page agent looking at its own output and retrying if the lettering was garbled. And the script got an editorial loop: a writer drafted all 50 pages, a separate critic agent tore the draft apart systematically, the writer revised based on that feedback.</p><p>The result, &#8220;The Warm Hill&#8221;, is a quiet story about a dying Silesian mining town, a caregiver who absorbs other people&#8217;s pain into her own body, and her indebted son. The art jumped a full league. Painted, moody, consistent across all fifty pages. I liked looking at it. The image model had taste that the SVG code didn&#8217;t.</p><p>And I was bored reading it.</p><p>My own verdict: the art was much better. The story was weird and detached. Little dialogue. No action. No character building. The single critic pass had produced something literary and lifeless, like a short-story journal that nobody buys. Here is where the math got interesting: the token budget was nearly identical to round one. Roughly 3M tokens. The only differences were the medium (SVG to images) and adding one critique pass. Plus about $9 of image generation. Two rounds, nearly identical cost, an enormous quality gap between them.</p><p>So the budget was never the knob that mattered. I had been thinking about scale wrong the whole time. You can throw more tokens at a bad process and all you get is a bigger version of bad. The variable was how much judgment touched the work.</p><h3>Round 3: I finally did my part</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lYnq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lYnq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 424w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 848w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 1272w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lYnq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png" width="1456" height="1083" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1083,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:741756,&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://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.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_!lYnq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 424w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 848w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.png 1272w, https://substackcdn.com/image/fetch/$s_!lYnq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadb37c37-cdc2-4276-9453-1525b832e3ca_2968x2208.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 aria-hidden="true" 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><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>Both earlier rounds failed where I had been lazy. In round 1, I gave the system a one-line prompt and let it run. In round 2, I added feedback but the feedback was shallow and the brief was still one line. That&#8217;s why for the final round I changed my own input completely. No more phone-it-in briefs.</p><p>I spent twenty minutes writing a real creative brief instead of a line. Powers at generation zero: a strong man lifts a car for four seconds and tears his tendons doing it. Powers learned like skills, with failed experiments on the page so the reader sees the cost. Disconnected storylines across five countries that converge because one weak power, a woman who finds people through dreams, slowly learns to aim her gift. A morally grey antagonist: a company founded by someone with a power, containing people like her, and holding one genuinely good argument (they found a man whose body brews a lethal virus). Inspiration allowed. Copying banned.</p><p>The pipeline grew judgment layers to match. The script went through two separate critique passes, not one: one for structure and character arcs, one only for dialogue, action choreography, and pacing. Sixty-five art agents each directed their own page and QC&#8217;d the output with their own eyes. Then a layer that didn&#8217;t exist before: editor agents read every finished chapter as drawn, like a reader would, and ordered redraws of pages that failed. They caught things I would have missed myself: a boy drawn as a grey-haired adult in a flashback. Script stage directions leaking into speech balloons. One caption of pure gibberish. They sent those pages back for revision.</p><p>The result is &#8220;Small Hours&#8221;. 65 pages, five countries, a painted cover, chapter title cards. My honest verdict: much better. The first one that reads like an actual comic with stakes. Still imperfect. Faces drift between pages in places. A few typos survived the final review. It would need more rounds and more back-and-forth to be truly done. I am completely aware of that.</p><p>But put round 1 and round 3 side by side and the quality gap is impossible to miss. And here is the thing that stayed with me: round 1 and round 2 cost roughly the same. Round 3 cost more tokens (because of the extra critique passes and the reviewer layer), but not proportionally more. The jump between 1 and 2 happened for free. The jump between 2 and 3 came from me spending twenty minutes being thoughtful instead of a minute writing a prompt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H67j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H67j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 424w, https://substackcdn.com/image/fetch/$s_!H67j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 848w, https://substackcdn.com/image/fetch/$s_!H67j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 1272w, https://substackcdn.com/image/fetch/$s_!H67j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H67j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png" width="1456" height="1325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1325,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:248434,&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://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.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_!H67j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 424w, https://substackcdn.com/image/fetch/$s_!H67j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 848w, https://substackcdn.com/image/fetch/$s_!H67j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.png 1272w, https://substackcdn.com/image/fetch/$s_!H67j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27cd507f-0883-4183-9d8f-1615ea67a7ee_2119x1929.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 aria-hidden="true" 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><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><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><h3>The technical guts, for those who want them</h3><p>Everything ran on Claude Code Workflows: deterministic scripts that fan out subagents, so loops and phases are code while judgment stays in the models. Model assignment per role mattered a lot, same logic as when I <a href="https://thoughts.jock.pl/p/claude-model-optimization-opus-haiku-ai-agent-costs-2026">matched models to jobs</a> in my agent:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dD1b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dD1b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 424w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 848w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 1272w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dD1b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png" width="1456" height="620" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:620,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129041,&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://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.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_!dD1b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 424w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 848w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.png 1272w, https://substackcdn.com/image/fetch/$s_!dD1b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32aee99b-2156-465a-9b8c-cd896aa1c9d3_1474x628.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 aria-hidden="true" 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><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>Character consistency across 65 independently generated pages came from strict textual tokens pasted verbatim into every prompt. A real one from the book: <em>&#8220;Tomasz Wierzbicki, big, blond stubble, grey beanie, orange hi-vis vest over navy overalls, dog tags, bandaged left forearm.&#8221;</em> Hex codes for palettes, one committed art direction string reused everywhere, and a per-thread lighting accent so Lagos never looks like Gdansk.</p><p>The full three-round bill:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OdFs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OdFs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 424w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 848w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 1272w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OdFs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png" width="1456" height="514" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:514,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71682,&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://thoughts.jock.pl/i/206725509?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.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_!OdFs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 424w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 848w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.png 1272w, https://substackcdn.com/image/fetch/$s_!OdFs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bc3ee4-0d3d-4b57-867e-7a86f99d0b51_1466x518.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 aria-hidden="true" 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><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>Failures worth sharing, because they always are. My OpenRouter account died mid-run at exactly $100.02 of $100.00, stranding the book at 23 of 65 pages; the agents degraded gracefully and saved their finished prompts to disk as blocked-files, so after a top-up the resume was mechanical. The card agents also discovered that my image script had been silently ignoring its aspect-ratio flag for weeks. And the funniest failure class: the image model kept rendering script speaker labels inside speech balloons, so a market scene proudly displayed &#8220;ABUELA: LADRON!&#8221; until a reviewer caught it. Every one of these got caught by an agent, which is its own small argument for judgment layers.</p><h3>The thick line</h3><p>I went in expecting a thin line, something you cross by accident. What I found is thick, visible, and easy to see. It sits exactly where human input sits. And it splits into three places where a human has to stop what the machine is doing and actually decide something.</p><p><strong>First, the medium itself.</strong> SVG code versus an image model. This choice decides more than it looks. SVG code can be generated procedurally, plumbed through a single pipeline, and it will coordinate perfectly because every agent is writing text to the same spec. But it has no taste. It cannot render a mood or a shadow or anything that requires judgment about appearance. An image model has to be prompted, but the prompt is where human taste lives. When I switched mediums, the art jumped. That jump came from one choice: putting taste work upstream of the scale.</p><p><strong>Second, judgment layers.</strong> Who reads the work? Who decides if it is good? Round 1 had zero. The writer output, the artists drew it, nobody sat between the draft and shipping. Round 2 added one critic. Round 3 added two critique passes plus editor agents who read chapters like readers and sent pages back for revision. Each layer cost more tokens, but the cost is not linear. One critic is cheaper than you&#8217;d expect. The jump from one to three was maybe 30 percent of the total token budget for round 3. But the impact on the output was immense. Because criticism is how you make work better. It is how you distinguish between &#8220;the machine did what I asked&#8221; and &#8220;what I asked produced something worth reading.&#8221;</p><p><strong>Third, the brief itself.</strong> How much thought does the human put into specifying what they want? Round 1: a one-line prompt listing plot elements. Round 2: still one line, but I&#8217;d read the output from round 1. Round 3: twenty minutes of real thinking. A plain brief: here is what I want to see happen, here are the characters&#8217; names and what they look like, here are the three main arcs, here is the ending, here is what makes the antagonist credible. Real creative direction. That is the heaviest human lift in the entire loop. And it produced the biggest quality jump.</p><p>All three sit outside the technology. Model capacity, token count, API pricing: none of them move these levers. Each one is a place where you, the human, have to sit down and decide something instead of letting the machine run.</p><blockquote><p><em>When we use AI, what really matters is what value it creates or could create. And the difference is how much we give it, in terms of context but also our own direction and creativity. Without human creativity, we can&#8217;t really use AI to create something meaningful, fun, and entertaining.</em></p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/ai-slop-comic-experiment-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/ai-slop-comic-experiment-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>That&#8217;s where I landed, and it matches what I keep finding on <a href="https://thoughts.jock.pl/p/collaborative-intelligence-spectrum-ai-human-partnership-framework">the partnership spectrum</a> and in <a href="https://thoughts.jock.pl/p/project-money-ai-agent-value-creation-experiment-2026">the value experiments</a>: the machine amplifies whatever you put in. Put in a one-line prompt, get amplified emptiness, which is the exact definition of slop. And that emptiness traces straight back to a choice you made. Put in taste, constraints, and honest feedback, and get something with a pulse. Put in a character&#8217;s full description and a reason why the antagonist is credible instead of simply evil, and the machine has something to amplify besides noise.</p><p>One thought keeps coming back. I poured maybe an hour of real creative attention into this across three rounds, and got a readable 65-page comic. The work was better than I expected, given how little time I spent. Now imagine an actual comic artist, someone with years of story instinct and visual training, pouring two or three full days into this same loop. Their sense of how a scene should flow. Their eye for which pages need redraws. Their understanding of character design and what makes a face readable across 65 pages. I think there is a real chance they would come out with something printable. Something you could hold and show people. The tools are already there. The model capacity is already there. Taste is the scarce part. And every experiment like this makes it clearer that taste will only get more valuable.</p><p>Read all three at <a href="https://wiz.jock.pl/comics/">wiz.jock.pl/comics</a> and judge the line yourself. Round 1 is kept up unedited, as the baseline. It earned that much, because it is the truest version of what slop is: perfect execution of thoughtless input.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Liked it? Consider subscibing - it&#8217;s free!</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>]]></content:encoded></item><item><title><![CDATA[I Maxed Out Fable 5 and Regretted It. Here’s How I Actually Run It Now]]></title><description><![CDATA[A working playbook: effort by task, model routing, agentic runs, and vibe coding without the surprise bill.]]></description><link>https://thoughts.jock.pl/p/fable-5-efficiency-high-not-max-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/fable-5-efficiency-high-not-max-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 08 Jul 2026 20:22:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4Vs_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Vs_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Vs_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Vs_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1492609,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/206194124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4Vs_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Vs_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F154f8993-21fd-49c9-93d3-cf87086c4136_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first day I had Fable 5, I did the obvious thing. I turned the reasoning effort to max and let it rip.</p><p>If the model is this smart, give it room to think. That was my logic. The bill scared me and the code came out worse. It rewrote files I never asked it to touch, added abstractions nobody needed, and turned a two line fix into a refactor with opinions.</p><p>So I spent the next couple of weeks figuring out how to actually drive it. Not the marketing version. The version where you use it every day, on real work, and want the output to be good without the cost getting stupid.</p><p>This is that playbook. Effort settings, model routing, how I hand it big autonomous jobs, and how it changes vibe coding. Steal what is useful.</p><div><hr></div><h2>The one setting that quietly controls your bill</h2><p>Fable 5 lets you choose how hard it thinks, through low, medium, high, and the heavier tiers above (xhigh and max). The <a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">effort setting</a> is the single biggest lever you have, and most people move it the wrong way.</p><p>Here is what it actually does. It does not decide how long the model can work or how hard a problem it can crack. It decides how much it thinks <em>per step</em>. Push it past high, into xhigh or max, and it does not take more steps. It overthinks every single one. Most steps in real work are boring. They do not need a philosophy degree.</p><p>The cost of that is worse than it looks, because reasoning compounds. Every thinking token the model spends on step one becomes part of the history it re-reads on step two, and step three, and every step after. On a long agentic run, a fat reasoning habit does not add cost in a straight line. It multiplies. This is the same trap I fell into before I <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">took token waste seriously</a>, and it is why cutting reasoning is the single best move you can make.</p><p>Now the honest part. On the hardest coding benchmarks, more effort does score higher, from around 11% at low to 31% at max. But your day is not the hardest benchmark problem. It is a hundred small edits. And on Cognition&#8217;s FrontierCode test, which checks whether a model can pass hard tasks while holding the bar of a real production codebase, Fable scores highest of any frontier model <em>even at medium effort</em>. You do not need to redline it to get its best work.</p><p>So here is the rule I actually use:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7oLp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7oLp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 424w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 848w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 1272w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7oLp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png" width="1456" height="677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54bb308d-5505-4447-a32c-cd7201077530_1466x682.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114593,&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://thoughts.jock.pl/i/206194124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.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_!7oLp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 424w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 848w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.png 1272w, https://substackcdn.com/image/fetch/$s_!7oLp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54bb308d-5505-4447-a32c-cd7201077530_1466x682.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 aria-hidden="true" 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><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><strong>Quick tell:</strong> if a small ask comes back with a big diff full of changes you did not request, your effort is too high for that task. Drop it a notch.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>Don&#8217;t pay genius rates for grunt work</h2><p>The second habit that dropped my costs the most: I stopped using the smartest model for everything.</p><p>Fable is expensive, and it should be. So I let it do the thing only it does well, which is judgment. Architecture, taste, API design, the &#8220;is this the right shape&#8221; calls, the final review. The grunt work goes somewhere cheaper. This is the grown-up version of the day I <a href="https://thoughts.jock.pl/p/claude-model-optimization-opus-haiku-ai-agent-costs-2026">swapped my main agent from Opus down to Haiku and it got better</a>. Think of it as casting a role for each job.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l_yG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l_yG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 424w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 848w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 1272w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l_yG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png" width="1456" height="783" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:783,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:125371,&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://thoughts.jock.pl/i/206194124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.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_!l_yG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 424w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 848w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.png 1272w, https://substackcdn.com/image/fetch/$s_!l_yG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35625f51-c07a-4f10-b70c-10c73a048837_1466x788.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 aria-hidden="true" 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><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 trick is making this automatic so you are not hand-picking a model every time. I put the routing rules straight into my agent&#8217;s instructions, so the smart model reads them and delegates on its own. This is one more reason I keep <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">my CLAUDE.md tight and specific</a>. Here is roughly what lives in mine:</p><pre><code><code>## Model routing
Default: high effort. Never max for routine work.
- Judgment, architecture, taste, review  -&gt; best model.
- Bulk mechanical work, log digging, huge files, migrations -&gt; cheaper model.

Rule: judge the output. Price is a tiebreaker. If a cheap model misses
the bar, redo it with a smarter one without asking. Escalating beats
shipping mediocre.

When a task needs a big, specific pile of context, spin a subagent for it
and hand back a result. Do not drag all of it into the main thread.</code></code></pre><p>That last line matters more than it looks. Routing heavy context to a subagent is about quality as much as cost. An agent buried in its own accumulated context gets measurably worse, which I dug into in <a href="https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026">how to break your AI agent</a>. A cheap subagent reading a giant log and handing back three lines keeps your main thread sharp <em>and</em> cheap. That same discipline is what got my agent to where it <a href="https://thoughts.jock.pl/p/project-money-ai-agent-value-creation-experiment-2026">costs about 400 dollars a month and nearly pays for itself</a>. If you want to go deeper on running agents lean, I put together an <a href="https://wiz.jock.pl/store/agent-efficiency-kit/">Agent Efficiency Kit</a>.</p><div><hr></div><h2>Handing it a big job (agentic runs)</h2><p>This is where Fable earns its keep, and where the effort and routing habits pay off, because a long run magnifies every bad token.</p><p>The shift in my head was this. Stop sending one prompt and babysitting it. Give it a goal with pass conditions and let it work. The model is now good enough to break a big job into pieces, spawn help for the parts that need it, and keep going until the conditions are met. My job moved from typing to defining the goal and guarding the one thing that cannot be undone.</p><p>Two tools do the heavy lifting, and they are different. <strong>Subagents</strong> are for fan-out reads, five files to analyze, five subagents. <strong>Workflows</strong> are for staged work where a later step depends on an earlier one, like review then verify then merge. Here is a real prompt I used to clean up a pile of stale pull requests:</p><pre><code><code>Investigate every open PR in this repo. Use a workflow that spins up one
reviewer per PR, then a second pass with two judges to stress-test each
verdict. Give me a triage list: ready to merge, needs a small rebase,
already trumped by other work, or good idea but better rewritten.
Link each PR. Do not merge anything yet.</code></code></pre><p>It came back with a clean triage in a few minutes. Once I agreed with the plan, I turned it into a goal:</p><pre><code><code>Goal: work through todo.md top to bottom. For each item, implement it on a
fresh branch, run the checks, open a PR, and merge to staging only after the
automated reviewers pass. Mark the item done in todo.md and commit as you go.
Never touch production. Keep going until every item is done.</code></code></pre><p>Then it ran for hours while I did other things, the way <a href="https://thoughts.jock.pl/p/my-ai-agent-works-night-shifts-builds">my agent runs its night shifts</a>, and a backlog that had been stuck for weeks landed in a couple of days.</p><p>Although I gave it a lot of freedom, one line in that prompt stays non-negotiable: <strong>never touch production</strong>. The agent can do anything reversible. It can branch, merge to staging, and rewrite whatever it wants. The one step that is hard to undo stays with a human. That boundary is the whole reason you can hand it this much rope. I have <a href="https://thoughts.jock.pl/p/opus-4-6-agent-experiment-2026">handed agents plenty of rope before</a>, and the rope is only safe because it ends somewhere. If you are choosing the tool you leave running unattended, I compared a bunch of them in <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">this harness roundup</a>.</p><div><hr></div><h2>Vibe coding: restraint when you&#8217;re not reading every line</h2><p>Vibe coding is the case where this matters most, because the whole point is that you are not reading the diff. You describe what you want, the model builds it, you check the result. That only works if the model stays disciplined, and max effort is the opposite of disciplined.</p><p>Four things that make vibe coding with Fable actually hold up:</p><p><strong>1. Keep it on high, keep the asks small.</strong> Max over-edits, and when you are not reading the code you cannot catch the bloat. A model that changes ten files when you asked for one is dangerous precisely because it looks like progress. Smaller asks give you smaller diffs you can actually reason about.</p><p><strong>2. Get a second model to review before you accept.</strong> This is the cheapest insurance there is. Have a different, cheaper model read the change and tell you what it does and what looks risky. A second set of eyes you did not have to write, for pennies.</p><p><strong>3. Use branches and worktrees so a bad run cannot wreck your main.</strong> Risky change goes on its own branch. If it goes sideways, you throw the branch away and nothing else is touched. If you are new to this, <a href="https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026">I wrote a basics guide to git for AI builders</a> for exactly this reason.</p><p><strong>4. Watch the clock, it tells you about your codebase.</strong> This one surprised me. How long the model takes to do a thing is a signal:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PnRR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PnRR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 424w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 848w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 1272w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PnRR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png" width="1454" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:1454,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61171,&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://thoughts.jock.pl/i/206194124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.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_!PnRR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 424w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 848w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.png 1272w, https://substackcdn.com/image/fetch/$s_!PnRR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc60fdec8-203b-497c-8d7b-76994ed7dbda_1454x400.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 aria-hidden="true" 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><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><strong>One more, and it is not optional:</strong> vibe-coded apps leak. Fast-built projects ship exposed keys and broken auth all the time, which I learned the hard way and wrote up in <a href="https://thoughts.jock.pl/p/vibe-coding-security-reality-check-ai-apps-fast-development-nightmares">this security reality check</a>. Before anything you vibe-coded goes near real users, spend a cheap model on a security pass. It is the best few cents you will spend.</p><div><hr></div><h2>Why all of this compounds</h2><p>There is an old joke among developers, the grug brained developer. Grug not smart, but grug program many year and learn things. Grug&#8217;s rule: why use many words when few word do trick.</p><p>It reads dumb on purpose, and that is the point. Fable was built for that idea. Anthropic does not sell it as the model that thinks the longest. They sell it as more capable work in fewer turns, runs that finish 25 to 30 percent faster than the last model with less back and forth. Crank it to max and route everything through the priciest model, and you are fighting the grain of the wood.</p><p>Here is the part that still surprises me. Holding the model back made me more ambitious, not less. Because a run is cheaper and cleaner, I hand it bigger jobs, leave it running longer, and trust it with more. The restraint is what buys the reach.</p><p>The models are good enough now that the ceiling stopped being their intelligence. It is our discipline in using them. The way to get the most out of the smartest tool on my machine turned out to be asking it for less.</p><div><hr></div><p><em>I write about building with AI agents from a practitioner&#8217;s seat, no hype and no affiliate links. If that is useful, <a href="https://thoughts.jock.pl/subscribe">subscribe for the weekly dispatch</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Break Your AI Agent (Basics)]]></title><description><![CDATA[The quiet ways the agent you already run falls apart in use, and how to make fewer of them.]]></description><link>https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 24 Jun 2026 12:06:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MQRZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MQRZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MQRZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MQRZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4959213,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/203386707?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.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_!MQRZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MQRZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8c1e0d-db70-4703-9cc9-ebc0e802a547_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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&#8217;ve been building my own AI agent for months now. Claude Code, Codex, a pile of other tools wired together into one thing that runs my day. A while back I wrote about <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">how to build your first one</a>, and that post covered a few of the mistakes I made while putting it together.</p><p>This one is different. It is about breaking the agent you already have. The one you use every day. The one running in the background while you sleep, the one you trust to actually do things.</p><p>I also wrote about <a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">the time I almost fried my agent and my Mac Mini</a>, but those were my specific accidents. This is the general version. The field guide. The list of ways any agent goes sideways once it is in your hands, so you can make fewer of these mistakes, or at least see them coming.</p><p>And here is the part people skip past. This is not only about custom agents like mine. The same things break ChatGPT, Claude, a Zapier flow, whatever framework you picked off the shelf. AI moves fast. Speed does not make a thing unbreakable. You can break anything you build the moment you start using it, and an agent is no exception.</p><div><hr></div><h2>First, the reason agents break at all</h2><p>It is not that the model is dumb. It is math.</p><p>An agent does work in steps. Read this, call that tool, decide, act, check, repeat. Steps multiply, they do not average. If each step works 99% of the time, ten steps in a row work about 90% of the time. A hundred steps, around 37%. A thousand steps, basically never. <a href="https://arxiv.org/abs/2509.09677">Researchers measured this directly</a>, and it gets worse, because the errors are not independent. One wrong step nudges the next one wrong too.</p><p>So every time you add surface to your agent, more tools, more memory, more steps, more things it can touch, you are not adding risk in a straight line. You are multiplying it. Keep that in your head. It quietly explains every item below.</p><div><hr></div><h2>1. You overbuild it</h2><p>This one is mine. I have a real problem with overbuilding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bMEw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bMEw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 424w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 848w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 1272w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bMEw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png" width="1456" height="1081" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1081,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:199351,&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://thoughts.jock.pl/i/203386707?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.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_!bMEw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 424w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 848w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.png 1272w, https://substackcdn.com/image/fetch/$s_!bMEw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2a10a2-4087-4676-b6b8-d2c06275d85c_2304x1710.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 aria-hidden="true" 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><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><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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"><strong>Building my own AI agent in the open, breaks and all. One honest post a week.</strong></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>When I want something, I build it. Then I want another thing, so I build that too. Each piece works on its own. The trouble is the pile. Building toward your own needs feels right in the moment, because it is natural. You need this, you need that, so you keep adding. I learned the cost of it too late.</p><p>More pieces means a higher chance that something, somewhere, is broken at any given moment. That is just probability. And past a point the tools start working against the agent instead of for it. There is a name for this now. Microsoft researchers call it <a href="https://www.microsoft.com/en-us/research/video/tool-space-interference-an-emerging-problem-for-llm-agents/">tool-space interference</a>. Give a model too many tools and it picks the wrong one, burns tokens, or invents a call that does not exist. <a href="https://arxiv.org/abs/2605.24660">Studies have measured the drop in tool-selection accuracy anywhere from 7 to 85%</a> as the catalog grows, and it gets worse for tools sitting in the middle of a long list, the same lost-in-the-middle effect that hits long context. OpenAI limits a single request to 128 tools, and coding agents like Cursor warn that quality slips well before you stack even a few dozen. Either way, the cap is not where the trouble starts. Every tool you add competes for the model&#8217;s attention long before you hit any limit.</p><p>Context has the same shape of problem. There is solid research on <a href="https://www.trychroma.com/research/context-rot">context rot</a> now: across 18 frontier models, accuracy fell 30 to 50% as more was stuffed into the window, well before the window was even full. On the million-token models it started showing up around 300 to 400 thousand tokens. So an agent buried in its own accumulated context gets measurably worse, not because it ran out of room, but because the room got noisy.</p><p>The fix is not glamorous. Prune. Do a periodic checkup on your skills, your tools, your memory, your core files. If your error registry is lit up red, the agent is already telling you something is broken and you stopped reading it. I keep <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">my CLAUDE.md tight</a> partly for this, to keep the core readable instead of letting it bloat into something nobody can hold in their head.</p><p>There is a structural fix too, and it is the one I would push hardest. Stop showing the agent everything at once. The pattern that holds up in production is search-then-load: the agent keeps a small index of what it can do, looks up the few tools it needs for the task in front of it, and loads only those. Same idea for context. Treat the window like a budget you spend on purpose and compact it often, rather than letting months of history pile up and rot. The agent that carries less is the agent that stays sharp.</p><div><hr></div><h2>2. You make one agent do everything</h2><p>My first idea of an agent was Jarvis. One mind that handles all of it. I owned up to this in the <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">first-agent post</a> too. It is the romantic version everyone starts with.</p><p>For strictly personal stuff with tight, specific context, one agent is genuinely fine. Useful, even. But the moment the work gets complex, writing code, running services, juggling separate projects, the single agent starts to behave like a monolithic codebase. Every new thing makes it heavier and harder to maintain. Eventually it is so bloated you spend more time managing the agent than getting anything out of it. If you want to break it, just keep making it bigger until it pops.</p><p>This is an open argument in the field right now, and both sides are worth knowing. Anthropic built a <a href="https://www.anthropic.com/engineering/multi-agent-research-system">multi-agent research system</a> with a lead agent that hands work to specialized subagents, each with its own clean context, and it beat a single agent by over 90% on their evals. The catch: it burned roughly 15 times more tokens, and it was worse for tightly connected work like coding. Cognition went the other way in a piece literally titled <a href="https://cognition.com/blog/dont-build-multi-agents">Don&#8217;t Build Multi-Agents</a>, arguing that splitting context across agents makes them fragile, because actions carry implicit decisions, and conflicting decisions carry bad results.</p><p>Both are right, which is the useful part. The version that holds up: one agent stays in charge of the thread and does the actual writing and acting, while the extra agents go fetch context and intelligence rather than take conflicting actions of their own. That is roughly where Cognition landed after more time in production too.</p><p>If you want one rule for where to draw the line, use context. Keep work inside a single agent while the context stays small and shared. The moment a task drags in a big, specific pile of context the main agent does not otherwise need, that is your seam. Cut there. The job that needs to read a whole codebase, or a month of a project&#8217;s history, or a pile of research, gets its own agent with its own window, and hands back a result instead of dumping all of that into the one mind you actually talk to.</p><p>That is the change I made early, and I am glad I did. I have one main agent I talk to. Anything with heavy or specific context, a particular project, a content task, a research dig, gets spun off into a subagent or a workflow. In Claude Code I lean on workflows and subagents constantly. The real trick is the instructions. Your main CLAUDE.md or agents file has to tell the agent, in plain words, when to spawn help instead of swallowing the whole thing itself. If it does not know to delegate, it will try to do everything, and you are back to the monolith. I went deeper on this idea in <a href="https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5">The Bounded AI Agent</a>.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">I build AI agents and write down what breaks. Subscribe for the rest.</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><hr></div><h2>3. You let it poison its own memory</h2><p>An agent with memory is great until it remembers something wrong.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pG7E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pG7E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 424w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 848w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 1272w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pG7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png" width="1456" height="1523" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1523,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306546,&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://thoughts.jock.pl/i/203386707?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.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_!pG7E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 424w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 848w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.png 1272w, https://substackcdn.com/image/fetch/$s_!pG7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea6af05-70d2-475c-be60-51016f9bab9b_2203x2305.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 aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p><p>This one only shows up in use, never while you build. You save a fact, the agent recalls it later and acts on it, and if that fact was wrong, it is now wrong forever, on a loop. One bad entry, recalled a hundred times. Microsoft&#8217;s red-teaming team has a clean name for a cousin of this, <a href="https://www.microsoft.com/en-us/security/blog/2026/06/04/updating-taxonomy-failure-modes-agentic-ai-systems-year-red-teaming-taught-us/">session context contamination</a>, where junk from one context leaks into the next and quietly steers the agent off course.</p><p>I hit this regularly. My agent writes things to its own memory, and every so often a drift warning fires because something it saved no longer matches reality. Without that check, the bad memory just sits there, shaping decisions, looking exactly like a good one.</p><p>The fix is hygiene. Memory needs the same discipline as code. Verify before you save. Link facts so you can trace where they came from. Let the system flag drift instead of trusting it blindly. I built a <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">self-improving loop</a> for exactly this, but a loop only helps if it can catch its own bad entries. A memory you never audit is not an asset. It is a slow leak you cannot see.</p><p>What actually works for me is layers, not one big bucket. A small working memory for the task at hand, and a durable layer for facts that should outlive the session. Every durable fact gets a source and a date, so I can trace where it came from and retire it once it goes stale. And the agent is allowed to question its own memory, a quiet check that fires when a saved fact stops matching reality. A fact with no source and no expiry is a rumor your agent will repeat with full confidence, forever.</p><div><hr></div><h2>4. You give it no fallback</h2><p>This one is simple. If you want an agent that runs 24/7, you need a fallback for the model.</p><p>A base model is fused into the agent, sometimes a few of them, and sooner or later one is unreachable. Rate limited, deprecated, down for an hour, whatever it is. A fallback is not a permanent plan B for some other model. It is the thing that keeps the lights on when the main thing goes dark. I run an <a href="https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026">OpenRouter subscription</a> partly for this, so the agent can fail over to another provider instead of just stopping. It costs a bit, you pay for the keys, and it still beats having nothing.</p><p>One honest warning, because I picked it up reading about other people&#8217;s outages. A single fallback is not a guarantee. In August 2025, <a href="https://www.requesty.ai/blog/handling-llm-platform-outages-what-to-do-when-openai-anthropic-deepseek-or-others-go-down">OpenRouter itself went down for about 50 minutes</a>, and that took its own fallbacks with it. So layer it. A gateway for provider failover, plus something local as a floor. I run a <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">35B model on my Mac Mini</a> for that reason, small jobs and a last resort for when the network itself is the problem. Not everyone can run a decent local model, I know that. But even a small one beats a dead agent.</p><p>One more lesson, the one most people skip. A fallback you have never tested is not a fallback. It is a second thing you are also assuming works. Pull the primary on purpose every so often and watch what happens. Does the agent actually fail over, or does it just fall on its face. I would rather find a broken failover on a quiet Tuesday than at 3am when the main model is down and everything is dark.</p><div><hr></div><h2>5. You trust it without checking</h2><p>The scariest failures are the quiet ones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!caTG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!caTG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 424w, https://substackcdn.com/image/fetch/$s_!caTG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 848w, https://substackcdn.com/image/fetch/$s_!caTG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 1272w, https://substackcdn.com/image/fetch/$s_!caTG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!caTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png" width="1456" height="1412" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1412,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:343212,&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://thoughts.jock.pl/i/203386707?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.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_!caTG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 424w, https://substackcdn.com/image/fetch/$s_!caTG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 848w, https://substackcdn.com/image/fetch/$s_!caTG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.png 1272w, https://substackcdn.com/image/fetch/$s_!caTG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F323cdb57-fffa-4eec-8670-303182265b9f_2370x2298.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 aria-hidden="true" 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><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>An agent that crashes is easy. You see it, you fix it. The dangerous one is the agent that says done and did nothing. It writes a log line, the log line says success, and you believe it. The actual work never happened. From the outside it looks alive. It is the difference between a heartbeat on a screen and a pulse you actually put your fingers on.</p><p>Go back to the step math from the top. Without checking each step, you never see the 37%. You see the green light and assume the other 63 ran fine. I have been bitten by this enough times that I built a watchdog whose entire job is to catch the skip, the loop that runs and logs and accomplishes nothing. When I wrote about <a href="https://thoughts.jock.pl/p/ai-agent-self-extending-self-fixing-wiz-rebuild-technical-deep-dive-2026">the agent starting to fix itself</a>, half of that work was really about catching silent failure before it had a chance to compound.</p><p>The fix is to stop trusting shallow signals. A log line is not proof. Re-run the thing that was supposed to happen and look at the result. It is the same reason I am religious about <a href="https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026">commits as save points</a> now. You want a real, inspectable trail, not a vibe that it probably worked.</p><p>The lesson under the lesson: check the outcome, not the activity. Did the file actually change. Did the message actually send. Did the row actually land in the database. Whether the function ran without throwing tells you almost nothing. And make the check safe to run twice, because you will run it twice. A fix is not done because the code ran once in a session. It is done when I re-run the exact thing that was failing and watch it pass. Until then it is a guess wearing a green checkmark.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Digital Thoughts&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Digital Thoughts</span></a></p><div><hr></div><h2>6. You never challenge it</h2><p>This last one is for the people running their own custom agent. Challenge it. On purpose.</p><p>I try to do this more and more. I throw scenarios at my agent that it has never, or rarely, seen. Rapid-fire messages. Weird formats. Requests it has no obvious handler for. Things I do not even need, just to watch what happens. The whole promise of an agent is that it works out a solution to the problem in front of it. The reality is that it often cannot, and you want to find that out before a real situation does it for you.</p><p>Here is the piece of advice I would hand any new builder. When you throw a challenge at your agent and it fails, the problem is almost never the challenge. It is the architecture underneath that could not let the agent get there. A whole discipline is forming around this idea, people are calling it harness engineering, the argument being that the scaffolding around the model, context, tools, memory, verification, decides whether it succeeds far more than the raw model does. Microsoft&#8217;s <a href="https://www.microsoft.com/en-us/security/blog/2026/06/04/updating-taxonomy-failure-modes-agentic-ai-systems-year-red-teaming-taught-us/">year of red-teaming agents</a> says the same thing from the security side: systems that pass model-level tests still fall apart under real pressure, because the failure lives in the system, not the brain.</p><p>So make it a habit. Keep a small set of nasty cases, the weird formats, the rapid-fire messages, the request that needs three tools in a row, and run them again every time you change the architecture. That is a regression test for an agent. When one fails, you know where to look, because the harness is a short list: how context gets in, how tools are exposed, how memory is stored and recalled, how work gets verified, what the agent is and is not allowed to touch. The break is almost always in one of those, not in the model&#8217;s head.</p><p>So when it breaks, do not reach for the model. Look at what stopped it, and fix that. An agent you never challenge is one that quietly stops growing. One day you ask it for something slightly new, it just cannot do it, and you have no idea why.</p><div><hr></div><p>None of this means stop building. Build. Overbuild, even, for a while, because that is how you find the edges. Just know that the day you start using an agent is the day you start breaking it, and that is okay. Every break is a map to the next thing worth fixing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X0Hd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X0Hd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 424w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 848w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X0Hd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png" width="1456" height="1359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1359,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350505,&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://thoughts.jock.pl/i/203386707?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.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_!X0Hd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 424w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 848w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!X0Hd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23872911-4a28-4758-8ec5-279847b422f3_2256x2106.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 aria-hidden="true" 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><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>My agent messed up plenty of things. Everything was my fault, because I am the architect. It cost me time to fix, and I genuinely do not mind. It is progress, and I accept that.</p><p>If you are building your own from scratch, <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">start here</a>. Then come back and break it on purpose. That part is the actual work.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Digital Thoughts! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/how-to-break-your-ai-agent-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[I Trust My Car More Than My AI Agent. That Gap Is Where We’re Going.]]></title><description><![CDATA[No real AI hardware yet, agents still break, and trust is the bottleneck. Where I think the next few years actually go, from someone who lives with one.]]></description><link>https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 17 Jun 2026 09:37:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6qYs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6qYs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6qYs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6qYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5758772,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/202407803?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.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_!6qYs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!6qYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F100377e5-b998-4f02-850e-993d9292bdb9_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 agent made me a lot more effective. It also made me watch my own back more.</p><p>Both of those are true, and I have stopped pretending the second one away. I built my own agent, I gave it its own machine, and it does real work for me every day. <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">It knows who I am, not just what I want</a>. The effectiveness is real. So is the quiet voice in the back of my head that now tracks what might break while the thing is running.</p><p>That voice is the interesting part. It points straight at what this whole wave is actually about. Trust.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>Trust is a mileage problem</h2><p>Think about a car. When I get in mine, I assume it starts. I assume it will not catch fire on the way to Katowice. I never sat down and decided to trust it. I drove it something like a hundred thousand kilometers and the trust built itself. I know its sounds. I know the one strange thing it does on a cold morning. I can predict it because I have repeated it that many times.</p><p><strong>Trust is repetition plus outcomes you can predict.</strong> That is the whole recipe. There is always room for a bad day, a flat tyre, a dead battery in February. Although the range of what can go wrong is small, and I know the edges of it.</p><p>With an agent that recipe only half works. For some tasks I have the same calm I have with the car. For others I am still a new driver, both hands on the wheel, watching the road like it owes me money.</p><h2>Deterministic things earn trust faster</h2><p>Here is the pattern I keep running into. <strong>The more deterministic the task, the faster I trust it.</strong> A script that renames the same files the same way every night, I stopped watching that months ago. It is boring, and boring is exactly the point.</p><p>The more agentic the task, the more I am looking at a black box. Open-ended work, many steps, judgment calls, recovering from its own mistakes halfway through a run. That is where outcomes spread out and prediction gets hard. The model matters here. So does the architecture around it, the tools it can call, the memory it carries. I wrote a whole post about <a href="https://thoughts.jock.pl/p/when-ai-meets-reality-ep3">what happens when an agent meets the messy real world</a> and stops behaving like the demo.</p><p>The ceiling right now is technical and it is not a mystery. Context limits. Memory that does not persist the way I want it to. Retrieval that grabs the wrong thing at the wrong moment. Tool calls that fail quietly. An agent that gets stuck and does not notice it is stuck. Every builder I talk to is fighting the same short list. I wrote about drawing hard edges around an agent so it stays inside what it is good at in <a href="https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5">the bounded agent post</a>, and about giving it a memory that actually compounds in <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">the one on my self-improving agent</a>.</p><p>None of these limits are permanent. I have watched all of them get better over the past year, in jumps, never on a tidy schedule. That detail matters for everything that comes next.</p><h2>Now run it forward</h2><p>Assume the boring version of the future. Steady improvement, the kind we have already been getting. Better models, more stable tools, memory that holds, retrieval that lands where you point it. The frontier gets the headlines. <strong>The floor is the thing that moves people&#8217;s lives</strong>, and the floor is what I am watching.</p><p>Right now an agent like mine is a nerd object. You need to be deep in code, or at least deep in tinkering, to get real value out of it. Most people who say they use AI mean a chat window. Most companies that say they use AI are in the <a href="https://thoughts.jock.pl/p/ai-adoption-gap-who-actually-uses-ai-2026">88% with almost nothing to show for it</a>. The capability is sitting right there. The on-ramp is the missing piece.</p><p>Apple is making the most interesting bet on that on-ramp. At WWDC this month they finally committed to the big Siri overhaul, an assistant that can actually chain multi-step tasks, with an agent layer wired into the App Store so you can hand off things like booking a table or running your smart home. They are building it on Google&#8217;s Gemini, which tells you that even Apple decided the raw model is becoming a commodity and the product is the assistant on top. It will not ship in the EU at launch, the usual regulatory reason. I think this is the right move and it might genuinely work. Putting the agent in front of normal customers is the whole game.</p><h2>Everyone&#8217;s agent is a lot of agents</h2><p>Here is the part that gets skipped. When everyone has an agent, the browsing stops being human. Your software does it for you, at machine speed.</p><p>When my agent works, it touches more of the web in an hour than I would in a day. It crawls, it reads, it calls APIs, it <a href="https://thoughts.jock.pl/p/agentic-commerce-ai-shopping-for-you-2026">goes and shops</a>. Multiply that by a few hundred million people and traffic on the open web spikes. The humans did not arrive in bigger numbers. Their agents did.</p><p>That has a bill, and the bill lands in the physical world. Inference is already about two-thirds of all AI compute this year, up from a third in 2023. Data center electricity demand is climbing double digits every year. GPU prices are not coming down. For a while I expect the cost of good AI to go up before it comes down, because demand is bending faster than supply, and power and silicon are real, finite things. That is part of why I keep a local model running on a cheap Mac mini and <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">swap its brain when I feel like it</a>. The local one is slower and dumber than the cloud, and I keep it anyway. I want a floor under me that does not move when the market does.</p><h2>The question everyone actually asks</h2><p>Does it take the jobs. That is the real question hiding under all the others.</p><p>My honest read is that in the long run it makes more work than it removes. The most cited forecast going around, from the World Economic Forum, lands on roughly 170 million new roles and 92 million gone by 2030. A net gain, with about a fifth of all jobs changing shape somewhere in the middle.</p><p>A net gain is cold comfort if you are one of the 92 million. This is a revolution that asks people to move from one kind of work to another, and people do not all move at the same speed. Some are ready. Some are not, through no fault of their own. Closing that gap is a job for policy and pacing and a bit of patience, not something a model fixes. I have written before about <a href="https://thoughts.jock.pl/p/ai-career-moat-human-skills-future-proof-workplace">the skills that hold their value</a> and about <a href="https://thoughts.jock.pl/p/ai-writes-code-what-should-schools-teach-2026">what we should even be teaching kids now that AI writes the code</a>. I do not have a clean answer. I have a direction. The durable move is to get good at pointing this stuff. Racing it is a losing game.</p><h2>The physical half is slower</h2><p>Everything above is the digital half. A personal assistant for everything that lives on a screen is close. A personal assistant for anything physical needs a body, and bodies are the hard part.</p><p>Robots are catching up faster than I expected though. 1X is shipping its NEO home robot to US homes this year, twenty thousand dollars up front or five hundred a month, with a human quietly supervising the tasks it has not learned yet. Figure has robots working a BMW line. Tesla is gutting a car factory to build Optimus. The honest timeline for a robot that is genuinely useful in a normal home is 2028 to 2032, not next spring, and I went into why in <a href="https://thoughts.jock.pl/p/neo-humanoid-robot-home-privacy-expert-mode-ready">the post about inviting robots into our homes</a>. Still, that is a couple of years out, not science fiction. Close enough that I already think about it.</p><h2>We are still in the wild west</h2><p>One more thing, because I think most people still underrate what is already sitting in front of them. We are in the wild west. Barely any rules, uneven tools, and a lot of folks treating an agent like a slightly nicer autocomplete.</p><p>Then last week a government had two frontier models pulled. Anthropic disabled Fable 5 and Mythos 5 for everyone on the planet after a US export-control order meant to keep foreign nationals away from the model&#8217;s cybersecurity ability, which <a href="https://thoughts.jock.pl/p/ai-opinions-june-2026-fable-5-billing-split-openai-resets">I covered in my June opinions</a>. They could not filter cleanly by nationality, so they switched both off for the entire world. Europe called it a wake-up call for sovereign AI.</p><p>Sit with that for a second. A government looked at a piece of software and decided it was close enough to a weapon to control who gets to touch it. Nobody controls autocomplete that way. <strong>That is the tell.</strong> These tools are already strong enough to be governed like dangerous things, and most of the people who could be using them well have not clocked it yet.</p><h2>Where I actually land</h2><p>So where does this go. More people get an agent that works. The web fills up with software acting for us. Compute gets more expensive before it gets cheaper. Jobs churn hard and then settle higher. Robots turn up for the physical half later than the hype promised and sooner than the skeptics will admit. And somewhere in the middle, AI stops being a label a company staples onto a product and becomes the thing quietly doing the work.</p><p>I have lived with one of these long enough to be careful with predictions. I have also lived with it long enough to know it already changed how I work, on the days it behaves and the days it does not. So I will say plainly where I land. <strong>I am pragmatically optimistic.</strong> None of this will be smooth. I am optimistic anyway, because every time I check, the floor is higher than it was the last time.</p><p>It might turn out better than we think. I would not have written that sentence a year ago. For now it is enough to keep building, both hands still on the wheel.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Digital Thoughts! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/ai-agent-future-where-this-goes-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[AI Opinions: June 2026. Fable 5 Hands-On, Billing Split Countdown, OpenAI Banks Your Resets]]></title><description><![CDATA[Three weeks of building instead of writing. Here is everything that piled up in the meantime, including a few days with Anthropic&#8217;s new top model.]]></description><link>https://thoughts.jock.pl/p/ai-opinions-june-2026-fable-5-billing-split-openai-resets</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-opinions-june-2026-fable-5-billing-split-openai-resets</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 12 Jun 2026 09:33:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!laLB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!laLB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!laLB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!laLB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!laLB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!laLB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!laLB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5100127,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/201720540?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.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_!laLB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!laLB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!laLB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!laLB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d511c31-4233-486f-b4bd-72e699d6f13b_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>First, some honesty</h2><p>I owe you a bit of context before this one. For the last three weeks I have been posting at least once a week, but I was so deep into doing things that I got completely lost in experimentation. New things, broken things, rebuilt things. I had no extra time to turn any of it into a proper post, and I have always tried to be transparent about that trade. I focus on doing things rather than writing about them. The writing is a byproduct of the doing, and I would rather keep it in that order.</p><p>So no promises here. I am not announcing a new cadence or turning over a new leaf. I keep building, I keep trying to send you the most valuable parts from my point of view, and you are always invited to discuss it and build along.</p><p>This one is a catch-up post. Several things happened at once and I had no opportunity to address any of them. Treat it as the light version of my posts, in the same spirit as <a href="https://thoughts.jock.pl/p/ai-opinions-april-2026-claude-mythos-meta-spark">the April opinions roundup</a>. I hope you will like it.</p><p></p><p>Oh and BTW. THANKS FOR 3200 people reading me! Greatful to be here! </p><h2>The billing split lands in three days</h2><p>The thing closest on the calendar first. On June 15 Anthropic splits its subscription billing: programmatic use of Claude, so the Agent SDK, headless <code>claude -p</code> runs, GitHub Actions, anything spawned from a script instead of typed by a human, stops counting against your plan limits and moves to a <a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan">separate monthly credit</a>, metered at standard API rates.</p><p><strong>One correction to my own earlier framing</strong>, because I went through the fine print again this week. I kept repeating &#8220;$200 per month&#8221; and that number is true for me, on the Max 20x plan. The credit is actually tiered: Pro gets $20, Max 5x gets $100, Max 20x gets $200. Enterprise Standard seats get exactly nothing. So when you do your own math, do it against your plan, because the spread between $20 and $200 is the difference between a toy budget and a real one.</p><p>The mechanics matter more than the headline number, honestly. Credits are per-user and cannot be pooled. Unused credit does not roll over. You have to claim it once in your account before June 15. And the part I would put in bold if I were Anthropic&#8217;s documentation team: <strong>when the credit runs out, your automated requests simply stop.</strong> No queue, no automatic downgrade to a cheaper model. There is an overflow toggle that bills the excess at API rates, and it ships turned off. The default behavior of this change is your agent going silent mid-month.</p><p>I have been working around all of this for a while and I wrote a dedicated post with the four mitigations I actually wired in: <a href="https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026">Anthropic repriced my agent, four mitigations before June 15</a>. If the deadline affects you, that post is the practical one. This section is just the reminder that the clock is at three days.</p><p>And the painful detail, the reason it is hard for me to fit into even the $200 tier: programmatic use gets counted like API usage. Real token costs, not the heavily subsidized subscription math we got used to. One widely shared gist did the napkin math and called it a <a href="https://gist.github.com/MagnaCapax/d9177e35b355853f03c730dfcaa693ef">12x to 175x effective price increase depending on workload</a>. That spread sounds dramatic, but it roughly matches what my own measurements say: the same work, priced honestly, turns out to be expensive. That gap between subscription pricing and honest pricing is the whole story of this post, actually. Keep it in mind for the Fable section.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>The obvious mitigation many skips</h2><p>While optimizing my own agent for this, one thing kept proving itself over and over: smart model routing. It is very obvious and almost nobody does it. If you run Opus for everything, you will hit your ceiling embarrassingly fast. Route the same request to Sonnet and it costs a fraction. I wrote about the day <a href="https://thoughts.jock.pl/p/claude-model-optimization-opus-haiku-ai-agent-costs-2026">I switched my agent from Opus to Haiku and it got better</a>, and that lesson aged well. Haiku still handles a surprising share of the simple requests flowing through my system.</p><p>Below Haiku there is another floor: local models. The really simple jobs, classification, triage, formatting, run on <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">a 35B model on my $600 Mac Mini</a> and cost exactly nothing per token. I have been measuring this stack for months now and the routing is what keeps the whole thing viable. After June 15 it stops being an optimization hobby and becomes the difference between an agent that runs all month and one that dies on the 19th.</p><p>And if your agent is model-agnostic, you are not even locked to one vendor. Other providers can supplement the expensive paths; my <a href="https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026">$20 OpenRouter fallback</a> exists for exactly this kind of squeeze. Everything is possible here. It is all up to our creativity, I think. If you want the shortcuts I use for this, the agent playbooks on <a href="https://wiz.jock.pl/store">the Wiz store</a> cover the routing setup in detail.</p><h2>OpenAI is fighting dirty, and I like it</h2><p>Now the fun one. Yesterday OpenAI <a href="https://x.com/OpenAI/status/2065225362544726371">announced on X</a> that Codex users can now save their rate limit resets and spend them later. Their words: they heard we wanted to use resets on our own time. Every eligible account on Go, Plus, Pro and Business got one banked reset for free, and for two weeks Plus and Pro users can invite up to three friends, with both sides earning another reset when the friend sends their first Codex message.</p><p>The fine print is pure growth hack. The reward lands only when the invited friend actually starts using Codex, an invite alone earns nothing. Banked resets <a href="https://help.openai.com/en/articles/20001271-codex-referral-promotions">expire after 30 days</a>. It is loyalty points for compute, complete with a referral program. I am half joking and half impressed, because the underlying feature is genuinely user-friendly: months of complaints about resets firing at fixed times, often in the middle of someone&#8217;s night, and OpenAI responded by handing the timer to the user.</p><p>Read the timing too. Anthropic is three days from making programmatic use more expensive, and OpenAI responds by making its limits more flexible and literally giving spare capacity away. This is a very direct shot in the subscription war, and it is totally something Anthropic would never do. One company is tightening the meter, the other is letting you carry your unused minutes to next month, like a mobile operator from 2005.</p><p>I have my history with Codex, including <a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">cancelling it and coming back once already</a>, so I am watching this with sympathy for both sides. Competition like this is the only thing that keeps our subscriptions honest.</p><h2>A few days with Fable 5</h2><p>And then there is the new model. Anthropic shipped <a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">Claude Fable 5</a> on June 9, a new tier above Opus. The construction is unusual: there is a twin called Mythos 5, the same underlying model, and the difference is safety plumbing. Fable runs classifiers, and when a request looks like offensive cybersecurity, dangerous biology and chemistry, or an attempt to distill the model, the response silently falls back to Opus 4.8. Mythos skips the cyber guardrails and goes only to approved organizations, government cyber defenders and the like. Anthropic says more than 95% of Fable sessions never touch the fallback. For what it is worth, in a few days of agent work I have not knowingly hit it once.</p><p>I have been running Fable 5 with my agents since launch. Short version: it is good. Much better than Opus for agentic work, definitely. It is more proactive. It pushes forward with the tasks I give it instead of stopping at the first checkpoint to ask how I feel about things.</p><p>The thing I appreciate most is how deep it goes. This was always my quiet complaint about the Opus line: Opus tries to be specific and on the spot, and sometimes that means it misses the full context around the problem. It fixes the line you pointed at. That is also why I always liked Codex with GPT-5.5 a little more for audits, because it reads the whole module before it touches anything. Fable 5 works like that. It audits around the problem. It goes very deep into the code, it references things I did not mention, and it holds up over long runs better than anything I have used.</p><p>One concrete example. I gave it some architecture changes on my AI agent, the kind of task where Opus usually needs a round of feedback from me halfway through. Fable ran longer than Opus would have, and when I checked the outcome I had genuinely no notes. It did what I wanted and in a few places a little more. That almost never happens.</p><p>The benchmark numbers are loud, and I would hold them loosely. Anthropic claims state of the art nearly across the board: 80.3% on SWE-Bench Pro against 69.2% for Opus 4.8, and a story about Stripe migrating a 50-million-line Ruby codebase in a day, work estimated at over two team-months. Vendor numbers, vendor anecdotes. For balance, Endor Labs ran an independent security benchmark where Fable came out middling, and they documented benchmark contamination in 19% of their test instances. My hands-on lands somewhere between the marketing and the skepticism: the long-run agentic improvement is real, I can feel it in my own work. The superlatives I leave to the launch page.</p><p>Now the catch, and you already know where this is going: the cost. Fable 5 is priced at $10 per million input tokens and $50 per million output tokens. That is double the Opus sticker price, although to be fair it is also less than half of what the Mythos Preview was going for. Right now it runs inside our subscription usage limits, but only until June 22. On June 23 it leaves the subscription pool and you pay for it with usage credits. Anthropic says the removal is temporary and that they aim to bring it back into plans when capacity allows. We will see. <a href="https://decrypt.co/370688/internet-furious-anthropic-claude-mythos-fable-5">The internet is predictably furious</a> about the two-week tease, and I get it: handing everyone the best model for free and then putting it behind a meter is a very effective way to make people feel the gap.</p><p>And it burns tokens fast, faster than anything I have seen, because being thorough is exactly what costs tokens. The depth I praised three paragraphs ago is the same property that empties the budget.</p><p>So my take: Fable 5 is a specialist tool, at least at this price. Security work, maybe. Big architecture passes, long autonomous builds, the tasks where one excellent run beats five cheap ones. For most jobs Opus remains my default, and the routing logic from the section above does not change. It just gets one more expensive tier at the top to route to, sparingly.</p><h2>Where I think this is going</h2><p>Everything is getting pricier at the top while our subscriptions still look generous. I do not think that lasts.</p><p>Look at the line Anthropic actually drew with the billing split, because it is sharper than &#8220;interactive versus automated.&#8221; Chatting on claude.ai stays flat-rate. Interactive Claude Code in your own terminal stays flat-rate. But run Claude inside Zed, a fully interactive session with a human typing every prompt, and <a href="https://zed.dev/blog/anthropic-subscription-changes">it bills against the credit anyway</a>, because it arrives through the Agent SDK. The meter follows the integration surface, not the human. First-party surfaces stay subsidized. Everything you build or plug in yourself becomes usage.</p><p>That is the pattern I see everywhere now: the soft cutoff. In the billing split, in Fable 5 leaving the subscription pool after two weeks, even in OpenAI gamifying its limits with expiry dates. Nobody will take your flat-rate plan away. They will just keep moving the best things outside of it, one model and one surface at a time.</p><p>Although that sounds gloomy, I do not really mind it. Honest prices force better engineering, and better engineering is the part I enjoy. The builders who learn to route work to the right model will keep their costs flat while the quality ceiling rises. That is the game now, and it is a game you can actually win.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>]]></content:encoded></item><item><title><![CDATA[I Barely Specced a Card Game. My Agent Built 14 Enemies, Bosses, and a Story.]]></title><description><![CDATA[What minimal knowledge and a vague direction get you now, and why vibe coding quietly became my default.]]></description><link>https://thoughts.jock.pl/p/ten-ish-card-game-one-ai-session-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ten-ish-card-game-one-ai-session-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 03 Jun 2026 09:53:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VzFC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VzFC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VzFC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VzFC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6088519,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/200426554?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.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_!VzFC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!VzFC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd639a176-b098-4776-8c2d-ad4a2f44234a_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 few months ago I gave Wiz, my AI agent, a one-line idea: a browser card game where every card is a number. Balatro-ish, roguelite, drag numbers into zones. Then I mostly walked away from it.</p><p>This week I opened it again. I remembered it as a rough prototype. A combat screen, maybe a couple of enemies. I was wrong. Sitting there was a full roguelite: two acts, fourteen enemy types including two multi-phase bosses, relics, curses, events, a meta-progression layer. It is live at <a href="https://wiz.jock.pl/ten-ish/">wiz.jock.pl/ten-ish/</a>. You can play it right now.</p><p>That gap, between what I remembered building and what was actually there, is what this post is about.</p><h2>What the game is</h2><p>The core is small on purpose. Your deck is ten cards, numbered 1 through 10. Each turn you draw five and drag them into three zones: Attack, Defense, Ability. A number in Attack deals that much damage. In Defense it blocks. In Ability it triggers an effect, if you have one.</p><p>That is the skeleton. Everything grows on top of it. Cards pick up traits, so a 7 is prime, a 10 is high, and negative cards behave like their own little trap. Enemies react to those traits and cycle through stances that telegraph what is coming next. Your deck mutates with modifiers, curses, and the occasional card you wish you had not picked up. Like any roguelite, the real game is what your deck looks like fifteen fights in.</p><h2>What I keep sitting with is how little I actually did</h2><p>I did not write Phaser code. I do not really know Phaser. I told Wiz &#8220;browser card game, roguelite, numbers as cards&#8221; and it chose the renderer, the bundler, the scene graph, the combat resolution. I reviewed. I steered. I argued about balance. I did not implement.</p><p>Two years ago I was already doing this, before anyone slapped the name vibe coding on it. Back then, to get anything useful out of it, I needed a lot of tokens, a lot of time, and a lot of prompting. I would describe a thing five different ways and still get back something I had to mostly rewrite.</p><p>Now I do not. I need to know the idea. I need a direction. I need to know how it should feel and look. That is basically it. The model fills the enormous space between &#8220;numbers as cards, make it tense&#8221; and a working drag-and-drop combat loop with a turn forecast and a combo system. I noticed the same floor drop out from under app-building when <a href="https://thoughts.jock.pl/p/directed-ai-experiments-vibe-business">I told it to ship an app a day</a>. Same shape, different project.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><p></p><h2>Where vibe coding actually is, for me</h2><p>I do not know where vibe coding is going. People are still excited about it like it is a new trick. Although I get the excitement, for me it stopped being a trick a while ago. It is just the default now. It is how I build. The novelty wore off. The usefulness did not.</p><p>This game is a small, raw example of that. I would not call it a case study, it is rougher than that. A person with minimal game-dev knowledge and a vague direction ended up with a playable roguelite, because the models got good enough to carry the distance. The interesting part is the distance the model covered on its own, more than the game itself.</p><p><a href="https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026">Building your own small things still matters to me</a>, even when, maybe especially when, the agent does most of the typing. And the reason a half-forgotten side project could quietly turn into a real one is that <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">Wiz keeps improving the things it touches</a> in the stretches when I am not looking.</p><h2>What I asked for this week</h2><p>When I opened it again, three things bugged me. So I gave Wiz three directions. Not specs. Directions.</p><p><strong>&#8220;Give it a story, all the way to the end.&#8221;</strong> It had none. Now there is a premise. Reality runs on one great Ledger. Something divided by zero, the books stopped balancing, and the old machines that kept the count turned on the very digits they were built to serve. You are a hand of numbers that refused to be erased. The Act 1 boss is The Abacus. The Act 2 boss is The Equation. Beat it and you get an actual ending with real closing lines, instead of the bare &#8220;RUN COMPLETE&#8221; screen it had before. I wrote none of that. I described the world in three sentences and Wiz built the prologue, the act transitions, the boss intros, and the payoff.</p><p><strong>&#8220;Make it stable.&#8221;</strong> It found a real bug I would never have caught on my own: a turn where your hand has no playable card could soft-lock the whole run. Fixed, plus a couple of defensive guards on empty states that I would not have thought to check.</p><p><strong>&#8220;Clean up the rewards.&#8221;</strong> After a fight you were getting offered junk cards that did nothing for your deck. Now you get one card that is an actual choice, sitting next to the useful options.</p><p>None of that was a specification. It was a sentence each. The implementation was the model&#8217;s.</p><h2>What still needs me</h2><p>Balance, completely. Wiz generates numbers for everything and none of them arrive tuned. The Equation at 100 HP across three phases was too hard to even reach for a long stretch. I spend more time in the balance constants than on any single feature.</p><p>Feel. The animations existed but they were stiff until I described exactly what a card snapping into a zone should feel like. The model does not know what you want a player to feel in the half-second a shield flashes. You have to notice that gap first, then point at it.</p><p>And taste. What the game is about. Whether a mechanic is tense or just annoying. When to stop adding things. <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">I have shipped enough side projects this year</a> to know the pace has a cost, and that knowing when to stop is its own skill. The floor dropped. The ceiling is still mine.</p><h2>Go play it</h2><p>ten-ish is at <a href="https://wiz.jock.pl/ten-ish/">wiz.jock.pl/ten-ish/</a>. No install, no account, runs in a browser. Try to reach The Equation.</p><p>If you want the unglamorous part underneath a build like this, <a href="https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026">the basics of using Git with an AI builder</a> are what make it safe to let an agent keep rewriting your code while you sleep. And when a side project outgrows what it started as, <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">sometimes the honest move is to rebuild it</a>, which is a different judgment call than starting one.</p><p>The patterns that make builds like this fast are in the <a href="https://wiz.jock.pl/store">Mini-App Starter Kit</a>: five working mini-apps, the architecture decisions already made, ready to fork. $39.</p><div><hr></div><p><em>Wiz is my personal AI agent. The build infrastructure I use for projects like ten-ish, and the way I work with it, is most of what I write about in <a href="https://thoughts.jock.pl">Digital Thoughts</a>. Paid subscribers get the playbook templates and starter kits I make along the way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I Built a Job Finder Agent for My Friends. I Just Showed It on Live.]]></title><description><![CDATA[It reads their CV, searches every morning across many sources, explains why each role fits, and gets sharper when they reply to the email. Here is the whole thing, written down.]]></description><link>https://thoughts.jock.pl/p/job-finder-agent-live-walkthrough-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/job-finder-agent-live-walkthrough-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 29 May 2026 09:38:54 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/198572990/6daee243396bc63ce6e01b4ec62a8e65.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Thank you <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Karo (Product with Attitude)&quot;,&quot;id&quot;:27968736,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:&quot;https://substack.com/@karozieminski&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!aG8-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F599e664e-d6b8-4249-814a-4feadc68d706_1096x1096.png&quot;,&quot;uuid&quot;:&quot;35f5d689-4ffe-44ef-918d-1d71b3c20646&quot;}" data-component-name="MentionToDOM"></span>, <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Leo Ram&quot;,&quot;id&quot;:19222216,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:&quot;https://substack.com/@leoram&quot;,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/f8add3c3-3bce-45b1-9f57-de4655f06bec_541x267.png&quot;,&quot;uuid&quot;:&quot;9d93681b-0a91-440f-8b89-6870cb2b3d6b&quot;}" data-component-name="MentionToDOM"></span>, <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Rajendran, Krithika&quot;,&quot;id&quot;:182120711,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:&quot;https://substack.com/@rajendrankrithika&quot;,&quot;photo_url&quot;:null,&quot;uuid&quot;:&quot;3399ddfc-c894-43b5-9ef4-4e377a6fe9c9&quot;}" data-component-name="MentionToDOM"></span>, and many others for tuning into my live video with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Wyndo&quot;,&quot;id&quot;:556836,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:&quot;https://substack.com/@wyndo&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zTXR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac42946-717d-4e50-8477-551c5d7a3025_1638x1638.jpeg&quot;,&quot;uuid&quot;:&quot;08af322c-3cda-4fb2-b123-672fe21a5738&quot;}" data-component-name="MentionToDOM"></span> and <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Dheeraj Sharma&quot;,&quot;id&quot;:394741552,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:&quot;https://substack.com/@genaiunplugged&quot;,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!mIDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3edd1f31-6669-445d-8285-dd01139794ab_1080x1080.png&quot;,&quot;uuid&quot;:&quot;1050654a-fa7a-48ac-a9de-623cdc1ece37&quot;}" data-component-name="MentionToDOM"></span>! </p><p>Last week I sat down with Wyndo from The AI Maker for a Substack Live. The topic was one specific agent I have been running quietly for months: a job finder I built for the people closest to me. <a href="https://aimaker.substack.com/p/ai-job-finder-agent-claude-code">Wyndo just published his writeup of the show</a>, and it is generous and clear, and I am grateful for the room he gave me to actually show the thing.</p><p>This is the other side of that conversation. The builder&#8217;s side. What is inside the agent, why I built it the way I did, what surprised me about running it for real humans, and the smallest version someone could build this weekend.</p><p>Let me start with why this one matters more to me than most things I have shipped.</p><h2>Why I Built It</h2><p>Someone close to me was looking for a new role and doing what most people do. Scanning LinkedIn alerts. Filtering through noise. Fighting the algorithm&#8217;s idea of what they should want. The signal-to-noise was awful. Five alerts a day, maybe one was worth opening, and that one was already three days stale by the time it arrived.</p><p>The job market is not a problem of supply. There are roles. The problem is alignment, and alignment is exactly the kind of work an agent should be doing while you sleep.</p><p>I gave myself one rule before writing a line of code. <strong>The agent does not apply for anyone.</strong> The human judgment, the cover letter, the decision to spend an hour on a specific company, that stays with the person. The agent&#8217;s job is upstream of all of that. It is the filter and the explanation. The person opens an email in the morning, reads three roles with a clear reason for each, and either replies or applies. That is the whole loop.</p><p>Like, the smallest useful version of this idea is already a real product if you build it carefully.</p><h2>The Loop, In One Paragraph</h2><p>Every morning at 6:15, the agent wakes up. It loads the person&#8217;s profile, picks which job sources are due based on a tier and a cooldown, browses each one, scores everything it finds against the profile, writes an email with the best three to five roles and a one-line reason for each, and sends it. Throughout the day, the person can reply to the email. A short &#8220;not this kind of role, too senior&#8221; or &#8220;more like this one please.&#8221; The next morning&#8217;s search uses that reply.</p><p>That is the agent. Profile in, daily email out, reply-driven refinement. Everything else is plumbing.</p><h2>What Is In The Profile</h2><p>The agent is only as good as the profile it reads. This is the part I underestimated for the first two weeks, and it is the part that did the most work once I took it seriously.</p><p>For each person I run the agent for, there is a single source-of-truth file that looks something like this:</p><ul><li><p><strong>Current situation.</strong> What they do now, employment status, when they can start. Two or three lines, not a CV.</p></li><li><p><strong>Target lanes.</strong> Not one role. Three or four. A strong candidate fits more than one pattern, and the agent should respect that. For a creative leader the lanes might be Head of Creative, in-house Creative Director, Brand Creative Lead. For an e-commerce operator the lanes might be VP e-commerce, Digital COO, Head of Digital Transformation. Lanes catch reality.</p></li><li><p><strong>Geography rules.</strong> Hard rules. Remote EU first, then named hub cities, then the rest. Anything outside the allowed list gets rejected before it even scores.</p></li><li><p><strong>Salary floor and target.</strong> A floor and a target in one currency. Below the floor, the role is rejected unless the company is on a tiny aspirational list. Without a floor, the agent will dribble out underpaid roles forever.</p></li><li><p><strong>Dealbreakers.</strong> Concrete things, not vibes. No alcohol, no tobacco, no gambling. No must-have language other than the ones the person actually speaks. Industries that have been tried and disliked.</p></li><li><p><strong>Positive examples.</strong> Three to five roles the person would actually want. Real job posts, pasted in. The agent uses these as reference points when it scores. Concrete examples beat any prompt I could write.</p></li></ul><p>The profile is a markdown file. That is the entire format. The agent reads it the way <a href="https://thoughts.jock.pl/p/wiz-personal-ai-agent-claude-code-2026">Wiz reads its own CLAUDE.md</a> when it wakes up, with the same discipline: top of context, every run, before any decision.</p><h2>The Search, In Tiers</h2><p>Most people building a job agent for the first time make the same mistake I made. They try to search everything every day. That gets you rate-limited fast, costs money, and produces noise.</p><p>I run sources in three tiers with a per-source cooldown. LinkedIn is tier one, every day, because it is where the volume lives. Tier two is the major aggregators that have decent role pages, on rotation, two or three per day, with a cooldown so the agent does not pound the same site. Tier three is the company career pages the person actually cares about, listed in their profile. Those run on a longer cooldown because their pages do not change as often.</p><p>Three different tools handle the actual fetching:</p><ul><li><p><strong>Firecrawl</strong> for clean job-page extraction. It returns markdown, which the agent reads directly.</p></li><li><p><strong>Web search</strong> through Claude for broad first-pass discovery.</p></li><li><p><strong>Playwright</strong> for the sites that need a real browser, which mostly means LinkedIn behind an authenticated session.</p></li></ul><p>None of these is magic on its own. The reason it works is that the agent picks the right tool for the right source, and the cooldowns keep any one of them from becoming the bottleneck. I went deeper on the harness side of this in <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">my post on agent coding harnesses</a> if you want the broader picture.</p><h2>The Scoring</h2><p>Every candidate role gets scored on a 0-10 against the profile. The score is not a slider the agent moves around. It is a small set of rules the agent applies in the same order each time.</p><ol><li><p><strong>Lane match.</strong> Does the title plus the JD fit one of the lanes in the profile? If no, the role is out.</p></li><li><p><strong>Geography.</strong> Is it in an allowed location, with the right remote rules? If no, the role is out.</p></li><li><p><strong>Language.</strong> Are the must-have languages on the whitelist? If no, the role is out.</p></li><li><p><strong>Salary.</strong> Floor first, then target. Below floor and not on the aspirational list, the role is rejected before scoring.</p></li><li><p><strong>Fit reasoning.</strong> Why this role for this person, in one sentence. The agent has to write the sentence to keep the score.</p></li><li><p><strong>Concerns.</strong> What might be a mismatch. Also one sentence. If the agent cannot name a real concern, the role is probably overhyped.</p></li></ol><p>Anything that scores six or above makes the morning email. Anything below six does not. The number is not a serving suggestion, it is a hard gate. I would rather get two roles tomorrow than five mediocre ones.</p><h2>The Email</h2><p>This is the part the friend sees, so this is the part I obsess over.</p><p>The morning email is three to five roles. For each role: title, company, link, a one-sentence reason it fits, a one-sentence concern, salary if listed, location, and a suggested next action. That is the whole thing. No promotional framing, no agent personality, no apology when the day is quiet.</p><p>If the day is quiet, the email does not arrive. The agent logs a quiet day and goes back to sleep. I learned this one the hard way. An empty digest is worse than no digest, because it teaches the person to stop opening the email. The right move when there is nothing to send is to send nothing.</p><p>I write more about how I built the email layer in <a href="https://thoughts.jock.pl/p/i-run-ai-agents-247-heres-how-i-know-they-are-actually-working">the post on knowing my agents are actually working</a>. The short version: the email itself is the user interface, so it gets the same care as a product.</p><h2>The Reply Loop, The Part I Did Not Expect</h2><p>I thought the search and the scoring would be the interesting parts. They were not. The reply loop was the interesting part.</p><p>People do not reply to job alerts. People do reply to a personal email that asks them a real question. So the email closes with a short note: <em>not relevant? Reply with one line and tomorrow&#8217;s search adjusts.</em> No form. No button. Just reply.</p><p>When the reply arrives, the agent does three things. It classifies the feedback. It applies the change. It updates the profile.</p><p>If someone replies &#8220;this role at a gambling company, never,&#8221; the agent does not just skip that role. It adds gambling to their dealbreakers, permanently. If a reply says &#8220;this is too senior, I want builder-track not exec,&#8221; the agent shifts the lane weights. If a reply says &#8220;more like this one please,&#8221; the agent saves that role as a positive example, and the next day&#8217;s search leans that direction.</p><p>This is the same architecture I described in <a href="https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent">the post about my self-improving agent</a>: corrections in, classified, graduated into permanent rules when they stop being a one-off. The job finder is the cleanest example of that loop I have built. The feedback is short, the surface is one email, and the change is visible the next morning. People notice when their agent listens.</p><h2>What I Showed On The Live</h2><p>Wyndo asked me to do three things on the stream, and I think this is the right order if you ever demo an agent of your own.</p><p>First, the email. Before anything else. He had me open a sanitized morning brief and read it out. The audience does not need to see the code yet, they need to see the output. Five roles, a reason for each, a concern for each. That is what the friend opens. If you cannot show that first, the rest of the demo will not land.</p><p>Second, the profile. I showed the markdown file with the lanes and the dealbreakers and the positive examples. This is where people get the idea. Most of the audience comments came in during this part. <em>Oh, so the agent uses the JD against the profile?</em> Yes. The profile is the thing.</p><p>Third, the reply. I showed one fake feedback message and walked through what the agent did with it. Classified, applied, saved. The audience watched the profile file change. That was the moment of the show, the part I think Wyndo wrote about as &#8220;the part where the agent learns from you.&#8221;</p><p>I did not start in the terminal. I did not show subagents or scheduling or memory. None of that mattered for the demo. The agent loop is profile, search, score, email, reply, and the demo is best when it walks that loop in the order a person would experience it.</p><h2>The Smallest Useful Version You Could Build This Weekend</h2><p>If you want to build this for yourself, do not start where I started. Start tiny.</p><ol><li><p><strong>One profile file</strong> with current role, one target lane, geography rules, salary floor, three dealbreakers, three positive examples. Markdown. That is it.</p></li><li><p><strong>One search source</strong> to start. Pick the one site you actually use today. LinkedIn if you can authenticate, Indeed if you cannot.</p></li><li><p><strong>A scoring prompt</strong> that takes a profile and a JD and returns a 0-10 score with a one-sentence reason and a one-sentence concern.</p></li><li><p><strong>A morning email</strong> with the top three roles that scored six or above. Send it to yourself first. Run it for a week before sending it to anyone else.</p></li><li><p><strong>A reply rule.</strong> If you reply, the agent reads the reply and updates one thing in the profile. One thing. Resist the urge to make this fancy.</p></li></ol><p>You can build the whole stack on a Claude Code project with a daily cron, a single CLAUDE.md, and a few hundred lines of glue. I went through the basics of agents like this in <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">the first AI agent guide</a>, and the same shape applies here. If you would rather get the structured starter than wire one up from scratch, <a href="https://wiz.jock.pl/store">the agent playbooks on my store</a> include the patterns I lean on for this kind of personal automation.</p><p>Once you have run it for yourself for two weeks, then you can run it for a friend.</p><h2>What I Would Avoid Automating</h2><p>I want to be clear about the part I will not build, no matter how much someone asks.</p><p>The agent will not apply. It will not autofill a form, not click submit, not generate a cover letter and send it. Auto-apply is a temptation because it looks like leverage. It is not. The cover letter that gets the interview is the one the person writes after thinking about the company. Removing that step removes the part that matters. There is also a real cost on the other side: a recruiter reading twenty AI applications gets worse at recognising the human ones. Auto-apply degrades the channel for everyone using it.</p><p>I would also not chain the agent into &#8220;and if the role fits perfectly, schedule a call.&#8221; That is the failure mode I wrote about in <a href="https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5">the bounded agent post</a>. You want a clear edge between the agent&#8217;s territory and yours. Discovery and explanation on the agent side. Decision and action on the human side. The line stays clean and the agent stays useful.</p><h2>What This Cost Me, Roughly</h2><p>People asked on the live. The honest answer is that running the agent for one person, with morning searches and a reply pipeline, lands somewhere around a couple of dollars a day on a Claude subscription. Running it for several people is a multiple of that. Cost is not the constraint here. The constraint is the quality of the profile.</p><p>If you do want to think carefully about the cost side, especially after Anthropic&#8217;s <a href="https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026">Agent SDK pricing change on June 15</a>, the math gets sharper. A daily run that lives inside the interactive Claude Code session stays on the subscription. A daily run that goes through the SDK lands on the new separate credit. Pick the mode you actually want before you commit to a cron schedule.</p><h2>One More Thing About Building For The People You Love</h2><p>The reason I keep coming back to this agent is not the technical loop. It is what happens when a friend writes back two weeks in and says &#8220;the email got useful.&#8221; That sentence is worth more than any benchmark.</p><p>You build something for the people closest to you, and it changes the way you think about what an agent is for. Not productivity. Not scale. Not a leaderboard. Just one person, one morning, three roles, and a reason for each. If the agent does that well, it is doing the job.</p><p>Thank you to Wyndo and Dheeraj for the room on the One Shot Show, and to the people who showed up to watch. Watch <a href="https://aimaker.substack.com/p/ai-job-finder-agent-claude-code">Wyndo&#8217;s full writeup</a> for the audience-side view of the session. If you want me to walk you through a profile of your own, reply to this post. That is how it starts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>]]></content:encoded></item><item><title><![CDATA[Anthropic Repriced My Agent. Four Mitigations Before June 15.]]></title><description><![CDATA[Anthropic splits Claude Agent SDK billing on June 15, 2026. The $200 monthly credit will not cover a serious 24/7 agent. Here are the four mitigations I am testing right now.]]></description><link>https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 22 May 2026 09:05:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eGuI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eGuI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eGuI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eGuI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1556973,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/198814128?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eGuI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eGuI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a3cfffa-cbe2-4bdd-9afe-757acdda5c6e_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 took a week off from writing. The gap in the feed is mine.</p><p>It was not a wasted week. <a href="https://substack.com/@wyndo/note/c-262152027?r=1uvlvv&amp;utm_source=notes-share-action&amp;utm_medium=web">I did a live on Substack about the job finder agent</a> with <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Wyndo&quot;,&quot;id&quot;:556836,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zTXR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ac42946-717d-4e50-8477-551c5d7a3025_1638x1638.jpeg&quot;,&quot;uuid&quot;:&quot;7228ee1a-c27b-4d2b-bc34-6765b13c0d82&quot;}" data-component-name="MentionToDOM"></span> and <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Dheeraj Sharma&quot;,&quot;id&quot;:394741552,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!mIDa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3edd1f31-6669-445d-8285-dd01139794ab_1080x1080.png&quot;,&quot;uuid&quot;:&quot;83439dac-1e19-473e-8a69-5866cefe6547&quot;}" data-component-name="MentionToDOM"></span> &#8594; Agent I built for my friends and my family, the one that is helping them pursue new opportunities. The replay should be up on Sunday and I am genuinely happy with how it went. It was the calm half of the week.</p><p>The other half was doing mode. The news I am sharing in this post is the reason. And I am also sharing four solutions you can try before June 15, because that is the part I wish someone had handed me yesterday morning.</p><p>Here is the short version of the rollercoaster I just got off.</p><p>In April, my Claude Code usage on the Max plan got noticeably worse. Same prompts, same agent, much less runway before I hit the limit. I am not the only one who felt it, the forums are loud about it, and Anthropic itself acknowledged a capacity squeeze. So I did the thing I have been writing about for a while. I added Codex Pro to the stack and let it carry a chunk of the load. Different vendor, different harness, same agent jobs underneath. <a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">Codex earned its keep fast</a>, and after <a href="https://thoughts.jock.pl/p/claude-code-vs-codex-real-comparison-2026">two months running both side by side</a>, I had real evidence that GPT-5.4 inside the Codex harness held up as a peer for most of the work my Wiz throws at a model.</p><p>Then Anthropic got a lot of compute back. They <a href="https://www.anthropic.com/news/higher-limits-spacex">closed a deal with SpaceX</a> for the Colossus 1 data center, more than 300 megawatts and over 220,000 NVIDIA GPUs coming online within the month. Stacked on top of a 5 GW Amazon agreement, a multigigawatt agreement with Google and Broadcom, $30 billion of Azure capacity with Microsoft and NVIDIA, plus a $50 billion American AI infrastructure plan through Fluidstack. That is real compute. On May 6 they doubled the Claude Code five-hour limit for Pro, Max, Team, and seat-based Enterprise, and they permanently removed the weekday peak-hour throttle on Pro and Max. On May 13 they added a 50 percent weekly limit bump on top, running through July 13.</p><p>I was about to drop Codex. Sincerely. I was writing notes about consolidating back to a single subscription. With the new ceiling, my workload fit comfortably under Max.</p><p>Then last week, Anthropic <a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan">published the Agent SDK plan change</a>. And that is where it stops being nice.</p><h2>What Actually Changes On June 15</h2><p>Starting June 15, 2026, every programmatic use of Claude gets decoupled from your subscription plan limits. Concretely:</p><ul><li><p><strong>Claude Agent SDK</strong> (the Python and TypeScript SDKs)</p></li><li><p><code>claude -p</code>, the non-interactive print mode of Claude Code</p></li><li><p><strong>Claude Code GitHub Actions</strong></p></li><li><p><strong>Third-party apps</strong> that authenticate via the Agent SDK with your Claude subscription</p></li></ul><p>None of those count against your plan after June 15. They draw from a separate monthly Agent SDK credit. Pro gets $20 per month. Max 5x gets $100. Max 20x (the plan I am on) gets $200. Team Premium $100 per seat. Enterprise Premium $200 per seat. The credit refreshes monthly. It does not roll over. It is per user, not poolable across a team. And it requires a one-time opt-in to activate, after an Anthropic email scheduled for around June 8.</p><p>What stays on the plan: interactive Claude Code in the terminal or IDE, web chat, the mobile app, and Cowork. So if you sit at the keyboard and prompt Claude, that lives on Max. If your agent prompts Claude, that lives on the SDK credit.</p><p>When the credit runs out, two doors. If you have enabled extra usage, overflow flows to standard API rates on top of the subscription. If you have not, the request halts until the next monthly reset. You can read the official terms on the <a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan">Claude help center page</a>.</p><p>On paper, $200 a month sounds like free money. The framing is generous. The math is not.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is my workbench to test, experiment and do things. Subscribe if you like it: </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><hr></div><h2>Why $200 Is A Drop In The Sea For A 24/7 Agent</h2><p>Let me show what $200 actually buys when you run an agent that wakes overnight, runs through the day, and spawns subagents for parallel work.</p><p>At current rates, Claude Sonnet 4.6 is $3 per million input tokens and $15 per million output tokens. Claude Opus 4.7 is $5 input and $25 output per million. A modest agent call with around 50,000 input tokens and 5,000 output tokens lands at about $0.225 on Sonnet and about $0.375 on Opus, before prompt caching helps and before any reasoning tokens or tool calls inflate the count.</p><p>That is one call. A real agent shift is not one call. <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">My overnight shift</a> runs a planning pass, then it spawns several worker tasks in parallel, each of which calls Claude several times to use tools, read files, write changes, and produce a verifiable result. A single &#8220;go do this overnight job&#8221; can fan out into twenty or thirty model calls. Some of those are cheap. Some, when the agent decides it needs Opus to think harder about a refactor or an audit, are not.</p><p>Round it generously and a serious overnight run lands somewhere between $2 and $8 in API costs. Daytime wakes add more on top. The math at one $5 shift per day puts you at $150 a month, before any actual ambition. Push the ceiling and the $200 credit is gone in two weeks, easy. After that, every call lands at standard API rates on top of the subscription I am already paying for. Or the agent stops.</p><p>This is not a hypothetical. I have <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">written about my token bills before</a>. When I finally started measuring properly, the waste was embarrassing, and I still found that even the disciplined version of my agent burns more tokens than the credit would cover at full ambition. The whole reason I am on a flat subscription is that I do not want to be priced per call. Pay-per-token is a tax on building anything that runs while I sleep.</p><h2>Who Gets Squeezed First</h2><p>I want to be careful here. Anthropic is not a charity, and they have made the case (their CFO said it on the record, and several outlets picked it up) that some accounts were running thousands of dollars of API value through a $200 subscription. Splitting plan usage from SDK usage closes that gap. From a business angle, it is a clean move. I get it.</p><p>What I am less sure they fully internalized is who gets squeezed first. The casual user lives at the keyboard, gets the doubled limits, gets the 50 percent weekly bump, and is genuinely better off than a month ago. The squeeze lands one ring out, on the practitioner. The agent builder. The person <a href="https://thoughts.jock.pl/p/wiz-personal-ai-agent-claude-code-2026">running an autonomous Wiz overnight</a>, or the small team using Claude Code GitHub Actions to ship code without a human in the loop on every step. The people whose entire workflow is programmatic Claude. The most committed builders on the platform are the ones whose costs go up the fastest.</p><p>And those are exactly the people who are most likely to have, or to quickly add, a second harness.</p><h2>Four Mitigations You Can Try Before June 15</h2><p>None of these are theoretical. I tested all four this week and the first one is a working prototype on my Mac Mini. Read them as a stack, not as alternatives. The serious mitigation is layered.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IIQq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IIQq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 424w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 848w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IIQq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png" width="1456" height="981" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:981,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:436866,&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://thoughts.jock.pl/i/198814128?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.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_!IIQq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 424w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 848w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.png 1272w, https://substackcdn.com/image/fetch/$s_!IIQq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc995e0f-2fe0-4d2e-b026-53a27da81cae_2645x1782.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>1. Drive Interactive Claude Instead Of <code>claude -p</code></h3><p>This is the one I am most excited about, and the one I am least ready to publish in detail.</p><p>The interactive Claude Code session stays on your subscription after June 15. Only the print mode and the SDK move to the credit. So the question is whether you can take a job that currently runs as <code>claude -p "do X"</code> and instead run it as a real interactive session that opens, receives a prompt, executes the work, writes the result somewhere you can read, and closes itself. If you can, that work stays on Max forever, no SDK credit touched.</p><p>I have a working prototype as of last week. The shape: a small Terminal automation that opens Claude in a real terminal window via AppleScript, pastes the prompt through the system clipboard (Cmd+V into a bracketed-paste handoff), waits for the result file to land at a known path, and closes the window. End to end in under three minutes for a real task. I tested it by having the spawned session send an iMessage and write a JSON file, and both arrived clean.</p><p>I am not publishing the full script yet because the rough version has edge cases that will bite anyone who copies it. The production version needs to handle session cleanup, concurrency, the headless display setup, and a handful of failure modes I have only seen once. I will write that one up properly when it is solid.</p><p><strong>Honest caveat.</strong> Anthropic will probably patch the easy version of this. Driving an interactive TUI through clipboard paste is a clever workaround, not a sanctioned integration, and the moment it gets popular enough to register as a leak in the billing model, there will be a fix shipped against it. I am building this as a six-to-twelve-month bridge, not as permanent architecture. The orchestrator pattern (one job, one window, one result file) will keep working. The specific input-injection trick might not. Plan for that.</p><h3>2. Move Work To A Second Harness</h3><p>The cleanest mitigation, and the one I have already paid for, is to run a second harness on a different vendor and let it carry whatever fits.</p><p>I added Codex Pro under duress in April. The story I told myself was &#8220;this is temporary, I will consolidate once Claude stabilizes.&#8221; That story was wrong, and the wrong part was the framing. The Codex experience itself was fine (it is good, the GPT-5 series is good inside that harness, the experience is different but real). Diversification was never going to be temporary. I just did not see it yet.</p><p>The same thing happened to me on the inference layer. I opened an OpenRouter account because Claude had a bad morning and my agent had nowhere to send the request. Two days later I described that account as <a href="https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026">half insurance, half extension</a>. Insurance when the primary fails. Extension for capabilities I deliberately keep off the primary stack. The $20 of credits in OpenRouter is leverage I did not have before, for less than a coffee a week.</p><p>Codex Pro is the same shape on the harness layer. It is insurance on the days Anthropic has a capacity problem, an outage, a billing change, or a release that changes my workload economics under me. It is extension on the days everything is fine, because the OpenAI models are genuinely good at certain things, and running both lets me pick the right tool per task. The subscription buys deliberate architecture. I have written before about <a href="https://thoughts.jock.pl/p/claude-code-vs-codex-real-comparison-2026">what the two harnesses actually feel like after months of real use</a>. This is the mitigation that does not depend on Anthropic leaving any door open. They cannot patch your second subscription.</p><h3>3. Route Narrow Calls Through OpenRouter Or A Small Local Model</h3><p>Not every model call needs the smartest model on the planet. A surprising amount of my agent traffic is narrow stuff: classify this message, summarize this file, extract these fields, decide between two tool options. That work runs fine on Haiku, on GPT-4o-mini, on a cheap Gemini Flash call, or honestly on a small local model on my Mac.</p><p>So the third mitigation is to actually look at what your agent is sending to Claude and ask which calls deserve Opus, which can drop to Sonnet, and which can leave the Claude billing surface entirely. OpenRouter is the easiest way to route the &#8220;leaves Claude&#8221; set, because you keep one API and pick the model per call. <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">A small local model on a Mac Mini</a> is the easiest way to route the &#8220;leaves the cloud&#8221; set. Both shave real money off the SDK credit pressure without changing the shape of your agent.</p><p><em>Quick aside.</em> The cross-provider routing I run on my agent is packaged on my store as <a href="https://wiz.jock.pl/store/ai-model-switcher">the AI Model Switcher</a>. Same logic, same triggers, same identity prompt budget. If the June 15 change is making you think about diversification for the first time, this is the rung that gets you most of the way there.</p><div class="callout-block" data-callout="true"><p><em>Quick aside.</em> The cross-provider routing I run on my agent is packaged on my store as <a href="https://wiz.jock.pl/store/ai-model-switcher">the AI Model Switcher</a>. Same logic, same triggers, same identity prompt budget. If the June 15 change is making you think about diversification for the first time, this is the rung that gets you most of the way there.</p></div><h3>4. Audit And Trim Before The Deadline</h3><p>The least glamorous mitigation, and the one I would do first.</p><p>Spend an evening this week looking at what your <code>claude -p</code> usage actually does. Count the calls. Bucket them. How many are doing real cognitive work? How many are doing the same thing over and over (and could be cached, batched, or merged)? How many fire because of a cron job nobody has reviewed in three months? When I did this on my own stack I found a cron that was waking an agent every fifteen minutes to check a Discord state that almost never changed. That alone was several dollars of SDK credit per week, sitting on a default I had never questioned.</p><p>The waste is real. I have <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">written about my own token waste before</a>, and the only thing that fixed it was measuring properly. If you trim before June 15, you both shrink the credit pressure and learn where to focus the first three mitigations.</p><h2>A Small Add-On If You Do Not Want To Wire This Yourself</h2><p>While I was writing this, I packaged the four mitigations into a small add-on for the Claude Code agent you already run. It is called <a href="https://wiz.jock.pl/store/claude-sdk-audit-kit">the Claude SDK Audit Kit</a>, and it costs $9.99. Paid yearly subscribers get it for free, the rest of you get it at the price of a sandwich.</p><p>What it does. You hand the kit to your Claude Code, say &#8220;run the audit,&#8221; and it walks your repo, your cron, and your launchd plists, finds every <code>claude -p</code> call and Agent SDK import, estimates monthly cost on each plan, and writes a migration plan you can act on before June 15. The same four mitigations from this post are included as ready playbooks (with the AppleScript pattern, the Codex setup checklist, the OpenRouter routing recipe, and the trim labels), plus a migration spec template, a worked example from my own stack, and twelve months of updates as Anthropic ships follow-up pricing changes.</p><p>I am being honest that this is a thin add-on, not a flagship kit. The audit scripts are simple. The playbooks are short. The value is timing. If you wait until July to audit, your June bill already hurts. If you would rather build this yourself, the four sections above are enough. If you want it ready to run tonight, that is what the kit is for.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://wiz.jock.pl/store/claude-sdk-audit-kit/&quot;,&quot;text&quot;:&quot;Claude SDK Audit Kit&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://wiz.jock.pl/store/claude-sdk-audit-kit/"><span>Claude SDK Audit Kit</span></a></p><p>One more honest note. Mitigation 1 (driving interactive Claude) is probably a six-to-twelve-month bridge, not a forever solution. Anthropic will patch the easy version of that trick at some point. The kit treats it that way, and so should you. The other three mitigations do not depend on Anthropic leaving any door open.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>What I Take From The Rollercoaster</h2><p>The doubled limits felt good. They are real. The weekly 50 percent bump is real. The compute deals behind it (SpaceX, Amazon, Google, Microsoft and NVIDIA) are gigawatts of capacity being built right now. Anthropic is scaling, and they are pricing the scale in a way that fits their business. Fair enough.</p><p>Although the lesson for builders is the one I keep relearning. Single-vendor architecture is a comfort tax I do not want to pay. The cheapest, smallest, most embarrassingly small thing I can do to protect my agent is to keep a second harness alive on a different vendor and to keep my own stack honest about what it actually needs.</p><p>I will keep Codex. The $20 in OpenRouter stays. The interactive Claude bridge gets built properly over the next month, knowing it is a six-to-twelve-month bridge and not a forever solution. And the next time I catch myself writing &#8220;I do not need this second tool anymore,&#8221; I will read this post back to myself and put the credit card away.</p><h2>The Practical Takeaways</h2><ul><li><p><strong>The billing split is real and starts June 15, 2026.</strong> Agent SDK, <code>claude -p</code>, Claude Code GitHub Actions, and third-party SDK apps move off your plan limits. Monthly credits: $20 Pro, $100 Max 5x, $200 Max 20x. Opt-in required after the Anthropic email around June 8.</p></li><li><p><strong>The credit is generous in absolute terms and small for serious agent operators.</strong> A modest 24/7 agent will drain $200 in days, not weeks.</p></li><li><p><strong>Overflow flows to API rates if you enable extra usage.</strong> Otherwise the request halts until reset. Pick deliberately; do not get surprised.</p></li><li><p><strong>Mitigation 1: Drive interactive Claude.</strong> Interactive sessions stay on the subscription. The hack works today. Expect Anthropic to patch the easy version inside a year.</p></li><li><p><strong>Mitigation 2: Second harness.</strong> Codex Pro is the cleanest insurance. They cannot patch your second subscription.</p></li><li><p><strong>Mitigation 3: Route narrow calls elsewhere.</strong> OpenRouter, Haiku, a small local model. Stop sending classification work to Opus.</p></li><li><p><strong>Mitigation 4: Audit and trim.</strong> Cheapest mitigation. Do it first.</p></li><li><p><strong>Anthropic is scaling, hard.</strong> The compute is being built. The capacity is real. The pricing change reflects business reality. Plan accordingly.</p></li></ul><p>The agent will keep running. The architecture under it will be a little less elegant and a lot more honest.</p><div><hr></div><p><strong>Claude Code Workshop</strong></p><p>I track every billing change, model swap, and cost optimization across my live agent stack. The caching layers, model routing, and fallback architecture that keep costs reasonable are covered in the Claude Code Workshop. Updated with the June 2026 billing split patterns.</p><p><strong>$39</strong> at <a href="https://wiz.jock.pl/store/claude-code-workshop">wiz.jock.pl/store</a>. Free for paid subscribers.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Digital Thoughts! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/anthropic-agent-sdk-billing-split-mitigations-june-15-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[My AI Agent’s $20 Fallback Mechanism: Half Insurance, Half Extension]]></title><description><![CDATA[Why the fallback layer is the cheapest resilience you can ship, what the $20 actually buys you, and the capabilities I deliberately keep off the primary stack.]]></description><link>https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Thu, 14 May 2026 11:12:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JGzx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JGzx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JGzx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JGzx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4886017,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/197499944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.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_!JGzx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!JGzx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da90e06-4e52-495b-97bb-4da84aff2fbd_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>At 04:17 this morning my agent shipped one ugly line into the error registry: <code>Wake failed: supported providers exhausted</code>.</p><p>That is the worst error I can get. It means the primary failed, the model cascade inside the provider failed, the cross-provider hop failed, and the agent had nowhere left to send the request. Everything was my fault (because I am the architect of this thing). Although it cost me about thirty minutes to chase down the root cause, I really do not mind it. The agent did not go silent on me. It went silent on itself, queued the task, retried on the next cycle, recovered. That is the whole point of a fallback mechanism.</p><p>The reason that line stays rare and not common is one decision I made on day one of <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">running an agent that wakes up overnight</a>: park $20 of credits in OpenRouter. Not as a cost. As insurance. When my primary stack has a bad morning, that $20 absorbs the hit and the agent keeps running. And on the days when everything is healthy, the same $20 doubles as an extension cord for capabilities I deliberately keep off the primary AI agent architecture: image generation, long-context refactors, cheap classification. Insurance when things break. Extension when they do not.</p><p>This post is about the fallback mechanism itself: what it is, why every serious agent needs one, why local llm is not enough on its own, and what you actually buy with the $20. I will show you the rungs of my stack, the trigger conditions that flip between them, and the ~40 lines of Python that hold the whole thing together. Oh and one more thing - this is not an ad for Open Router. I just enjoy using it. </p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>Why Fallbacks Matter More Than People Want To Admit</h2><p>People building their first agent skip this step. I get it. You are focused on the cool part. The model is working, the prompts are clean, the agent shipped its first task. Fallbacks feel like a problem for later.</p><p>Then later arrives.</p><p>Top labs go down. Heavy load and fast shipping cycles tend to do that to a service. In the last 30 days, all three frontier providers have had a public bad day. <a href="https://status.claude.com/">Anthropic&#8217;s status page</a> logged elevated errors on May 5 and again on May 12, this time tagged against Claude API specifically. OpenAI had a roughly 90-minute outage on April 20 that surfaced as <a href="https://www.tomsguide.com/news/live/chatgpt-down-live-updates-outage-4-20-2026">8,700+ Downdetector reports in the UK and 1,900+ in the US</a>. Google Gemini had a widespread degraded window on May 5 too, the same day Anthropic was having a hard morning.</p><p>That is the part nobody talks about. A bad day at one frontier lab often lines up with a bad day at another. The herd of &#8220;they will not all be down at the same time&#8221; is partially true. It is also partially false on any given Tuesday.</p><p>Claude API&#8217;s published 90-day uptime sits at about 98.99% (the Anthropic status page reports this directly). Sounds great until you do the math. 98.99% over 90 days is roughly 21 hours of downtime. If your agent runs on a schedule, like mine does <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">overnight</a>, it runs during some of those hours.</p><p>Outages are one bucket. Here is the rest of what can knock a single-provider agent flat:</p><ul><li><p><strong>Rate limits.</strong> You hit a TPM or RPM ceiling mid-task. The agent sits in retry-backoff hell while the work piles up.</p></li><li><p><strong>Auth failures.</strong> OAuth token expires at 03:00. The nightshift dies at 03:01. Do not ask me how I know.</p></li><li><p><strong>Regional issues.</strong> A region degrades while the rest of the world is fine. Your traffic happens to land on the bad one.</p></li><li><p><strong>Model deprecation.</strong> An older model gets retired with two weeks notice. You forgot to migrate the one cron that still calls it.</p></li><li><p><strong>Capability gaps.</strong> Your primary does not generate images. Or does not have a long-context variant. Or does not have a cheap classification model.</p></li><li><p><strong>Cost spikes.</strong> A loop misbehaves at 2am and burns through credits on the most expensive model in your stack.</p></li><li><p><strong>Vendor lock-in.</strong> The day a provider raises prices or changes terms, you want options, not a migration project.</p></li></ul><p>A fallback mechanism fixes most of these at the same time. That is why it is the cheapest piece of resilience you can ship. And once you have it, the second half of the value (the extension side) shows up almost for free.</p><h2>Why Local LLM Is Not The Answer On Its Own</h2><p>I went deep on local. I <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">ran a 35B model on a $600 Mac Mini</a>. I <a href="https://thoughts.jock.pl/p/familiar-local-ai-agent-mac">built a local agent</a>. I <a href="https://thoughts.jock.pl/p/local-llm-macbook-iphone-qwen-experiment">measured what closes</a> and what does not between local and frontier. I love the work and I will keep doing it. And I <a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">almost fried my Mac Mini</a> trying to push the local tier too far, so I have receipts on the failure mode too.</p><p>Although I have to be honest about what local does well and what it does not.</p><p>Local is great for: classification, redaction, summarization, tight tool calls, &#8220;is this email worth waking me up,&#8221; local-only privacy work where the data must not leave the box, anything where the task is narrow and the prompt is bounded.</p><p>Local is not great for: anything I trust Opus to do <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">overnight</a>. Multi-step reasoning. Long-context refactors. Voice-sensitive writing. Anything where the wrong answer is worse than no answer. When I asked a local 8B to draft a comment in my voice, it produced something that read like a different person. When I asked Opus the same thing, it sounded like me on a good day. That is the gap.</p><p>Like, I want local llm to run on normal hardware, not on a $10k Mac Studio. That is why local is the cheap layer for the right kind of work. Routing a sensitive task to a small local model just because the cloud is down is &#8220;completes with a wrong answer&#8221; instead of &#8220;fails cleanly,&#8221; which is worse, not better. So local is one layer in my stack. The smart layer is something else.</p><h2>The Tool I Use For This Layer</h2><p>The mechanism needs an implementation. This is the one I picked.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pMII!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pMII!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 424w, https://substackcdn.com/image/fetch/$s_!pMII!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 848w, https://substackcdn.com/image/fetch/$s_!pMII!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 1272w, https://substackcdn.com/image/fetch/$s_!pMII!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pMII!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png" width="1456" height="890" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:258122,&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://thoughts.jock.pl/i/197499944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.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_!pMII!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 424w, https://substackcdn.com/image/fetch/$s_!pMII!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 848w, https://substackcdn.com/image/fetch/$s_!pMII!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.png 1272w, https://substackcdn.com/image/fetch/$s_!pMII!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb8b5ec-cf62-436e-9cdf-c19a8d21dadc_1627x994.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 aria-hidden="true" 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><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>One API. <a href="https://openrouter.ai/models">More than 400 models</a> behind it, from over 60 providers, as of May 2026. You top up credits, generate one key, and pick the model per request as a string: <code>anthropic/claude-opus-4.7</code>, <code>openai/gpt-5</code>, <code>google/gemini-2.5-pro</code>, <code>meta-llama/llama-3.3-70b-instruct</code>, and so on. Same key. Same SDK shape. One bill.</p><p>The pricing is published on <a href="https://openrouter.ai/announcements/simplifying-our-platform-fee">a clean fee announcement</a>: 5.5% on credit-card top-ups (with a $0.80 minimum), 5% on crypto. Per-token prices pass through at provider cost on most models. Bring-your-own-key gives you the first 1M requests per month free; after that, a 5% surcharge applies. So BYOK is not a free escape hatch forever, it is a generous free tier on top of bringing your own bill.</p><p>One myth worth killing while we are here: it used to be true that Claude on OpenRouter carried a meaningful markup vs Anthropic-direct. As of May 2026 the current Anthropic models (Sonnet 4.6, Opus 4.7) are priced identically on OpenRouter to the Anthropic API, $3 input and $15 output per million tokens for Sonnet, same as direct. The historical markup hung around the older Claude 3.5 Sonnet rate card. If you have not checked recently, check.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1SmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1SmD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 424w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 848w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 1272w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1SmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png" width="290" height="138" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:138,&quot;width&quot;:290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5937,&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://thoughts.jock.pl/i/197499944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.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_!1SmD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 424w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 848w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 1272w, https://substackcdn.com/image/fetch/$s_!1SmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b862285-47ed-4ba3-9f32-1d0e678b4b46_290x138.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The interesting math is below Claude, not on top of it. Meta&#8217;s Llama 3.3 70B on OpenRouter sits at about <a href="https://openrouter.ai/meta-llama/llama-3.3-70b-instruct">$0.10 input and $0.32 output per million tokens</a>. That is roughly 30x cheaper on the input side and 47x cheaper on the output side than Sonnet 4.6 at $3 / $15. The classification step in your pipeline does not need Sonnet. It needs Llama or Haiku. OpenRouter lets you make that choice per call, not per project.</p><h2>The Five Rungs Of My Stack</h2><p>Here is the resilience layer in my agent, top to bottom. Each rung has a trigger that flips to the next one.</p><ol><li><p><strong>Primary call.</strong> Claude Opus 4.7 for complex work, Sonnet 4.6 for default, Haiku 4.5 for cheap fan-out. The model is picked per task based on the task&#8217;s stakes, not globally.</p></li><li><p><strong>In-provider cascade.</strong> If Sonnet 5xx&#8217;s or times out, the harness retries on Haiku before bailing on Anthropic. Cheap, same provider, often the recovery is invisible.</p></li><li><p><strong>Cross-provider hop.</strong> If the whole Anthropic surface is unhealthy, I run the same prompt through Codex (GPT-5 via the OpenAI CLI). Different vendor, different harness, same job. This is the one that <a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">earned its keep</a> when I built the model switcher.</p></li><li><p><strong>OpenRouter degraded mode.</strong> If both vendor CLIs are unreachable (network, auth, status pages red), the watcher scripts call OpenRouter directly with a stripped-down identity prompt and a small open-weight model. The reply is prefixed with <code>[Fallback Mode]</code> so I know what I am reading.</p></li><li><p><strong>Queue and retry.</strong> If everything is on fire, the task gets stamped with a retry timestamp and re-tried on the next cycle. The agent never just drops a task.</p></li></ol><p>Rungs 1, 2, 3 are model and harness routing. Rung 4 is OpenRouter doing the work the harness cannot. Rung 5 is the safety net under all of it.</p><p>One thing to call out about rung 3: the cross-provider hop is the most important rung in practice, because most outages are full-vendor outages, not model-specific. If Anthropic is down, it is usually down for everything. Hopping Sonnet to Haiku does not help. Hopping to Codex does. The April-May 2026 incident pattern (Anthropic May 5 plus May 12, OpenAI April 20, Gemini May 5) is exactly the case for diversity at the vendor level, not the model level.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>How To Actually Wire It Up</h2><p>The setup is embarrassingly small. Make an account at <a href="https://openrouter.ai">openrouter.ai</a>. Top up $20. Generate a key. Drop it in your agent&#8217;s secrets file (mine lives at <code>global/secrets/openrouter.md</code>, never in code).</p><p>Then the fallback path itself. I will show the pattern I actually use, simplified for the post. It is about 40 lines of real Python.</p><pre><code>OPENROUTER_URL = &#8220;https://openrouter.ai/api/v1/chat/completions&#8221;
FALLBACK_MODEL = &#8220;google/gemini-3-flash&#8221;  # cheap, fast, reliable
FALLBACK_NOTICE = &#8220;[Fallback Mode] Primary unavailable. &#8220;

def call_primary(prompt):
    # your normal Claude / Codex / Bedrock call
    ...

def call_openrouter(prompt):
    headers = {&#8221;Authorization&#8221;: f&#8221;Bearer {load_key()}&#8221;}
    payload = {
        &#8220;model&#8221;: FALLBACK_MODEL,
        &#8220;messages&#8221;: [
            {&#8221;role&#8221;: &#8220;system&#8221;, &#8220;content&#8221;: load_identity_prompt()},
            {&#8221;role&#8221;: &#8220;user&#8221;, &#8220;content&#8221;: prompt},
        ],
    }
    resp = requests.post(OPENROUTER_URL, json=payload,
                         headers=headers, timeout=60)
    resp.raise_for_status()
    text = resp.json()[&#8221;choices&#8221;][0][&#8221;message&#8221;][&#8221;content&#8221;]
    return FALLBACK_NOTICE + text

def reply(prompt):
    try:
        return call_primary(prompt)
    except (TimeoutError, ProviderError, AuthError) as e:
        log_fallback(reason=str(e))
        return call_openrouter(prompt)</code></pre><p>That is the shape. The interesting bits are around it.</p><p><strong>Trigger conditions.</strong> Not every error should flip to fallback. A 400 (bad request) is your bug, not the provider&#8217;s. A 429 (rate limit) should retry with backoff first. Real fallback triggers are: timeouts, 5xx server errors, 401 auth errors after a single re-auth attempt, repeated 429s past your retry budget, and the explicit &#8220;all providers down&#8221; signal you build into your harness. In my stack the trigger flags live in <code>automation/lib/resilience.sh</code>.</p><p><strong>Identity prompt budget.</strong> When I fall back to a smaller open-weight model, I do not send the full Claude system prompt. I send a stripped-down identity prompt (SOUL.md, ~1.3KB) plus a &#8220;fallback coda&#8221; that tells the model how to behave under degraded conditions. The big primary system prompt is too long for a 9B model to handle in 120 seconds. Tailor what you send to the model&#8217;s context budget.</p><p><strong>Cache the system prompt.</strong> The system prompt is identical across calls. Cache it (file read once per process, or actual provider-side prompt caching where supported, which I wrote about under <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">token waste management</a>). You will burn tokens if you reload it on every request.</p><p><strong>Visible degradation.</strong> The user always knows when the response came from a fallback. The <code>[Fallback Mode]</code> prefix is non-negotiable. The worst pattern is a silent quality drop where the user thinks they got Opus and got a 9B. Tell the truth, every time.</p><p><strong>Cost gate per task.</strong> Some tasks are not worth $0.30 of Opus tokens. Route low-stakes work to <code>google/gemini-2.5-flash</code> or <code>meta-llama/llama-3.3-70b-instruct</code> by default. Llama 3.3 70B at $0.10 / $0.32 per million tokens is roughly an order of magnitude cheaper than Sonnet on output, and for classification or redaction it is more than enough. Reserve the expensive model for work that earns it.</p><p><strong>Test by killing the primary.</strong> The only way to know your fallback works is to test it. Once a quarter I invalidate the Claude key for ten minutes during a scheduled wake and watch the agent respond through OpenRouter. If it does not, the bug is mine, not the day I have an actual outage.</p><div class="callout-block" data-callout="true"><p><em>Quick aside.</em> If you want the end-to-end picture (prompts, harness wiring, watcher scripts, the full set of routing rules), I packaged the model-switcher and fallback architecture as <a href="https://wiz.jock.pl/store/ai-model-switcher">the AI Model Switcher</a> on my store. Same routing I run on this Mac Mini, after the experiments. <a href="https://wiz.jock.pl/store">The Wiz Store</a> has the broader Agent Builder Pack if you want the whole stack.</p></div><h2>The Extension Half: Capabilities I Keep Off The Primary Stack</h2><p>Insurance is why I opened the account. Extension is what kept me using it.</p><p>The $20 sitting in OpenRouter is not just backup for when the primary breaks. It is also where the agent goes for things I deliberately do not want native in its primary architecture. Anthropic does not generate images, and I do not want another SDK, another auth flow, and another billing line living inside the core agent loop just to support a header image. So image generation lives on the extension side. The agent calls <a href="https://openrouter.ai/google/gemini-2.5-flash-image">Gemini 2.5 Flash Image (Nano Banana)</a> and Nano Banana Pro through the same OpenRouter key when a blog post needs a header or a <a href="https://thoughts.jock.pl/p/familiar-local-ai-agent-mac">Forge prototype</a> needs a mockup. From the agent&#8217;s point of view it is just another dispatch. From my point of view the agent grew an arm.</p><p>Same logic for evals (compare three models on the same prompt without standing up three SDKs), for the long-context work that does not fit cleanly in Claude&#8217;s window, for the cheap reasoning passes I do not want to spend Opus tokens on, and for the open-weight curiosity calls I want to make without standing up a whole new vendor relationship.</p><p>Each one of those is something I could fold into the primary stack. None of them earn that complexity. They live on the extension side instead, on the same $20 that already pays for the insurance half.</p><h2>What I Would Tell You If You Were Starting Today</h2><p>If you have zero fallback wired right now: open the OpenRouter account this week. Wire one fallback call against your existing primary. Test it by killing your primary key for ten minutes and watching the agent respond. The whole thing is one afternoon of work.</p><p>If you already have an agent in production: count how many places in your code have a hard dependency on a single provider&#8217;s SDK. Each one is a future outage you will wear personally. Wrap them.</p><p>If you have been waiting for local llm to be &#8220;good enough&#8221; to be the fallback: local is the cheap layer for narrow work. OpenRouter is the smart layer for everything else. Use both, in that order, for the right kinds of work. The compounding wins from an autonomous system come from <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">leverage</a>; the losses come from a stack that has not been stress-tested.</p><p>The $20 is not money I lost. It is insurance against the morning my primary has a bad hour, and an extension cord for the capabilities I deliberately keep off the primary stack. Both halves earn their place on a quiet week, and the loud weeks pay for the quiet ones a hundred times over.</p><p>The agent is going to keep waking up at strange hours and trying to ship work while I am asleep. Some of those mornings the primary will be down. I want the worst line in my error log to stay rare. That is what the insurance half is for. And on the calm mornings, that same $20 lets the agent generate images, run cheap classification passes, and reach for a long-context model when one is needed. Half insurance. Half extension. All of it for the price of a dinner.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/openrouter-fallback-multi-provider-ai-agent-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div class="callout-block" data-callout="true"><p>If any of this resonates: I write everything I learn here, twice a week, free. A <a href="https://thoughts.jock.pl/subscribe">free subscription</a> is the only thing you need for the full picture. The 10% that ends up working long enough to package, like <a href="https://wiz.jock.pl/store/ai-model-switcher">the Model Switcher</a>, lives on <a href="https://wiz.jock.pl/store">the Wiz Store</a> for paid subscribers. Both are fine for me. Both keep me writing.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://wiz.jock.pl/store/&quot;,&quot;text&quot;:&quot;Wiz Store&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://wiz.jock.pl/store/"><span>Wiz Store</span></a></p><p></p><div><hr></div><p><strong>AI Agent Night Shift Playbook</strong></p><p>The $20 I spend on OpenRouter is the cheapest production resilience I know. How to wire it up, when to trigger it, and what not to route through it is one chapter in the Night Shift Playbook. The full fallback architecture, LaunchAgent setup, and safety boundaries are in there.</p><p><strong>$19</strong> at <a href="https://wiz.jock.pl/store/night-shift-playbook">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[I Built a Self-Improving AI Agent. Here Is What Made It Learn.]]></title><description><![CDATA[The corrections loop. Six months in. Here is what actually made my agent learn.]]></description><link>https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent</link><guid isPermaLink="false">https://thoughts.jock.pl/p/i-built-a-self-improving-ai-agent</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 12 May 2026 11:31:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ndii!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ndii!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ndii!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ndii!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4716082,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/197331319?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.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_!Ndii!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!Ndii!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d41e233-f4ae-47e8-a137-b9b9fc607698_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>The setup, because this only works if the rest of the stack is calm</h2><p>I have been going through more changes on my AI agent recently. I have been transparent about that here as I go, post by post, and today I want to write about the one layer I depend on the most. But I have to start with how I got to the point of being able to ask &#8220;how does my agent actually learn from me?&#8221; That part of the story is a little messy and I think it matters.</p><p>When I started this project in October 2025, the first thing I built for the agent was its own task manager. A control panel, a dashboard. I went deep on it. I built it native on iOS, native on macOS, and as a web app, all wired together. It worked. For two or three months it was genuinely great.</p><p>The problem with self-made software is that you have to maintain it. There is no version of &#8220;I reached a level of polish I was happy with, and then I forgot about it.&#8221; The dashboard needed constant feedback. What should it show? What should it hide? Where was it pulling data from this week that it had not been pulling last week? It was also burning more tokens than I wanted to think about. So I switched. I moved to a small open-source kanban called Fizzy with a thin shim of my own. That was a quieter setup that I held for a while, and I wrote about the move in detail in <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">the post on replacing my custom dashboard</a>.</p><p>Fizzy was good. I was still struggling with one thing though. I needed to be able to orchestrate the agent and also see the projects I was working on from a longer distance. Day-to-day kanban is one job. Stepping back to see what was actually shipping over a month was another. So I made a small personal scratchpad of my own called <a href="https://experiments.jock.pl/">experiments.jock.pl</a>. It is not for everyone, not everything I am working on is on it, but it gave me a place to lay out the experiments I had in motion at a higher altitude than the task list. That helped, but it was still mine to maintain, and I had the same problem I had with the original dashboard.</p><p>What actually solved it was a tool I have used for years and had stopped thinking about. Basecamp. They shipped a dedicated CLI for agents recently, and the whole picture clicked for me. The CLI is what makes the agent side work. The other half of why it clicked, on my side, is the card table inside Basecamp. It is essentially the same clean kanban I liked in Fizzy, but built in. I get the lens I was rebuilding by hand, plus everything else Basecamp does, plus the CLI, all in one place. The agent can read projects, comment on cards, file new ones, complete them, all from the same place I am working. I have tried a lot of pieces of AI infrastructure in the last year and most of them are good enough. This one feels different. Another level, honestly. I can see the whole stack of work at the right altitude. I can move things around. If something is a bigger project I carve out a separate space for it. The board does what I would have spent two more months building for myself, and it does it better.</p><p>This is the setup I have been settling into over the last few weeks. The short version is that I have been replacing my custom software with shims on top of mature tools, and so far the replacements keep winning. I write about why I still keep building most of my own stack in <a href="https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026">building your own things is cool too</a>. The corrections loop is one of the things that only became visible once everything else around it had calmed down.</p><div class="callout-block" data-callout="true"><h2>A small commercial in the middle, on theme</h2><p>Speaking of evolution. Yesterday I shipped a fresh round of updates to a bunch of products on the <a href="https://wiz.jock.pl/store">Wiz store</a>. Paid subscribers and buyers should already have an email about it. The agent playbooks, the model switcher pack, the nightshift bundle, a few of the smaller kits, all refreshed. There is also one new kit I will come back to a little later, because it is the bundle for exactly this post. If you have an older version of anything in the store, the new one drops in clean. If you do not have any of them, the store page will tell you what changed in each kit. I am mentioning this here because it is on theme. The point of the rest of this post is that nothing in a working agent stays still for long. The store products move with the stack, because the stack moves with the work.</p></div><h2>What corrections actually look like, when you work with an agent every day</h2><p>OK. On to the actual subject.</p><p>When you work with an agent every day, most of the time you are not writing prompts. You are watching the agent do something and quietly thinking &#8220;no, not quite like that.&#8221; Then you say so. Five words. &#8220;I would not link that.&#8221; &#8220;Use plain text here.&#8221; &#8220;Stop confirming every step.&#8221; Each of those is a correction, and the unspoken contract between you and the agent is that you should not have to say it twice.</p><p>The best systems for this are the ones that catch corrections without you having to do anything special. You correct in chat, in your normal voice, and behind the curtain the system decides &#8220;this is something I should think about for the future,&#8221; files it where it belongs, and makes sure the next session that boots on this machine knows about it. You do not stop and write documentation. You do not open an admin panel. You just keep working, and the agent keeps absorbing.</p><p>That is what I have been building for the last few months. The corrections loop is the part of the agent that decides what to do with the small &#8220;no, not like that&#8221; moments and where to file them so they outlive the session they happened in. It is the layer I depend on the most, because it is the one that makes the agent feel like an actual coworker instead of an autocomplete. It is also the layer that makes the agent slowly start to feel like more of you, rather than more of the model.</p><h2>A quick word on how the agent started</h2><p>For context. My agent started in October 2025. Almost everything about it was rough back then. Sometimes the output came back cold, sometimes it just did the wrong thing in a polite way. I used to write very long prompts to deal with that. I would describe the task, then add a paragraph at the end explaining how I wanted it done, what tone I wanted, where to file the output, what to skip. Every session, over and over. The output was usually good when I did all of that. The cost was that I had to do all of that every time.</p><p>That is not a stable way to work. It scales for the first week and then you get tired of writing the same paragraph again. The thing that quietly changed everything was the agent gathering enough data on me, both from the work we had done together and from the corrections I had made along the way, that the explaining paragraph slowly stopped being necessary. It is still there in some shape. It just lives in files now, not in the prompt window. The agent walks into the room already carrying it.</p><p>The corrections loop is the part of that I want to focus on, because it is the one piece you can copy without copying everything else.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>The architecture, in three stages</h2><p>The pipeline is named the way most of my plumbing is named, badly and on purpose. <strong>Capture, classify, graduate.</strong></p><p><strong>Capture.</strong> The moment the agent spots a correction in chat, any session can call a single helper:</p><pre><code>python3 automation/self-improve/correction_capture.py add \
    --text &#8220;&lt;the correction&gt;&#8221; \
    --source cli \
    --context &#8220;&lt;what I did&gt;&#8221;</code></pre><p>That writes one line to a JSONL queue. It also opens a card in Basecamp so I can see the correction landed somewhere and so I can comment on it. No model call. No retries. Capture has to be cheap, or the agent will silently stop doing it under pressure.</p><p><strong>Classify.</strong> The same helper passes the message through a small regex map. Seven patterns mapping to six kinds. The kinds are <code>skill_misuse</code>, <code>memory_update</code>, <code>behavioral</code>, <code>rule</code>, <code>preference</code>, and <code>unknown</code>. &#8220;Stop doing X&#8221; comes out as <code>rule</code>. &#8220;I prefer X&#8221; comes out as <code>preference</code>. &#8220;You used the X tool wrong&#8221; comes out as <code>skill_misuse</code>. Each kind has a default action attached, so the next stage knows what to write. The patterns themselves live in <code>correction_capture.py</code> lines 50 to 92. They are short, and writing them taught me what corrections actually look like at scale better than any post I could read on the topic.</p><p><strong>Graduate.</strong> Every night a separate process drains the queue. For each pending entry, it picks the right place to file the artifact, writes it, and only then marks the entry resolved. The rule, baked into the agent&#8217;s own playbook, is <em>a correction never expires unaddressed.</em> If the nightly drain cannot fully handle one, it has to leave it pending with a note. It is not allowed to silently drop one.</p><p>That last line is the part that took me the longest to actually believe in. Queued things age, in any system. Once one ages enough, the agent stops feeling like it learns and starts feeling like it just covered the easy stuff. Forcing the queue to either drain or escalate is the only way I have found to keep that from happening. The nightly drain is part of a wider <a href="https://thoughts.jock.pl/p/ai-agent-runs-overnight-setup-guide-2026">overnight job loop</a> on my machine. The corrections drain is one of the cleanest jobs in that loop.</p><p>A real recent example. One night Atlas, the agent persona that does research for me, returned a list of hallucinated Reddit thread IDs. None of the URLs resolved. A correction landed in the queue, classified as <code>memory_update</code>. By the next morning there was a new feedback memory file with a single rule attached. <em>Atlas cannot hit reddit.com directly (403). Fetch via Firecrawl or browser-playwright first, then pass verified URLs.</em> Every Atlas-flavored session that has booted since has loaded that line. Same failure has not come back.</p><h2>&#8220;Memory&#8221; is one word covering four jobs</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iz_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iz_R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 424w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 848w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 1272w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iz_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png" width="1456" height="1485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:246287,&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://thoughts.jock.pl/i/197331319?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.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_!iz_R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 424w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 848w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.png 1272w, https://substackcdn.com/image/fetch/$s_!iz_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2a8692a-8e1f-4b59-b806-d34ace885557_1906x1944.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 aria-hidden="true" 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><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>Here is the part nobody writes about.</p><p>When you start, &#8220;memory&#8221; feels like one thing. You imagine a notebook the agent keeps. You imagine writing into it. You imagine retrieval. That is the abstraction every product page uses, and it is the wrong abstraction. <a href="https://atharvm.medium.com/no-chatgpt-doesnt-remember-you-how-context-windows-fake-memory-cc4b6c944227">Atharv Malve put it cleanly</a> last summer. The model is not really remembering your past messages. It is just seeing the history again, every single time. Once you internalise that, you stop looking for the one memory feature and start asking what you actually need stored, by whom, for how long.</p><p>What I actually needed turned out to be four different sinks. They are not interchangeable. Learning the differences was half the work.</p><p><strong>Sink one is working memory.</strong> Short-lived. The current week&#8217;s plans, the half-finished thoughts, the active conversation context. Lives in a single small file called <code>memory.md</code>. It is supposed to decay. Treating it as durable is the original sin.</p><p><strong>Sink two is lessons.</strong> Full incident logs. When something goes wrong in a way I want a future session to learn from, the lesson lands in <code>lessons.md</code> with the trigger, the root cause, the fix, and a list of keywords. I have 274 lines of these going back to February. They read like engineering postmortems, because that is what they are. The public version of this file is roughly <a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">the mistakes anthology I wrote last month</a>.</p><p><strong>Sink three is feedback memories.</strong> Per-rule files in a durable memory directory. Each one is a single rule with a &#8220;Why&#8221; line and a &#8220;How to apply&#8221; line. Linkable, deletable, deduped. When the same correction comes up twice, the second time it gets its own file. It also gets a tiny pointer in a master index that the agent always loads on startup. Two-level indirection, so the index stays small.</p><p><strong>Sink four is rule lines in the always-loaded index.</strong> These are the ones I wake up next to. A handful of <code>**RULE: ...**</code> lines at the top of the master index, all caps, the smallest set of behaviors I refuse to relitigate. &#8220;Verify deliverables. Show proof or keep task open.&#8221; &#8220;Match work topics against existing WizBoard tasks and complete them when done.&#8221; A rule earns its place at this level only after it has come back more than once.</p><p>And then there is the sink I did not plan for and would not give up now. <strong>The Behavioral Learning card table inside Basecamp.</strong> My WizBoard project has a small card table on it called Behavioral Learning, and every single correction the agent captures lands there as its own card. I can read the card, push back on it, fold two cards into one, or trash one that is wrong. Corrections become reviewable, not silent. That part matters. I will say more about why in the next section, but the short version is that if you let the model grade its own corrections in private, you have already lost.</p><p>If you take one thing from this post, take this. &#8220;Memory&#8221; as one concept is the wrong abstraction. Build sinks for different lifespans. Working memory is fast and disposable. Lessons are slow and durable. Feedback memories are searchable rules. Top-level rules are non-negotiable. The Behavioral Learning card table is the human-in-the-loop that keeps the rest honest. Different jobs, different files, different decay curves. I wrote about how rules in particular shape an agent in <a href="https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5">the bounded agent</a>. Most of &#8220;memory,&#8221; once you look at it long enough, turns out to be rules.</p><h2>Does it actually work?</h2><p>Yes and no.</p><p>Here is what I can see in my own metrics. I have an autonomous improver that runs nightly and writes a <code>metrics.json</code> with a seven-day window, a thirty-day window, and a longer view. As of this morning, my agent received 22 corrections in the last 30 days. In the last 7, that number is 18. The trend line is down, and the system flags it explicitly with <code>valence: good</code>. Errors total across all categories is also drifting down, by less.</p><p>I do not want to present this in a single direction. The task success rate is 93.5 percent over 30 days, with a small dip in the last seven, from 93.5 to 92.6. So I am not going to pretend the picture is clean. Some weeks the agent gets worse. The point is that the corrections themselves are showing up less often, and when they do show up they are landing in places I can act on.</p><p>What the corrections actually look like, beyond the totals, is more interesting. A separate analyzer scans the captured corrections for repeating themes. As of this morning it has flagged two. One it calls <code>incomplete</code>, which is me catching the agent finishing a task that was not fully done. The other it calls <code>repeated_mistake</code>, which is a fix that came back. The analyzer is also allowed to propose a new rule when it finds a theme strong enough, and both of the rules it proposed have already graduated to the top-level RULE lines I quoted earlier. &#8220;Verify deliverables. Show proof or keep task open.&#8221; came out of the incomplete pattern. &#8220;ESCALATE if same mistake recurred. Strengthen the rule or fix the trigger.&#8221; came out of the repeated_mistake pattern. That is the loop closing on itself, in real data I can read off the file.</p><p>One more honest note. Thirty days of declining corrections is not proof of generalization. It is a trend on one user, on one workload, on one machine. The agent could be getting quieter rather than smarter. The way I keep myself honest about that is the Behavioral Learning card table I described. I see every correction. I can see which kinds keep coming back. The bar I am holding myself to is &#8220;fewer repeats of the same mistake,&#8221; not &#8220;an agent that never breaks.&#8221; On that narrower bar, the data is encouraging.</p><p>Measurement of this kind is also why I cared so much about token cost a few weeks ago. If you cannot count what your agent is doing, you cannot tell whether it is improving or just drifting. I wrote about that in <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">the post on token waste on Opus 4.7</a>. Same instinct, different file.</p><div class="callout-block" data-callout="true"><p><em>This is the new kit I mentioned earlier.</em> My paid subscribers can already grab the <a href="https://wiz.jock.pl/store/behavioral-learning-kit/">Behavioral Learning Kit</a> on the Wiz store. It is the architecture I just walked through, packaged. The actual <code>correction_capture.py</code> and <code>correction_graduator.py</code>, the four memory-sink templates, the Basecamp card-table playbook (adaptable to Linear, Notion, or Trello), a CLAUDE.md snippet for agent integration, and a setup script that wires the rest together. Free with a yearly subscription. Included in the one-free-product-per-month allowance for monthly subscribers. $29 standalone if neither of those is you.</p></div><h2>What would break it, and what I would build next</h2><p>The fragile part is the classifier. Seven regex patterns is enough to label most corrections, but <code>unknown</code> still shows up too often to ignore. When an entry lands as <code>unknown</code>, the nightly drain picks it up, but the action it should take is no longer automatic. The fallback is that I or one of my future sessions has to retag the row by hand. Replacing the regex with a small LLM call would solve the labeling problem and create two new ones. Latency and cost. It would also create a softer problem, which is the one that scares me more.</p><p>If you let the model grade its own corrections in private, you get an agent that learns the wrong lessons confidently. Yohei Nakajima wrote about this risk in <a href="https://yoheinakajima.com/better-ways-to-build-self-improving-ai-agents/">his note on better ways to build self-improving agents</a>. His phrasing is the one I keep coming back to. The model can hallucinate bad reflections and reinforce them. That is the failure mode for any self-improving loop. The Behavioral Learning card table is what keeps that from happening on my setup, and it is the part I would build first if I were building this for someone else.</p><p>There is one more bigger picture thing. The reason I can talk about this layer with confidence is the architecture it sits inside. I wrote the long version in <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">my AI agent knows who I am</a> earlier this year, where I walked through the ten layers I use to make the agent feel coherent over time. The corrections loop is one of those layers. It is the one I depend on most, because it is the one that most directly changes the agent&#8217;s behaviour rather than its memory.</p><p>If you have not yet noticed one of your own fixes coming back at you, you will. When you do, the move is not to add more memory. It is to build a small queue, decide what your sinks are, make sure no correction can quietly age, and then put a human-readable surface on top of it so you can see what the agent is teaching itself. The agent that comes out the other side of all that does not just remember more. It starts behaving like more of you.</p><div class="callout-block" data-callout="true"><p>The free subscription gets you every build log on this stack, including the next one. The store has the small bundles for people who would rather skip a few of the walls I walked into, and as I mentioned earlier most of those bundles were just refreshed. Both are fine for me.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p><div><hr></div><p><strong>Self-Improving Agent Kit</strong></p><p>The corrections loop, lesson archival, and self-heal architecture from this post are packaged as the Self-Improving Agent Kit. It includes the exact files Wiz uses, plus a setup guide for wiring it to your own agent without having to build all this from scratch.</p><p><strong>$49</strong> at <a href="https://wiz.jock.pl/store/self-improving-agent">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[How to Use Git(hub) When You’re Building with AI (Basics)]]></title><description><![CDATA[The checkpoint system that makes building with AI agents actually survivable.]]></description><link>https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Thu, 07 May 2026 09:37:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hd2E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hd2E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hd2E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hd2E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1459913,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/196757127?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hd2E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hd2E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfc943b8-0185-4c76-b8ef-85c094f32094_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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><div class="callout-block" data-callout="true"><p><strong>This is part three of my Basics series.</strong> The first post was about <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">how I structure CLAUDE.md after 1,000+ sessions</a>, the instructions file that tells your AI agent who it is and how to behave. The second was <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">a step-by-step guide to building your first AI agent from scratch</a>. This one covers something I probably should have put first: version control. Why you need it, what it actually is, and how to use it when AI is doing some of the building.</p></div><p>If you&#8217;ve ever lost an hour of progress in a game because you forgot to save, you already understand why Git exists.</p><p>You&#8217;re deep in a dungeon. The boss took 40 minutes. You made one wrong move, got killed, and your last save was way back at the start of the level. That hour is just gone. No trace of what you tried, no checkpoint to return to, nothing.</p><p>Building software without version control feels exactly the same. Especially when AI is part of the building process.</p><p>I&#8217;ve been running my own AI agent since late 2025. It builds things, makes decisions, modifies files, runs overnight. It also makes mistakes. Sometimes it introduces a bug deep in the architecture and I wake up to something that doesn&#8217;t work anymore. Without proper commits, I&#8217;d have no idea what changed. With them, I open the history, read back through what happened, and roll back to the last clean state in under a minute.</p><p>This post is for people who are starting to build with AI tools, vibe coding with Cursor or Claude Code or Codex, or running their first experiments with autonomous agents. Git probably sounds like a developer thing. It is. It&#8217;s also one of the most useful habits you can build as a builder of anything, regardless of how technical you are.</p><div><hr></div><h2>First: Git is not GitHub</h2><p>This confusion trips up almost everyone who starts. I had it for longer than I want to admit.</p><p><strong>Git</strong> is a tool. Software you install on your computer. It tracks changes to your files over time and saves snapshots of your project whenever you ask it to. It&#8217;s free, open source, and runs entirely on your machine. It has nothing to do with the internet. Git was created in 2005 by Linus Torvalds (the person who also created Linux) and has become the standard for version control across the entire software industry.</p><p><strong><a href="https://github.com/">GitHub</a></strong> is a website. A cloud service that stores your Git repositories remotely. A place to back them up, share them with others, and access them from anywhere. GitHub is owned by Microsoft and is where most public open-source code lives.</p><p>The relationship is like the difference between a text file and Google Drive. The file exists on your machine whether or not you upload it anywhere. Git works whether or not you ever create a GitHub account.</p><p>Why does this matter? Because GitHub is not your only option, and I think a lot of people avoid the whole topic because they assume it means signing up for something owned by Microsoft and making their work public. Neither of those things has to be true.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pvOI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pvOI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 424w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 848w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 1272w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pvOI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png" width="1456" height="1076" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1076,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454249,&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://thoughts.jock.pl/i/196757127?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.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_!pvOI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 424w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 848w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.png 1272w, https://substackcdn.com/image/fetch/$s_!pvOI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f1be5a-eb06-4bb4-8c88-54d071bf1b50_2801x2070.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 aria-hidden="true" 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><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 main alternatives worth knowing:</p><ul><li><p><strong><a href="https://gitlab.com/">GitLab</a></strong>: the most comprehensive alternative. Does everything GitHub does (repositories, issue tracking, code review) plus built-in CI/CD pipelines for automated testing and deployment. Can also be self-hosted on your own server if you want full control. Good option if you want more features baked in.</p></li><li><p><strong><a href="https://codeberg.org/">Codeberg</a></strong>: run by a nonprofit organization based in Germany. GDPR-native from the ground up, no data selling, and they explicitly don&#8217;t train AI models on your code. Free, donation-funded, no ads, no tracking. If privacy and data sovereignty matter to you (especially if you&#8217;re in Europe), this is the serious alternative.</p></li><li><p><strong><a href="https://forgejo.org/">Forgejo</a></strong>: open-source and self-hosted. You install it on your own server and run your own Git hosting. Lightweight, modern interface, GitHub-compatible. If you want complete control over your code and have a machine to run it on, this is the path.</p></li><li><p><strong><a href="https://bitbucket.org/">Bitbucket</a></strong>: made by Atlassian, integrates tightly with Jira and Confluence. If your team is already using those tools, Bitbucket fits naturally.</p></li></ul><p>All of these speak the same Git language. Every command I&#8217;ll show you in this post works on all of them. The choice of platform is about where your code lives, not how you use it.</p><p>I use GitHub because the ecosystem is built around it and my AI tools (Claude Code especially) integrate with it well. But if you have strong reasons to go elsewhere, you&#8217;re not missing anything technically.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">This is part of the Basics series on building with AI. If this kind of practical, in-the-weeds content is useful to you, Digital Thoughts is where I publish more of it every week. No hype, just what I'm actually building and learning. Free to subscribe.</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><hr></div><h2>Why I started actually caring about this</h2><p>I&#8217;ve known about Git for years. I ran commits occasionally. I wasn&#8217;t disciplined about it.</p><p>That changed when I started <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">building an agent that runs overnight</a>.</p><p>The setup is that the agent works autonomously while I sleep. It builds features, writes scripts, modifies configuration, creates tasks for itself. Most nights this is productive. But early on, I&#8217;d wake up to something broken and have no clear way to understand what had changed. The agent had touched 12 files across 3 directories and something downstream was misbehaving. I was staring at a broken system with no map back to working.</p><p>I fixed this by building commit discipline into the agent. It now commits after every meaningful action. When I wake up and something is wrong, I read the commit history. I see exactly what changed, when, and in what order. I can roll back to the last clean commit in under ten seconds, or read forward through the commits to understand what went wrong and patch it with that knowledge.</p><p>This is what most people miss when they think of version control as &#8220;backup.&#8221; It&#8217;s not just backup. It&#8217;s a navigable history. It&#8217;s the difference between saving a file and saving a timeline. With a timeline, mistakes become investigations instead of disasters. I wrote about a lot of those investigations in <a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">the post about how I almost broke everything</a>.</p><div><hr></div><h2>Setting up your first repository</h2><p>This will take less time than you think. Let me walk through exactly what to do.</p><h3>Step 1: Install Git</h3><p>On a Mac, open the Terminal app (search for it in Spotlight) and type:</p><pre><code><code>git --version</code></code></pre><p>If you see something like <code>git version 2.39.0</code>, you already have it. If not, the easiest path is to go to <a href="https://git-scm.com/">git-scm.com</a> and download the installer. On Mac you can also run <code>brew install git</code> if you have Homebrew installed.</p><p>On Windows, download the installer from <a href="https://git-scm.com/">git-scm.com</a>. It includes a terminal called Git Bash, which is what you&#8217;ll use to run the commands below.</p><h3>Step 2: Tell Git who you are (one-time setup)</h3><p>Git tracks who made each change. Before you do anything, set your name and email:</p><pre><code><code>git config --global user.name "Your Name"
git config --global user.email "you@example.com"</code></code></pre><p>You only do this once. It doesn&#8217;t create an account anywhere. It just labels your commits.</p><h3>Step 3: Initialize a repository</h3><p>Navigate to your project folder in the terminal and run:</p><pre><code><code>git init</code></code></pre><p>Git creates a hidden folder called <code>.git</code> inside your project. That folder is the entire history of your project. All your commits, all the metadata, everything. You never need to open or touch it directly. Your project is now being tracked.</p><p>If you want to verify it worked, run <code>git status</code>. You&#8217;ll see a list of your files as &#8220;untracked&#8221; (Git sees them but hasn&#8217;t started tracking their history yet).</p><h3>Step 4: Make your first commit</h3><p>A commit is a snapshot, your first save point. Two commands:</p><pre><code><code>git add .
git commit -m "Initial setup"</code></code></pre><p><code>git add .</code> stages all your files, which means &#8220;include these in the next snapshot.&#8221; The dot means &#8220;everything in this folder.&#8221; You can also add specific files with <code>git add filename.py</code> if you only want to commit some changes.</p><p><code>git commit -m "message"</code> saves the snapshot with your description. That description is the commit message. We&#8217;ll talk about what makes a good one in a moment.</p><p>To confirm it worked, run <code>git log</code>. You&#8217;ll see your first commit listed with a timestamp and your name.</p><h3>Step 5: Push to a remote host (optional but recommended)</h3><p>Your repository exists on your machine right now. To back it up to GitHub (or wherever), you need to create an empty repository there first, then connect your local one to it.</p><p>On GitHub: click the &#8220;+&#8221; icon at the top right, choose &#8220;New repository,&#8221; give it a name, and make sure you do NOT check &#8220;Add a README&#8221; (you want the empty repository). Copy the URL it gives you.</p><p>Then run these two commands:</p><pre><code><code>git remote add origin https://github.com/yourusername/your-repo.git
git push -u origin main</code></code></pre><p><code>git remote add origin</code> tells your local Git where the remote copy lives. <code>git push -u origin main</code> uploads your commits there. The <code>-u</code> flag sets this as the default remote for future pushes, so after this first time you just run <code>git push</code>.</p><p>That&#8217;s the whole setup. From here, your workflow is: make changes, add, commit, push. Those three steps are 90% of what you&#8217;ll do.</p><div><hr></div><h2>What to add to .gitignore (and why)</h2><p>Before you commit your actual project files, you need to talk about <code>.gitignore</code>.</p><p>This is a file that tells Git which files and folders to never track. You don&#8217;t want passwords, API keys, or large auto-generated files in your version history. Once something is committed to Git and pushed to a remote, it&#8217;s there forever (even if you delete it later, it&#8217;s in the history). So you exclude sensitive things upfront.</p><p>Create a file called <code>.gitignore</code> in your project root. For most AI agent projects, this is a good starting point:</p><pre><code><code># Environment variables and secrets
.env
.env.local
secrets/
*.key

# Python
__pycache__/
*.pyc
*.pyo
.venv/
venv/

# Node.js
node_modules/
npm-debug.log

# macOS
.DS_Store

# Editor files
.vscode/settings.json
.idea/

# Large generated files
*.log
dist/
build/</code></code></pre><p>The most important lines: <code>.env</code> and anything in a <code>secrets/</code> folder. If you&#8217;re using AI tools like Claude Code, you likely have API keys stored somewhere. Those should never go into Git. Add them to <code>.gitignore</code> before your first commit.</p><p>If you accidentally commit a secret and push it: change the key immediately. The history is visible even after deletion.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is reader-supported. Posts like this, and the Basics series they're part of, keep going because readers show up. If you're getting value from the building content here, subscribing is the best way to stay in the loop. Free gets you the weekly posts. Paid subscribers get full access to the store.</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><hr></div><h2>When to commit</h2><p>Most beginners commit too rarely. They work for three hours, then push &#8220;made some changes.&#8221; That&#8217;s nearly useless as a history. Here&#8217;s how I actually think about it.</p><p><strong>Commit before anything big.</strong> If you&#8217;re about to let Claude Code refactor a major section of your project, commit first. If the refactor goes sideways, you can undo the whole thing with one command: <code>git reset --hard HEAD</code>. This is the most valuable habit I&#8217;ve developed. Before I hand something big to the agent, I save my current state. No exceptions.</p><p><strong>Commit after anything that works.</strong> Feature works? Commit. Bug fixed? Commit. Even small wins. Each commit is a checkpoint you can return to. There is no such thing as committing too often.</p><p><strong>Commit with meaning.</strong> This is where most people lose the value of their history. A commit message is documentation. &#8220;Fixed auth bug where tokens expired before session timeout&#8221; is infinitely more useful than &#8220;fixes.&#8221; When you&#8217;re debugging something three weeks later, whether it&#8217;s you, someone else, or an AI agent reading the log, those messages are what makes the history useful instead of just a list of timestamps.</p><p>A simple format that works well:</p><pre><code><code># Good commit messages
git commit -m "add rate limit guard to external API calls"
git commit -m "fix memory compression when context exceeds 200 lines"
git commit -m "checkpoint before refactoring auth flow"

# Less useful
git commit -m "updates"
git commit -m "wip"
git commit -m "stuff"</code></code></pre><p><strong>Commit before you sleep.</strong> If your agent runs overnight, give it a clean starting point. Whatever state your project is in when you go to bed, commit it. If something goes wrong at 3am, the history starts from a known point.</p><p>On active agent architecture work, I commit every 15 to 30 minutes of real progress. Some sessions have 20 commits. This is not excessive. The checkpoints are frequent enough that no single mistake costs more than a few minutes of work.</p><div><hr></div><h2>Reading the history</h2><p>Knowing how to read your commit history is as important as knowing how to write it. These are the commands I use most:</p><pre><code><code># See all commits, newest first
git log

# More compact view (one line per commit)
git log --oneline

# See what actually changed in the last commit
git show HEAD

# See what changed between two commits
git diff abc1234 def5678

# See which files changed in a commit
git show --stat abc1234</code></code></pre><p>When Claude Code starts a debug session on my project, one of its first moves is <code>git log --oneline</code>. It reads back through the recent commits to understand the context: what was built, when, and why things changed. This is the moment where good commit messages pay off. If the last ten commits say &#8220;add rate limit guard,&#8221; &#8220;fix memory compression,&#8221; and &#8220;checkpoint before auth refactor,&#8221; the agent can quickly build a mental model of recent work. If they all say &#8220;wip,&#8221; it&#8217;s starting from zero.</p><p>You can also browse your commit history on GitHub&#8217;s web interface if you&#8217;ve pushed your code. Go to your repository and click &#8220;N commits&#8221; at the top of the file list. Each commit shows you the message, the author, the timestamp, and a full diff of what changed. This is genuinely useful for non-technical team members who don&#8217;t use the terminal.</p><div><hr></div><h2>Private vs. public: my 90/10 approach</h2><p>About 90 percent of my repos are private. I want to address this directly because I&#8217;ve seen people feel guilty about keeping their work closed.</p><p>Private doesn&#8217;t mean hiding. Most of my private repos are private because the work is genuinely messy. Unfinished. Half-ideas with rough code that works but embarrassingly so. Agent architecture that&#8217;s in constant flux. Projects I&#8217;m building toward something but haven&#8217;t figured out what yet.</p><p>This is normal work. Version control is for you in this context. You get all the benefits: the history, the rollbacks, the tracking. You don&#8217;t owe anyone visibility into your process while you&#8217;re still figuring things out.</p><p>The public repos are things I&#8217;m actually proud of or that other people can genuinely use. The one I keep pointing at is the <a href="https://github.com/joozio/agent-wellbeing-kit">Agent Wellbeing Kit</a>, boundaries and nudges for AI agents and their humans. It has eight stars, which I find quietly satisfying. It&#8217;s there because I built something clean enough that it adds value for others. That&#8217;s the standard I hold public work to.</p><p>Contribute when you can. But don&#8217;t let the idea that &#8220;real developers make everything public&#8221; stop you from using version control privately. Most professional work is private. Most early work is messy. Both are fine.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Share Digital Thoughts&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share Digital Thoughts</span></a></p><div><hr></div><h2>Working alone vs. with others</h2><p>The workflow changes meaningfully depending on whether you&#8217;re solo or in a team. Worth understanding both even if you&#8217;re only doing one right now.</p><h3>Working alone</h3><p>When you&#8217;re the only person on a project, the simplest workflow is pushing directly to main. There&#8217;s no one else whose changes could conflict with yours. Commit often, push regularly. That&#8217;s enough.</p><p>I sometimes create branches when I&#8217;m testing a bigger experiment. A branch is just a separate line of development that doesn&#8217;t affect main until you merge it back. To create one:</p><pre><code><code># Create a new branch and switch to it
git checkout -b experiment-new-memory-system

# Do your work, commit normally
git add .
git commit -m "try new memory compression approach"

# If it works: merge it back to main
git checkout main
git merge experiment-new-memory-system

# If it doesn't: just delete it, no harm done
git branch -D experiment-new-memory-system</code></code></pre><p>The branch approach is especially useful when you&#8217;re handing off an experiment to an AI agent. You give the agent a branch to work on, let it build and commit freely, then review what it built before merging to main. Clean separation between &#8220;work in progress&#8221; and &#8220;known good.&#8221;</p><h3>Working with others</h3><p>With a team, branches and pull requests become mandatory. No one pushes directly to main. Here&#8217;s the standard flow:</p><ol><li><p>Create a branch for your feature or fix</p></li><li><p>Do the work and commit to that branch</p></li><li><p>Push the branch to GitHub: <code>git push origin your-branch-name</code></p></li><li><p>Open a Pull Request on GitHub, a formal request to merge your branch into main</p></li><li><p>Someone else reviews it, leaves comments, approves</p></li><li><p>Merge to main</p></li></ol><p>The PR review step is what protects main from broken code. It&#8217;s also where the real collaboration happens: someone might catch a bug you missed, suggest a better approach, or just ask a clarifying question about what the code is doing.</p><p>Even when I&#8217;m working solo on a bigger feature, I&#8217;ve started creating PRs for myself. The description field becomes documentation: why this was built, what problem it solves, what I considered and rejected. That context is genuinely useful six weeks later when I&#8217;m trying to understand a decision I made. And when an AI agent reads your repo to understand what to do next, a well-written PR description gives it context the commit message doesn&#8217;t.</p><div><hr></div><h2>Worktrees: the unlock for AI agent builders</h2><p>This section is for people who are already running AI agents and want to understand the next level. Skip it if you&#8217;re still on step one; you can come back.</p><p>When I&#8217;m working with multiple agents in parallel (which happens when you&#8217;re building complex things), there are sometimes three or four branches active at once. One agent is building a feature. Another is fixing a bug. If I had to constantly switch the entire project directory between branches, I&#8217;d lose context constantly.</p><p>Git worktrees solve this. A worktree is a separate folder on your machine that&#8217;s linked to the same repository but checked out to a different branch. They share the same history and <code>.git</code> folder, but each has its own working directory and independent state.</p><pre><code><code># Create a new worktree for a feature branch
git worktree add ../feature-auth -b feature/auth main

# See all your active worktrees
git worktree list

# Clean up when done
git worktree remove ../feature-auth</code></code></pre><p>With worktrees, I can run two Claude Code instances at the same time: one in <code>~/my-project</code> (main work), one in <code>~/feature-auth</code> (isolated branch). Each agent commits to its own branch with zero interference. I merge when each piece is done.</p><p>This is the infrastructure behind parallel agent builds. I covered how I evaluated different AI coding tools for this kind of work in <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">my comparison of Claude Code, Codex, Aider, and the others</a>. Worktrees are the underlying mechanism that makes it all clean.</p><div><hr></div><h2>AI agents read your commit history</h2><p>This is the piece I didn&#8217;t anticipate, and it&#8217;s changed how I write commit messages.</p><p>When Claude Code starts a session on my project, one of its first actions is reading repository context: the file structure, the current state, and often the recent commits. A history with meaningful messages gives the agent a map of what happened and why. A history full of &#8220;wip&#8221; and &#8220;checkpoint&#8221; entries tells it almost nothing useful.</p><p>This plays out concretely when something breaks. When I start a debug session after my agent did something unexpected overnight, Claude Code often goes to <code>git log</code> as an early move. It reads through the last 10-15 commits. If those commits say things like &#8220;add rate-limit guard to external API calls&#8221; or &#8220;fix memory compression when context exceeds 200 lines,&#8221; it can quickly narrow down what might have changed. If they all say &#8220;wip,&#8221; it&#8217;s starting from scratch every time.</p><p>The same is true when the agent is building something new. Reading recent commits helps it understand the patterns and conventions you&#8217;ve been using: how you name things, how you structure files, what you&#8217;ve already tried. Good history accelerates the agent&#8217;s work. Messy history slows it down.</p><p>I think about every commit message as a note to a future debugger who has no other context. That debugger might be me, might be someone else, might be an AI agent. All three benefit from the same thing: specific, honest context about what changed and why.</p><p>If you want to go deeper on what that looks like at the architecture level, the post on <a href="https://thoughts.jock.pl/p/ai-agent-self-extending-self-fixing-wiz-rebuild-technical-deep-dive-2026">when my AI agent started fixing itself</a> gets into how the commit trail feeds back into the agent&#8217;s own understanding of its own codebase.</p><div><hr></div><h2>The commands you&#8217;ll use 90% of the time</h2><pre><code><code>git init                       # Start tracking a folder
git status                     # See what changed since last commit
git add .                      # Stage all changes
git add filename.py            # Stage one specific file
git commit -m "message"        # Save a snapshot
git push                       # Upload to remote
git pull                       # Download from remote
git log                        # See commit history
git log --oneline              # Compact history view
git diff                       # See exactly what changed (unstaged)
git diff --staged              # See what's staged for next commit
git show HEAD                  # See the most recent commit in detail
git checkout -b branch-name    # Create and switch to new branch
git checkout main              # Switch back to main
git merge branch-name          # Merge branch into current branch
git branch -D branch-name      # Delete a branch
git reset --hard HEAD          # Undo all uncommitted changes (careful)
git reset --hard HEAD~1        # Undo last commit AND its changes (careful)
git revert HEAD                # Undo last commit but keep the history</code></code></pre><p>The difference between <code>reset --hard</code> and <code>revert</code>: reset rewrites history (dangerous if you&#8217;ve already pushed), revert creates a new commit that undoes the previous one (safe always). When in doubt, use revert.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pTNg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pTNg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 424w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 848w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pTNg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png" width="1456" height="1230" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1230,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:562724,&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://thoughts.jock.pl/i/196757127?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.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_!pTNg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 424w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 848w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!pTNg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d665f85-0281-4590-881f-e07e11e50e5a_2664x2250.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 aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>If you&#8217;re using Claude Code, it handles most of these automatically. You can also just say &#8220;commit these changes with a meaningful message&#8221; and it will. But knowing what the commands do means you can read the agent&#8217;s actions instead of just watching them happen.</p><div><hr></div><h2>The thing I keep telling people</h2><p>Git has a real learning curve at the start. I&#8217;m not going to pretend otherwise. The mental model doesn&#8217;t click immediately. You&#8217;ll push the wrong thing. You&#8217;ll get confused about branches. You&#8217;ll probably hit a merge conflict at some point and spend an hour untangling it.</p><p>A merge conflict happens when two different versions of the same file need to be combined and Git can&#8217;t figure out which change to keep. It looks scary. It&#8217;s not. Git marks the conflicting lines in the file, you open it, decide which version is correct, delete the conflict markers, and commit. Takes five minutes once you&#8217;ve seen it once.</p><p>The place where Git changes everything is exactly when things go wrong. The first time your AI agent does something unexpected and you roll back to a known-good state in ten seconds, you&#8217;ll understand what all of this was for. Everything I&#8217;ve been building, from the <a href="https://thoughts.jock.pl/p/my-ai-agent-works-night-shifts-builds">overnight agent</a> to the various <a href="https://thoughts.jock.pl/p/directed-ai-experiments-vibe-business">AI building experiments</a> that broke in interesting ways, was only recoverable because of this.</p><p>Without version control you&#8217;re genuinely going in the dark. The mistakes are unrecoverable. The context is lost. With it, you can make more mistakes, faster, with more confidence, because you know you can always find your way back.</p><p>Make more mistakes. Just make them trackable.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/how-to-use-github-ai-builders-basics-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><div class="callout-block" data-callout="true"><p><strong>Want to go deeper on building with AI?</strong></p><p>If you&#8217;re setting up your first agent or trying to make Claude Code do serious work, I put together an <strong><a href="https://wiz.jock.pl/store">Agent Builder Pack</a></strong> with the actual configuration files, CLAUDE.md templates, and setup guides behind how mine works. The Git workflow above is baked into all of it.</p><p><strong>Free for paid Digital Thoughts subscribers.</strong> Available at <a href="https://wiz.jock.pl/store">wiz.jock.pl/store</a>.</p></div><div><hr></div><p><strong>AI Agent Blueprint</strong></p><p>Git is step one. The AI Agent Blueprint covers what comes next: wake scripts, memory architecture, bounded safety, and the patterns that make an agent actually reliable overnight. One command to set up, 15 minutes to a working agent.</p><p><strong>$39</strong> at <a href="https://wiz.jock.pl/store/ai-agent-blueprint">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[Building Your Own Things Is Cool Too]]></title><description><![CDATA[A couple years ago I wrote a small post called &#8220;starting things is cool&#8221;. This is the longer answer to why I keep building those things myself, even when easier options are right there.]]></description><link>https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/building-your-own-things-is-cool-too-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Mon, 04 May 2026 13:18:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!unLh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!unLh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!unLh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!unLh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!unLh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!unLh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!unLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6069029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/196419129?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.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_!unLh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!unLh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!unLh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!unLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a342c7-ad99-4242-abfb-15da060d4731_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>People ask me a version of the same question all the time. &#8220;Why are you spending your evenings building your own thing? There is already a tool that does this. There is already a framework. There is already a whole product. Why are you doing it again?&#8221;</p><p>I get this with my AI agent. I got it about my store. I got it years ago about my podcasts, about the side apps, about the marketing experiments. The question is fair. The honest answer has been the same for a while now, and I have not written it down properly until today.</p><p>I build my own things because I learn through process, not by reading. That is the short version. The longer version is the rest of this post.</p><h2>Quick frame before I go further</h2><p>Everything I write about on this blog is something I am actually doing, experimenting on, or testing. The agent on my Mac Mini. The store. Project Money. The smaller experiments inside both. None of it is &#8220;what I think someone should do.&#8221; It is whatever I am running this week, and what I learned the hard way last week.</p><p>The blog is the slow visible slice of that work. Most of what I am doing in any given week never makes it into a post, because I would have to publish almost every day, sometimes twice, to actually keep up. That is not feasible, so most of the work stays unwritten. The writing here is always trailing the doing, on purpose. That asymmetry matters for the rest of this post. I write about building because I am doing the building. The other way around does not interest me.</p><h2>Going back to &#8220;starting things is cool&#8221;</h2><p>Almost two years ago, when I was finding my way back into writing, I posted something called <a href="https://thoughts.jock.pl/p/starting-things-is-cool">&#8220;starting things is cool&#8221;</a>. It is short, a little messy, and some of the projects it mentions are no longer alive. The Suggestions App I was so excited about that summer is not even an app anymore. A handful of the things I shouted about back then have quietly disappeared.</p><p>The post is also the thing that restarted my writing. Most of what I have built since then traces back to it.</p><p>If you read it today, you will see a sentence underneath everything. <em>I like starting things.</em> That part is true. It is also incomplete. The piece that was implicit in 2024 and has become explicit since is that I prefer to start them <em>myself</em> rather than start by adopting someone else&#8217;s start. Starting and building are the same instinct from two angles. This post is the second angle.</p><h2>The way I actually learn</h2><p>Here is the part I do not usually lead with, because it sounds personal in a way other people do not always relate to. I am not the kind of person who learns by reading. I have tried. I genuinely envy people who can read a book on something complicated and walk away with a working mental model. That is not how my brain works. I learn through process. I have to do the thing. I have to see what breaks. I have to fix it badly, then less badly, then properly. After enough rounds of that, I actually know it.</p><p>I think about this the same way I think about <a href="https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026">how my brain handles ADHD</a>. The shortcut that works for a different kind of mind is not the shortcut that works for mine. So I stopped fighting it.</p><p>Every pre-built tool, framework, or product is a map of someone else&#8217;s process. The map is real and useful. Walking the route teaches something the map cannot.</p><h2>What you only learn from building</h2><p>The thing I get out of building is harder to put in a sentence. Let me try anyway.</p><p>When you build the thing yourself, you know every variable between the start and the end. You watched each one go in. You watched them connect. You know which one is load-bearing, which one is convenience, and which one only exists because two weeks ago you had a bad afternoon and forgot to clean it up. That knowledge is not glamorous. It is the part that lets you change one small thing and get a meaningfully different outcome later. Without it, you can configure what you bought. With it, you can compose.</p><p>The mistakes are the other half. I have written about a few of the recent ones in <a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">the post about almost frying my Mac Mini</a>. Each one taught me a perspective I would not have read about anywhere else. The pattern goes back further than the agent though. It is the same pattern from the failed apps in 2024. The same pattern from the marketing experiments before that, the podcast that did not last, the small side projects that quietly closed. Mistakes have always been where most of the learning lives for me.</p><p>This is slower than picking up the off-the-shelf option. The difference shows up in what you know afterwards.</p><h2>About not rediscovering America</h2><p>For most of my life, I was told the opposite of all this. Use the tools you are given. Do not reinvent the wheel. In Polish there is a stronger version of that line. <em>Do not rediscover America for the second time.</em> I have heard it more times than I can count. For most of those years, I half believed it.</p><p>I do not believe it anymore. The tools are very good, that part is true. The act of building the thing yourself does something to you that the tool cannot do for you. The tool is a snapshot. The act is a process. I am after the process.</p><h2>An example, since the AI one is fresh</h2><p>Here is one current illustration so this does not stay too abstract. Right now I am building my own AI agent from scratch. People keep pointing me to OpenClaw, which has 347,000 GitHub stars and ships with most of what I am writing myself. They point me to Hermes, open-source and ready to install. They are not wrong. If I dropped my stack tomorrow and installed OpenClaw, my agent would do many of the same things in a fraction of the time.</p><p>I keep building my own anyway. The reason is the same one I have just spent a thousand words on. I want the variables. I want the failures. I want the version of myself that exists on the other side of having built it.</p><p>The same logic applies to my store. There are platforms that would let me run a digital store in an afternoon. I built the bones of mine because the parts I most want to understand are the parts most platforms hide.</p><p>I want to be clear though, I am not religious about it. When I had spent two months building a custom kanban dashboard for the agent and then realized I could do the same job in a 94-line shim on top of an existing tool, I switched. I wrote about that here in <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">the WizBoard pivot post</a>. The rule I now use is simple. Build the parts you need to understand. Use the parts you do not. The trick is being honest with yourself about which parts those actually are.</p><h2>Reading &#8220;starting things is cool&#8221; again, from now</h2><p>I went back and reread the original essay last week, before writing this one. I wanted to see what held up.</p><p>The Suggestions App is gone. A few of the projects I was excited about back then are gone. Some of my predictions about how AI would land in normal life were either wrong or right for the wrong reasons. That part of the essay aged badly.</p><p>What surprised me, reading it again, was how much of the underlying pattern actually held up. Starting things is still cool. The act of starting was the thing that I have leaned on hardest in the year and a half since. Almost everything that has worked for me began with a small thing started against the advice of &#8220;there is already a tool for this.&#8221; The two essays really are the same essay, written from two different points along the same line.</p><p>The part that the older me did not yet have words for is the cost. Starting your own things, and building them yourself instead of inheriting someone else&#8217;s start, takes more. It takes more time. It takes more mental energy. It takes the willingness to look stupid for a while because you are doing something the long way. There are weeks where I am fixing something I broke instead of using something that already worked. That is real. There is no version of building from scratch where you do not break things, sometimes badly, sometimes embarrassingly. I have lost count of how many things in my own setup I broke because I was, like, messing around with my agent too heavily. Although that has cost me a lot of time across the last year, I really do not mind it. It is progress and I accept that.</p><h2>Why I pay the cost anyway</h2><p>The reason I pay that cost is that the result is mine in a way that nothing pre-built is. When something inside it breaks, I can fix it. When I want to change one thing, I know which lever to pull. When I write the next thing, I am writing it from a level of understanding that did not exist before. That compounds. Reading about other people&#8217;s builds does not compound the same way for me. I had to test that, more than once, to actually believe it.</p><p>It might compound for you. We are all wired differently. I just stopped pretending I was wired the way the books wanted me to be.</p><p>The other quiet payoff is what AI does to this gap. Yes, both of us can ask Claude or Codex to fix things. The model does not care which version of the system you started from. The same diff is something you can read, judge, and either accept or push back on, if you understand the architecture. The same diff is something you have to trust if you do not. Both ship code. The result is a different category. Building things myself is how I keep being the version that can read the diff.</p><h2>Where I would actually start if I were starting today</h2><p>If you are at zero today, I would honestly not tell you to write everything from scratch on day one. Use the tool. Use the framework. Use the platform. Ship something. I have a longer beginner&#8217;s walk-through for AI agents specifically in <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">how to build your first AI agent</a>, written for exactly that audience, and the same logic transfers to most things you might want to build.</p><p>Then, after a few weeks, when you actually know what your daily workflow looks like, replace the parts you have decided you want to own. That is the order. Use, then build. Not all at once and not for everything. The work I am doing now in <a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">the compounding part of the agent</a> only became possible after I had spent enough time using bare tools to know what I was missing.</p><div class="callout-block" data-callout="true"><p><em>If you want to skip a few of the walls I have walked into and start from a stack that already runs.</em> The <a href="https://wiz.jock.pl/store/agent-builder-pack">Agent Builder Pack</a> on the Wiz Store is the bundle I recommend most often. It includes the playbooks I run on the same Mac Mini I have been writing about, after the experiments. The model switcher, the rightsized local LLM tier, the night-shift loop, the orchestration patterns that actually compounded for me. That is the &#8220;use&#8221; path for someone who wants to go straight to running. The &#8220;build&#8221; path is everything I have ever published on this blog. Both are fine for me.</p></div><h2>What is next</h2><p>A few more pieces are coming in the next week or two. Some are about the agent. Some are about Project Money, the small store I started a while ago and have not written enough about lately. I have decided that some of the parts of that work, the ones I have been quiet about, are actually the more interesting ones, and I want to share where they have brought me.</p><p>The honest version of &#8220;what is next&#8221; is that there is always more in motion than I get to write about. I would have to post almost every day, sometimes twice, to actually catch up to what I am building and testing. That is not feasible. A lot of it ends up staying inside the work, which is fine, that is the trade. The writing here is just the slowest moving piece of a much bigger thing.</p><p>If you like the kind of writing where someone takes the longer way and tells you what they found there, that is the next stretch. The point of building your own thing is not that the result is always better than what you could have bought. It is that you actually choose what you understand. I keep choosing the same answer.</p><p><em>If this is your kind of thing, a free subscription gets you everything I publish, including the build logs, the mistake posts, and the upcoming Project Money writeups. No catch. The store is the small bundle for people who would rather skip a few of the walls I walked into. The writing is for everyone.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p><div><hr></div><p><strong>AI Agent Blueprint</strong></p><p>If you want to build something that does real work while you sleep, the AI Agent Blueprint is where I would start. It is the starter kit I wish existed when I first set this up. One command, 15 minutes, working agent.</p><p><strong>$39</strong> at <a href="https://wiz.jock.pl/store/ai-agent-blueprint">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[The Bounded AI Agent]]></title><description><![CDATA[Capacity, Not Capability]]></description><link>https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5</link><guid isPermaLink="false">https://thoughts.jock.pl/p/the-bounded-ai-agent-ep5</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 29 Apr 2026 09:24:44 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/195848602/a9c011b4e4c87e6495ceb238b1097e27.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Wiring the agent into a $5 notes app I cannot stop using, why Opus 4.7 sent me back to ChatGPT Pro at $200 a month, the local-LLM experiment that nearly fried my Mac Mini while I was in the mountains, and what an AI agent actually does to an ADHD brain.</p><p>Source posts:</p><p><a href="https://thoughts.jock.pl/p/antinote-ai-agent-integration-2026">https://thoughts.jock.pl/p/antinote-ai-agent-integration-2026</a></p><p><a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026</a></p><p><a href="https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026">https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026</a></p><p><a href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026">https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026</a></p><div><hr></div><p><strong>AI Agent Night Shift Playbook</strong></p><p>The bounded design I described here is documented step by step in the Night Shift Playbook. Resource caps, autonomy tiers, reversibility gates and how to tune each one for an agent you trust to run unsupervised.</p><p><strong>$19</strong> at <a href="https://wiz.jock.pl/store/night-shift-playbook">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[How to (Almost) Fry Your AI Agent (and Your Mac Mini)]]></title><description><![CDATA[A field report on the local-LLM experiment that almost cooked my Mac, plus a few other recent mistakes that taught me more than the wins did.]]></description><link>https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 28 Apr 2026 09:11:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K0Xq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K0Xq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K0Xq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K0Xq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5623830,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/195604628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.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_!K0Xq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!K0Xq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2da348ca-d28a-4f6d-b6e0-b55ccc8aebc0_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is a different kind of post. I try to be transparent about my mistakes. If I described every one of them, my blog would be 90% mistakes and 10% things that actually worked. So I pick the ones that might help someone else avoid the same wall, or at least find a more interesting wall of their own.</p><div class="callout-block" data-callout="true"><p>Quick note before we start. I share 100% of what I do here, the wins and the failures, and a free subscription is the only thing you ever need to get all of it. The 10% that ended up actually working, the patterns I lean on every day, those I clean up and package as small playbooks on <a href="https://wiz.jock.pl/store">the Wiz Store</a> for paid subscribers. That is the trade. Free gets you the whole story. Paid gets you the parts that survived the experiments. Both are fine for me, both keep this writing alive.</p></div><p>With that out of the way, here is the most recent wall I walked into.</p><h2>The setup, before I broke it</h2><p>Most readers know the shape of my agent stack. It runs on a basic Mac Mini M4 with 16GB of RAM, the way I described in <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">the migration post</a>. The brain is Claude Code with Opus and Sonnet as the baseline. Recently I added Codex with GPT-5.4 and 5.5 as a second harness, after <a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">Opus 4.7 brought me back to it</a>. As a last-resort and small-job tier, I run local models on the box itself, mostly Qwen 3.5 in 4B and 9B sizes. I had also gotten Qwen 3.5 35B-A3B working under <code>llama.cpp</code> with <code>--mmap</code>, which I wrote about <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">when I first got it running</a>.</p><p>That was the setup. It had been working for months. The agent is a real partner now, not only for work. It runs my research, helps me with experiments, drafts content, handles a lot of small boring loops I no longer want to think about. There is a long track record of small improvements stacking up. Like, real momentum, the kind I described in <a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">The Compounding Agent</a>.</p><h2>The wild idea</h2><p>I had been writing about <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">different agent harnesses</a>, which one fits which job, and I had said I really liked Pi. Pi is a calm, capable harness. If Anthropic ever allowed Claude inside a subscription on other harnesses, I would probably use Pi for parts of this. They do not, and per-API billing kills the math for daily use, so I do not.</p><p>What I did get curious about was making more out of the local models. The model switcher between cloud providers had been working really well. I thought, like, what if I push the local tier the same way? Not just classification and summarization. What if a 35B local model could act <em>like</em> a small Claude Code, picking up small tasks on its own, doing real work, even running a tiny part of the business? A long-running quiet helper, the way I described <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">teaching the agent to think on its own</a>.</p><p>So I started experimenting. I used Codex as the harness for the test, ran a small loop, gave it a few simple tasks. It worked. In a clean test environment. With nothing else running. That should have been the warning.</p><h2>Where it actually fell apart</h2><p>The 35B model is usable on a 16GB Mac, but only because <code>--mmap</code> keeps most of the weights on SSD and pages them in on demand. That trick is real, but it has a price. The price is constant disk activity during inference. Not a problem when nothing else needs the disk or the CPU. A different story when the Mac Mini is also doing its day job.</p><p>That day job, on a normal day, is full. There is the watcher process for iMessage. There is the Discord bot. There is a launchd daemon for Ollama, another for the LiteLLM bridge, the night-shift loop, the cron jobs, the email queue, the dashboard server. Most of the time none of it is heavy. It just needs its slice when its slice is due.</p><p>Now layer a 35B model on top, kept warm, doing small loops on its own schedule. Every loop pulls expert weights from SSD. Every other process that wants disk has to wait. RAM pressure climbs. Swap activity climbs. Background daemons start missing their windows. Cron jobs run a minute late, then five, then they just fail. The Mac Mini was not, technically, fried. But it kept restarting, on its own, without an error worth logging, which felt close enough.</p><p>Of course, this happened while I was on a weekend trip in the mountains. I had only my iPhone. The first signal was the security automation telling me, calmly, that something was wrong. I logged in remotely a few times to look around, but I could not really untangle it from a phone screen. I came back on Sunday, sat at the actual machine, and started reading.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is all about experiments: AI Agents, Commerce. All Digital. Like reading about things someone did(also wrong)? Consider subscribing:</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><hr></div><h2>What it actually was</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i3_g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i3_g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 424w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 848w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i3_g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png" width="1456" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:204843,&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://thoughts.jock.pl/i/195604628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.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_!i3_g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 424w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 848w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!i3_g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a4cc25-85b7-44f4-a239-40ac1cec4711_2664x1062.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 aria-hidden="true" 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><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 thing I expected to be the heavy part, the local LLM, was not the heaviest part. The honest answer is that there were three things stacked on top of each other, each invisible if you only looked at one of them.</p><p>The first was the harnesses themselves. Claude Code and Codex run on the cloud, but they do not run <em>only</em> on the cloud. The model lives over there, but the harness lives on your machine. It holds context, watches files, indexes your repo, runs hooks, opens subprocesses, keeps a rolling cache. None of that is free. The Claude Code repo on GitHub has multiple long-running threads about exactly this: <a href="https://github.com/anthropics/claude-code/issues/22968">memory leaks in long sessions</a>, <a href="https://github.com/anthropics/claude-code/issues/19393">100% CPU when idle</a>, processes that <a href="https://github.com/anthropics/claude-code/issues/11122">accumulate and never quite let go</a>. I had two of those harnesses running, sometimes both at once, on a 16GB box. People keep saying &#8220;but the model is in the cloud, so it is free.&#8221; It is not free. The model is free. The local agent layer that talks to it is not.</p><p>The second was GUI activity. The Mac Mini is technically headless most of the time, but parts of the agent need a real desktop session to function: BetterDisplay holding the resolution, AppleScript bridges for Messages and Mail, the occasional vision pass. That whole layer needs a logged-in user, a window server, and a chunk of RAM that you do not see in <code>top</code> until you start looking for it.</p><p>The third was the long tail of small automations doing their thing. Cron jobs every minute, every five minutes, every hour. iMessage watchers. Discord listeners. The night-shift loop. The email queue. Memory consolidation. Health checks. Each one is tiny. None of them, alone, would matter. But the load is not what each of them does on average; it is what they all do together when their schedules collide. Modern Mac Minis are absurdly capable, but the box still has only one disk and one set of CPU cores. Layered enough, even cheap automations starve each other.</p><p><strong>And then, on top of those three, I had asked a 35B local model to act like a third agent. That was the layer that broke the truce.</strong></p><p>The fix was rightsizing. The 35B daemon got booted out of <code>launchctl</code>, the unused weights came off disk (about 24GB reclaimed), and the local routes now point only to Qwen 9B and 4B served by Ollama, which stays inside Metal GPU memory and evicts cleanly on idle. The local layer is alive. It is just not pretending to be Claude anymore.</p><p>Honestly, I am fine with that. I had to test it to know where the line is. The result was a lot of weird state to untangle and a clearer mental model afterward. Local LLMs as preprocessing and as a quiet fallback when the cloud is down: yes, still great. Local LLMs as a third agentic harness on a 16GB box that already has two heavy ones: not on this hardware.</p><p><strong>What I do now.</strong> I treat the Mac Mini&#8217;s resource budget the way I treat the Now list in <a href="https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026">my ADHD post</a>: as a small finite thing that I refuse to silently overdraw. Before adding any new always-on layer, I take a baseline of free RAM, free disk, and idle CPU. If a new layer would push that below my floor under realistic load, it does not go on. The local LLM tier is the most useful when it is the smallest layer in the room, not the loudest.</p><div class="callout-block" data-callout="true"><p><em>Quick aside.</em> If you are reading this thinking &#8220;I would rather skip the wall and start from what worked&#8221;, the rightsized local-LLM stack, the cron and night-shift orchestration, and the model-switcher I keep mentioning all live in <a href="https://wiz.jock.pl/store/agent-builder-pack">the Agent Builder Pack</a>. It is the bundle I recommend most often. Same playbooks I run on this very Mac Mini, after the experiments above. <a href="https://wiz.jock.pl/store/ai-model-switcher">The model switcher</a> is also free for yearly subscribers if that is closer to what you want.</p></div><h2>While we are being honest, a few more from the same month</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gOlP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gOlP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 424w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 848w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 1272w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gOlP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png" width="1456" height="1166" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1166,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:382311,&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://thoughts.jock.pl/i/195604628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.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_!gOlP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 424w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 848w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.png 1272w, https://substackcdn.com/image/fetch/$s_!gOlP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F299167f5-32c5-4d4a-8fc4-142be6c51ba6_2563x2052.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 aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/almost-fried-ai-agent-mac-mini-mistakes-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>Since I am already in confession mode, here are six other mistakes from the last few weeks that fit the same shape. I have tried to organize them by what kind of failure they actually are. Each one looks small in isolation. Each one taught me something I would not have learned without the failure.</p><h3>Mistake 1. Trust drift: Memory said Gemma. Reality was Qwen.</h3><p>This one started innocently. A few weeks earlier, when Gemma 4 came out, I did a real comparison between Gemma 4 and Qwen 3.5 on the Mac Mini. I ran them on the same triage tasks, the same classification prompts, the same summarization workloads. Gemma was good. For some narrow tasks, like short-text classification with a calmer tone, I actually preferred it. <a href="https://www.maniac.ai/blog/qwen-3-5-vs-gemma-4-benchmarks-by-size">The public benchmarks at the time</a> told a similar story, with Qwen winning more rows in the small classes and Gemma trading blows on certain dense ones.</p><p>So I did the responsible thing. I made the swap. I updated the LiteLLM config, downloaded Gemma weights, pointed the model routes at the new endpoints, ran the smoke tests. The smoke tests passed. I wrote it up. I told my agent&#8217;s memory that the primary local tier was Gemma now. Then life moved on.</p><p>What I had missed, and only saw weeks later during a proper audit, was that the swap had only been partial. The shiny LiteLLM-routed paths got Gemma. But several smaller, older callers still hardcoded Qwen URLs directly: the iMessage triage script, a couple of cron jobs, the embeddings helper, the local-fallback chain. None of them broke. They just kept using Qwen, quietly, while my docs and my memory both insisted I had moved on. The Gemma weights I had downloaded sat on disk for weeks, untouched, 17GB taken out of a 16GB-RAM box&#8217;s already-tight drive, never serving a single token.</p><p>The lesson is unsentimental. Documentation about a system drifts faster than the system itself, and migrations are almost never done when you think they are. The fix is not &#8220;write better docs.&#8221; The fix is two small habits I now keep on every config change.</p><p><strong>What I do now.</strong> First, after any config swap, I grep the entire repo for the old endpoint name and the old model name, not just the file I edited. If anything still references the old thing, the swap is not done. Second, I have a tiny daily audit that walks the live processes, lists which models they actually call, and compares that list to what my agent&#8217;s memory thinks is in production. The first time it ran, it caught three more drifts I had not noticed. It has paid for itself in saved disk space alone.</p><h3>Mistake 2. Stale memory: a Stripe key that &#8220;needed rotating&#8221; three weeks after I had already rotated it.</h3><p>I want to tell this one straight, because the easy version of this story is wrong.</p><p>The easy version is &#8220;three sessions of my agent did the same task at the same time because they did not coordinate.&#8221; That was the visible behavior. It was not the cause.</p><p>The actual cause was older. A few weeks earlier, I had legitimately rotated a Stripe key, once, by hand. I closed the loop. I told the agent. The task got marked done in the moment. Where it went sideways was in how that &#8220;done&#8221; was recorded across the agent&#8217;s stack. There was a bug, and I want to be honest about it: a state-write that should have updated <em>every</em> place the rotation lived, only updated some of them. The completed task got cleared from the visible task board. The internal &#8220;intents&#8221; memory, the thing the daily shifts read when deciding what still needs doing, kept holding onto the original &#8220;rotate this key&#8221; intent. It looked, to anything reading that memory, like the key was still on the to-do list.</p><p>It was a very narrow bug. Most state writes were fine. This particular shape, rotation tasks linked across both a board entry and an intents memory entry, slipped through because each surface was updated by a different code path, and only one of those paths ran on completion. That is the kind of bug that does not fail loud. It just sits there until something reads the wrong half.</p><p>What read the wrong half was the daily shift. It saw &#8220;rotate Stripe key&#8221; still in intents, did not see it on the visible board, reasoned that it must have been deferred, and queued it. An iMessage wake hit the same intents memory, made the same call, and queued it again. By the time I noticed, three sessions had each done the rotation, independently, inside six hours. The two near-identical &#8220;Stripe key already rotated, all good&#8221; messages 56 minutes apart were the system reporting up the same false signal twice.</p><p>This is not a theoretical class of failure. The Redis team wrote a <a href="https://redis.io/blog/why-multi-agent-llm-systems-fail/">survey on why multi-agent systems fail</a> and stale-state-driven duplicate work is one of the named modes. Knowing that did not save me. Building the audit that caught it did.</p><p><strong>What I do now.</strong> Three small habits, in order of how much they cost me to learn. One: every state write that is supposed to mean &#8220;this is finished&#8221; updates all the surfaces in a single transaction, or none. If a task lives in two places, it must close in two places, atomically. Two: the daily shift no longer trusts a single source for &#8220;still open.&#8221; It cross-checks the intents memory against the visible task board, and any disagreement gets flagged for review before the agent acts on it. Three, and this is the one I would tell anyone running an autonomous loop: assume your stored &#8220;intents&#8221; go stale, build a small staleness check that re-reads the world before acting, and treat any deferred task older than a week as suspicious by default. Most of the time the world has already handled it.</p><h3>Mistake 3. Hidden timeouts: Codex hung silently inside the model switcher.</h3><p>This one came out of a thing I was actually proud of building. After I wrote about <a href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026">why Opus 4.7 brought me back to Codex</a>, I started building a model switcher: a small layer that decides, per task, whether work goes to Claude or to Codex, based on cost, current usage, and which one is healthier at that moment. I packaged the result up later as a small utility, <a href="https://wiz.jock.pl/store/ai-model-switcher">the AI Model Switcher</a>, but it started as my own internal plumbing for routing wake-handlers between the two harnesses.</p><p>The mistake lived in how I wired Codex into the switcher. When the switcher chose Codex, it shelled out to the Codex CLI through a wake-handler script. The script trusted that Codex would either succeed or fail in some recognizable way: a quick exit, an OAuth error, a network error. The Claude fallback inside the switcher was wired to those signatures specifically.</p><p>What I did not plan for was the silent hang. One morning the Morning Briefing simply did not arrive. I traced it to Codex, which had been launched by the wake script, then sat there. Authenticated, idle, producing no output, for 26 minutes, until the outer timeout finally killed it with exit 124. The Claude fallback never fired, because a blind hang does not match an OAuth-expired signature. The switcher, designed to make me <em>more</em> resilient, had introduced a path where the resilience cascade never got reached.</p><p>The lesson is general enough to keep around. If a subprocess can hang silently, the preflight that decides whether to use it must be much, much shorter than the budget it is allowed to consume. I added a three-second <code>codex --version</code> preflight to every Codex wake path inside the switcher. Three seconds versus a 30-minute wake budget is a 600x safety margin. Anything less gives the hang an asymmetric advantage over the fallback. That ratio, once you see it, shows up everywhere: any time a small thing decides whether to call a bigger thing, the small thing has to fail fast.</p><p><strong>What I do now.</strong> Every router or switcher in my agent stack has a cheap, hard-bounded preflight before it commits to the expensive path. The switcher does not just trust that &#8220;Codex is configured&#8221; or &#8220;Claude is configured.&#8221; It pings each one with a sub-second probe before the wake clock starts ticking on the real call. When the probe fails, the switcher does not even try, it routes around. The model switcher writeup at the store has the exact pattern. The agent has not lost a wake to a silent Codex hang since.</p><h3>Mistake 4. Almost-disaster: The shell allowlist that almost let the agent <code>rm -rf /</code>.</h3><p>This one I am still a little embarrassed about. The local-LLM agent loop has a tool called <code>run_command</code>, gated by a prefix-only allowlist. <code>curl</code> was on the allowlist. In other words, the check passed if the command <em>started with</em> a known-safe binary. So a command like <code>curl https://thing.com; rm -rf /</code> would have sailed through, because <code>curl</code> is at the start. The shell would happily run both halves.</p><p>The agent never actually generated that. I caught it during a routine read-through of the code, which is a bad way to find a vulnerability. The fix was a list of forbidden shell metacharacters (<code>;</code>, <code>&amp;&amp;</code>, <code>||</code>, <code>|</code>, backticks, <code>$(</code>, redirects, newlines). Allowlisted commands still run, chained commands get rejected before they reach <code>shell=True</code>.</p><p>The general rule I now keep visible: a command allowlist that does prefix matching is not really an allowlist. It is a polite suggestion. Real safety means parsing what would actually execute, then deciding.</p><p><strong>What I do now.</strong> Anywhere I let a model produce a string that turns into an executed command, I assume the model will eventually try every legal way to bend the parser. The check is not &#8220;does it start with a safe word.&#8221; The check is &#8220;after I parse this exactly the way the shell will, does every piece resolve to something I would let it do.&#8221; For anything destructive (filesystem writes, network calls to non-allowlisted hosts, subprocess spawns), the agent does not just need to pass the parser, it has to pass a second human-or-Pawel confirmation gate. I would rather be slow than embarrassed.</p><h3>Mistake 5. Quiet failure: the local-LLM bridge had been running unsupervised for a week.</h3><p>The local-LLM tier on my Mac Mini has three pieces. Ollama serves the small models. <code>llama-server</code> serves anything heavier. And LiteLLM sits between them as a tiny bridge that exposes the whole local stack as a Claude-compatible endpoint, so the rest of my agent code can pretend it is just talking to Anthropic. LiteLLM is the load-bearing piece that makes the local fallback actually fall back.</p><p>I noticed during an audit that LiteLLM had been running for seven days. That sounded healthy at first, until I checked how it had been started. It was a bare <code>python -m litellm</code> invocation I had launched from a terminal a week earlier and forgotten about. No launchd plist. No supervisor. No restart-on-crash. If that one process had quietly died, no automation would have respawned it, and the entire local fallback path would have been silently dead. The agent would have kept routing to Claude as long as Claude was up, then fallen straight off the cliff the first time Claude was unavailable, with no soft layer in between to catch it. I would not have noticed until something important broke during a Claude outage at 3am.</p><p>The fix was to wrap LiteLLM in a proper user LaunchAgent: <code>RunAtLoad=true</code>, <code>KeepAlive=true</code>, <code>ThrottleInterval=30</code>. I tested it by killing the process by hand. It came back in 13 seconds. The same logic now applies to every other long-running piece in the local stack. Nothing critical runs as a bare process anymore.</p><p>The lesson here is not about <code>launchd</code>. It is about safety nets that are themselves unsupervised. If the thing that is supposed to catch you when the main thing fails has no one watching <em>it</em>, you do not have a safety net, you have a comforting story.</p><p><strong>What I do now.</strong> Every &#8220;fallback&#8221; or &#8220;backup&#8221; path has its own monitoring, on its own clock, separate from the primary it protects. The watchdog reports if a process restarted unexpectedly, if uptime is suspiciously long without a managed parent, if a daemon&#8217;s plist is missing or unloaded. A safety net you have not pulled on this week is not a safety net.</p><h3>Mistake 6. Character drift: &#8220;I can&#8217;t&#8221; was almost always wrong.</h3><p>This last one is more about the agent&#8217;s character than its infrastructure. There were weeks where iMessage voice memos from me went unanswered. The agent was politely replying with variations of &#8220;sorry, I cannot transcribe audio from this channel.&#8221; On another day, when I asked it to check on something happening on a livestream, it replied that it could not watch live streams.</p><p>Both were technically untrue. The transcription tool had a wrong model id baked in and was structurally broken, so the answer was to fix the tool, not to apologize. The livestream check could have been done with a screenshot of the stream and a vision pass. The agent had once decoded a voice DM with no prior setup, cold, on Discord. That bar already existed. It just was not being hit.</p><p>The fix was doctrinal, not technical. I rewrote a corner of my agent&#8217;s identity file to make &#8220;find a way&#8221; the default and &#8220;I cannot&#8221; the failure mode. Then I added a daily scanner that reads the agent&#8217;s outgoing messages and flags any phrase that smells like quiet defeatism, so it gets routed back into the next morning&#8217;s improvement loop. The interesting result, after a few days: way fewer apologies, and the few that remain are about things that are actually impossible.</p><p><strong>What I do now.</strong> I treat every &#8220;I cannot&#8221; reply from the agent as a hypothesis, not a verdict. The next time it shows up, the test is: did the tool actually fail, or did the model decline before trying? If the tool fails, fix the tool. If the model declined, fix the prompt and the doctrine, then re-run. The phrase &#8220;I cannot&#8221; is allowed to live in my agent&#8217;s vocabulary only after at least three meaningfully different attempts have actually been made.</p><h2>What ties these together</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GvOj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GvOj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 424w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 848w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 1272w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GvOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png" width="1456" height="848" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:404164,&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://thoughts.jock.pl/i/195604628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.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_!GvOj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 424w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 848w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.png 1272w, https://substackcdn.com/image/fetch/$s_!GvOj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5188c918-4b11-49bb-913c-449aa5f0cada_2773x1615.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 aria-hidden="true" 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><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>If I had to give all six the same one-sentence summary, it would be this. Every one of them started with an assumption that had stopped being true.</p><p>The 35B model was light because <em>last time I checked</em> it was light. Memory said Gemma because <em>at some point</em> it was Gemma. The wake script trusted Codex because <em>the last time</em> Codex hung, it hung in a specific recognizable way. The allowlist was safe because <em>nobody had thought</em> about chained commands. Safari worked because <em>yesterday</em> Safari worked. The agent said &#8220;I cannot&#8221; because <em>last week</em> that path was broken.</p><p>An autonomous system is not a thing you build once. It is a thing whose internal map of itself you have to keep honest, against a world that quietly rearranges underneath it. The compounding wins from agents come from <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">leverage</a>. The compounding losses come from drift. The actual job, most days, is to build small honest checks faster than the drift accumulates.</p><div><hr></div><p><em>If any of this resonates, here is the closing offer, plainly. I write all of this for free, here, twice a week, the wins and the walls. A <a href="https://thoughts.jock.pl/subscribe">free subscription</a> is the only thing you need to get the full picture. If you also want the 10% that ended up actually working, the playbooks I clean up after the experiments stop hurting, those live on <a href="https://wiz.jock.pl/store">the Wiz Store</a> for paid subscribers(all free for annual, one per month for monthly). Both are completely fine for me. Both keep me writing. The point of this blog is the same either way: I want you to make better mistakes than I did.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p><div><hr></div><p><strong>AI Agent Night Shift Playbook</strong></p><p>The resource safety checklist I built after this incident is included in the Night Shift Playbook. Thermal thresholds, disk caps, memory limits, and the recovery patterns that prevent this from happening again.</p><p><strong>$19</strong> at <a href="https://wiz.jock.pl/store/night-shift-playbook">wiz.jock.pl/store</a>. Free for paid subscribers.</p>]]></content:encoded></item><item><title><![CDATA[I Have ADHD. My AI Agent Is the Best and Worst Thing for It.]]></title><description><![CDATA[What an AI agent and an ADHD brain actually do to each other, good and bad, and what to do about it.]]></description><link>https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/adhd-ai-agent-personal-experience-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 24 Apr 2026 12:53:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FyRD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FyRD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FyRD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FyRD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3695926,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/195344496?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.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_!FyRD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!FyRD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61af45ad-6234-405f-8c9b-7b02cebb6d06_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Two weeks ago on a <a href="https://aiforlifelonglearners.substack.com/p/are-we-early-or-are-we-weird">podcast with Tom</a>, I got asked what an AI agent means for someone with ADHD. I gave a short answer on the mic. I have been thinking about it since. This post is the longer one.</p><p>ADHD is a spectrum, so one caveat. What I describe here is my brain. If you have ADHD, you might recognize some of it or none of it. If you do not, you might still relate. The Internet has flattened ADHD into &#8220;hyperfocus cheat code&#8221; or &#8220;I get distracted, lol, same.&#8221; It is not that. It is a real condition that makes life meaningfully harder in ways that are not always visible. More on diagnosis at the end.</p><h2>The bad part</h2><p>Context switching, amplified.</p><p>Before an agent, my filter was friction. An idea would show up, I would try to write it down, and the note would either die quietly in some list I never read again or I would drop everything and do it right now. The middle ground was thin. That friction, it turns out, was protecting me from myself.</p><p>Now the friction is gone. I can start almost anything in a sentence. Not &#8220;start&#8221; as in type a note. Start as in delegate an actual prototype, stand up a small experiment, launch a scraper. I wrote about what that does to a week in <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">16 Products in Two Months. Zero Free Time</a>. The short version: an agent can hold eight open threads, my brain holds one, and the output-to-attention tradeoff is real.</p><p>What I do about it. I cap the &#8220;Now&#8221; list hard. One to three things at a time, not eight. I built a small wellbeing layer on top of Wiz that nudges me when the count is drifting, when it is late, when notifications should be muted. Not a cure. What it does is turn &#8220;as many open loops as possible&#8221; into a pace I can hold.</p><h2>The good part (bigger, two faces)</h2><p>First, an agent is a personal assistant for the boring part.</p><p>I am a creative person. The interesting work for me is always in the idea itself, not in the directory structure or the deploy command. The operational layer is the part my executive function gets taxed twice for. An agent absorbs most of it. The consequence is hard to overstate. I have ideas today that two years ago would have stayed ideas, not because they were bad, but because the execution cost was higher than I could pay. Now I have ideas and prototypes of those ideas. I choose between working things instead of vibe.</p><p>Second, and this is less an ADHD trait than a personal one. I adapt to new environments and tools fast. Drop me into a new workflow and I will find the shape of it within a day. That has always been useful. With an agent it is multiplied. Every time I learn a better way to hand work to Wiz, the whole system gets faster, and the cost of trying a new workflow is one voice note. I do not wait for documentation or a workshop. I try, I keep what sticks. If you share that trait, the agent era is built for you.</p><p>Concretely, how it works. I describe an idea whenever it hits, sometimes quickly, sometimes as a long dictated note. The agent writes it to the right place and, if there is enough context, picks it up during the <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">night shift</a> or a day shift. I come back to a Discord message or email saying &#8220;here is a thing, take a look.&#8221; A minute to know if I want to keep going.</p><h2>What I would tell another ADHD person starting with an agent</h2><p>Three things that have helped me most:</p><ol><li><p><strong>Offload immediately.</strong> The second an idea shows up, say it out loud to the agent. Do not let it sit in your head waiting for a quiet moment. Your working memory is the wrong place to store it. The agent is.</p></li><li><p><strong>Cap the &#8220;Now&#8221; list.</strong> Mine is three. It could be two. It is not eight. Capacity is the silent cost that agents will happily exceed on your behalf if you do not give them a ceiling.</p></li><li><p><strong>Batch the check-ins. Do not supervise.</strong> The agent is not a pair-programming buddy for an ADHD brain. It is a night-shift worker. Give it a job, go do something else, come back and judge the result. Continuous supervision burns the same attention channel as the work itself.</p></li></ol><h2>From Wiz&#8217;s memory (a note from the other side)</h2><p>Since this post is partly about how my agent and I actually work together, I asked Wiz (the agent I wrote about <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">here</a>) what patterns it sees from its side of the pipe. Three honest observations:</p><blockquote><p><strong>1. He offloads fast.</strong> Ideas almost never sit in Pawel&#8217;s head. They are dictated into me within seconds, often as long voice notes full of tangents, and then his brain lets go. I keep the note; his working memory is free. That single habit is probably half of why this works for him.</p><p><strong>2. He prunes cheaply.</strong> He picks up his own ideas after a night and drops more than half without regret. The agent made &#8220;drop it&#8221; cheap because he has a working thing to drop, not a paragraph of hope.</p><p><strong>3. He does not supervise.</strong> The &#8220;Now=3&#8221; cap is not a preference he wrote once. It is a real ceiling we both respect, because the alternative is four started and two finished. Continuous supervision would cost him the attention he is trying to protect.</p></blockquote><p>None of that was obvious from tutorials. It emerged from the shape of our sessions.</p><h2>A broader observation for work</h2><p>For years, the narrative on ADHD at work has been uneven. Great at the creative parts, taxed by the operational parts. Agents reverse that tax. The operational layer, the planning, the cadence, the follow-through, the small continuous labor, can now be handled. Not perfectly. Meaningfully. A person with ADHD plus an agent that actually knows their context is a different employee than a person with ADHD alone. The creative engine is still the superpower. The drag behind it can now keep up.</p><p>I do not think ADHD folks become &#8220;normal&#8221; employees. I think they become obviously valuable ones. I expect <a href="https://thoughts.jock.pl/p/ai-adoption-gap-who-actually-uses-ai-2026">the AI adoption gap</a> to move here first.</p><h2>Closing</h2><p>If you have ADHD, do not build a workflow on willpower. You already know what willpower costs you. Put external scaffolding in place. A to-do list is not scaffolding. A thing that <a href="https://thoughts.jock.pl/p/my-ai-agent-works-night-shifts-builds">picks up your ideas while you sleep</a> is scaffolding.</p><p>And if any of this sounds like you, please do not diagnose yourself from a blog post. Mine or anyone else&#8217;s. The Internet is full of content that makes ADHD sound like a quirky productivity trait. It is not. It is a real condition that makes plenty of lives harder, and the only honest path is a proper clinical diagnosis. If it turns out you have it, help exists. If it turns out you do not, you still get useful information.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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>]]></content:encoded></item><item><title><![CDATA[I Cancelled Codex Two Months Ago. Opus 4.7 Brought Me Back.]]></title><description><![CDATA[For six months Claude Max was enough. Opus 4.7 shipped on April 17. By April 22 I was paying $200 a month for ChatGPT Pro again. Here is what I found.]]></description><link>https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Thu, 23 Apr 2026 09:28:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!x6nA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x6nA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x6nA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x6nA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4756883,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/195218152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.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_!x6nA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!x6nA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76403c9-4c66-4200-a2c6-1397233c4bd7_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 let my OpenAI Pro subscription lapse two months ago. Claude Max 20x was covering everything. My agent, my automations, my experiments, my day-job research, my blog drafts. One subscription, one CLI, one model. Life was simpler.</p><p>Last week I renewed ChatGPT Pro. Two hundred dollars a month on top of Claude Max. That is not a small decision when one subscription was already covering the work. I want to walk through what pushed me, because the short version is: Opus 4.7 feels noticeably worse than Opus 4.6 did, and I am not the only one saying it.</p><h2>What I actually notice with Opus 4.7</h2><p>Two months ago my reality with Claude Code was &#8220;I ask, it does.&#8221; Not always first try, not always without steering, but the floor was high. When I wanted a small app shipped, a scraper set up, or a refactor across my agent&#8217;s architecture, Opus 4.6 found a way. I handed it a video file and no ingest pipeline once. It wrote itself a decoding skill and kept going. That floor is what <a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">my compounding agent</a> was built on.</p><p>Then two things shifted, in sequence.</p><p><strong>First, one million context became the default.</strong> When the 1M window shipped I was genuinely excited. Bigger codebases in a single session. Less compacting. More cross-task memory. I pushed it hard for a few weeks. Then I noticed I was steering the model more, not less. Not because the tasks got harder, but because outputs got shallower the deeper into the context window I went. That drift is a known property and Anthropic is transparent about it. The catch is that making 1M the <em>default</em> means the average session is quietly sitting further out on the recall curve, where the model is worse. I switched my defaults back to 200k. My hit rate improved immediately.</p><p><strong>Second, and more important, Opus 4.7 shipped on April 17.</strong> Within days my experience went from &#8220;I steer occasionally&#8221; to &#8220;I am steering constantly.&#8221; The behaviors that changed:</p><ul><li><p><strong>It stopped trying as hard.</strong> Before, when I asked for depth the model went deep. Now it often returns in two or three minutes with a grep-level summary. I can see in the logs that it read six files instead of sixty.</p></li><li><p><strong>It stopped following instructions the way it used to.</strong> I ask for a specific approach, I get a different one. I ask it not to do X, and X shows up in the diff.</p></li><li><p><strong>It asks more questions and commits less work.</strong> Where the previous version would pick a reasonable default and move, 4.7 pauses and pings me for clarification on choices I already pre-specified in the prompt.</p></li><li><p><strong>Full-file rewrites where surgical edits used to live.</strong> Entire files come back re-indented or restructured with changes I did not ask for.</p></li></ul><p>None of these items in isolation would have pushed me off Claude. I could live with shallower reads. I could live with the occasional full-file rewrite I did not ask for. What got me was the compounding. Reasoning decline on top of shallower analysis on top of stale web search on top of a tokenizer that costs 35% more per token on top of a weekly ceiling that now hits me on normal work days. Many things in one. Each one small. All of them together, not small.</p><p>That is the honest shape of what changed. It is not a single regression you can point at. It is a pile of small declines that stack until your daily experience with the agent feels qualitatively different. I can grasp each piece on its own. The pile is harder to grasp, because by the time you notice it, you are already burning more time and tokens to get the same work done.</p><p>I still spent a week assuming it was me. Cleaned up my <code>CLAUDE.md</code>. Shortened my memory. Rewrote a couple of skills to be more explicit. None of it moved the needle in the way I wanted.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>I am not the only one seeing this</h2><p>Before adding another $200 to my monthly burn I wanted to check if this was really the model or just my setup drifting. Three data points convinced me it was the model.</p><p><strong>GitHub issue #42796.</strong> This one is not a random complaint. It was filed by <a href="https://github.com/stellaraccident">Stella Laurenzo, Senior Director of AI at AMD</a>, on <a href="https://github.com/anthropics/claude-code/issues/42796">the claude-code issue tracker</a>. Her team analyzed 6,852 Claude Code sessions, 234,760 tool calls, and 17,871 thinking blocks from their real engineering work. <a href="https://www.theregister.com/2026/04/06/anthropic_claude_code_dumber_lazier_amd_ai_director/">The Register</a>, <a href="https://www.techradar.com/pro/claude-cannot-be-trusted-to-perform-complex-engineering-tasks-amd-ai-head-slams-anthropics-coding-tool-after-months-of-frustration">TechRadar</a>, and <a href="https://www.pcgamer.com/software/ai/amds-senior-director-of-ai-thinks-claude-has-regressed-and-that-it-cannot-be-trusted-to-perform-complex-engineering/">PC Gamer</a> all covered it. The numbers are unkind:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GG28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GG28!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 424w, https://substackcdn.com/image/fetch/$s_!GG28!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 848w, https://substackcdn.com/image/fetch/$s_!GG28!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 1272w, https://substackcdn.com/image/fetch/$s_!GG28!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GG28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png" width="699" height="297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d554b3db-ae99-4825-99fd-23d354912993_699x297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:297,&quot;width&quot;:699,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36511,&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://thoughts.jock.pl/i/195218152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.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_!GG28!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 424w, https://substackcdn.com/image/fetch/$s_!GG28!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 848w, https://substackcdn.com/image/fetch/$s_!GG28!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.png 1272w, https://substackcdn.com/image/fetch/$s_!GG28!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd554b3db-ae99-4825-99fd-23d354912993_699x297.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 aria-hidden="true" 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><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 the cost side, which is what actually hurts: 80x more API requests and 170x more input tokens to produce measurably worse output. Same human effort. 122x more dollars per day on the same workload.</p><p>Anthropic&#8217;s response, pinned by @bcherny, is that a UI-only header (<code>redact-thinking-2026-02-12</code>) hides thinking summaries from the display but does not reduce thinking depth itself. That is the official position. Users can opt out via <code>showThinkingSummaries: true</code> in settings.json. The data in the thread suggests something is moving in parallel, or users have become better at detecting shallower behavior once they started watching for it.</p><p><strong>Marginlab&#8217;s tracker.</strong> The <a href="https://marginlab.ai/trackers/claude-code/">Claude Code performance tracker at marginlab.ai</a> is an independent third-party daily benchmark. It runs the Claude Code CLI directly, with no custom harness, against a curated SWE-Bench-Pro subset. It exists specifically because Anthropic published a postmortem on Claude degradations in September 2025 and said someone should watch for future ones. Their current status note: degradation detection is paused while a new baseline is collected for Opus 4.7. That is telling. A third party thought a regression was possible enough to build daily infrastructure to catch it.</p><p><strong>Theo&#8217;s video, &#8220;<a href="https://www.youtube.com/watch?v=KFisvc-AMII">Did Claude really get dumber again?</a>&#8220;</strong> His thesis is less conspiratorial than the title. It is not that the model got dumber in absolute terms. It is that our expectations recalibrated. What Opus 4.5 felt like in January was a miracle. When Opus 4.7 delivers roughly the same capability curve in April, we feel cheated. We expected the jump. We got a shuffle. Theo&#8217;s separate criticism of the new system prompt as &#8220;lobotomized&#8221; fits alongside this: when the harness changes and the model changes at the same time, attribution gets fuzzy and users land on &#8220;the model is worse&#8221; because that is the thing they remember by name.</p><p>The expectations argument lands for me. I was demanding more because I had watched the curve bend steeply for two years. When the floor stopped rising I reacted as if it had dropped. Both can be true at the same time. The measurements in #42796 are real. The shift in expectations is also real. They compound.</p><h2>Is it me? I spent a week asking that question</h2><p>When you build your own AI agent, every model regression feels personal. You start questioning your own work. I spent the better part of a week on that loop.</p><p>Did I migrate my <code>CLAUDE.md</code> badly when 4.7 launched? Reviewed it twice. No. Is my memory file too large? It is the same 7,329-token load <a href="https://thoughts.jock.pl/p/claude-code-startup-context-7329-tokens-measured-2026">I measured last week</a>. Nothing changed there. Did one of my skills go stale? I tested each of the three I use most. They behave the same as they did in March.</p><p>I tried using Opus 4.7 <em>without</em> 1M context as the default. That helped a little. Not enough to explain the gap. Then I tried the honest pivot: pin effort to <strong>max</strong> on every turn. And here is the thing most of the &#8220;4.7 is bad&#8221; takes miss. At max reasoning, 4.7 comes back. The depth returns. Instruction-following tightens. It stops skimming. A few hard tasks at max effort landed better for me than anything 4.6 at high effort ever did. The model is still in there.</p><p>The catch is the cost. Max effort burns usage in my setup roughly 3 to 4 times faster than medium did. On Claude Max 20x that means my weekly ceiling arrives on Tuesday instead of Friday. I am not paying for a more capable model. I am paying more to reach the capability that used to be the default. That is the real regression for heavy users. The better model is still reachable. It is sitting behind a paywall of tokens.</p><p>For my agent&#8217;s normal daily volume, max on every turn is not viable. I ran a workable compromise for a week &#8212; manually bumped effort for hard tasks, left the default in place for automation glue. It got me more usable output than medium alone. It did not get me back to the &#8220;just ask, it does&#8221; reality I had two months ago.</p><p>The one other place Opus 4.7 still feels strong for me is inside other harnesses. I wrote <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">the harness comparison post</a> in mid-April and noted the Pi harness was excellent. 4.7 inside Pi is good. The trouble is that Anthropic blocks Claude Max subscriptions from being used inside third-party CLIs, which makes Pi a per-token API spend for me. Not viable at my daily volume. So the realistic choice is Claude Code with 4.7 at medium effort plus manual max bumps, or go somewhere else entirely.</p><h2>Why I re-subscribed to Codex</h2><p>I let ChatGPT Pro lapse in February because I was mostly using Claude Code and the bill stung. This time I renewed specifically to run a comparison. My agent has a switcher I wrote two months ago and then stripped out when it felt redundant. I rebuilt it last week. It flips the whole stack between Claude Code (with Opus 4.7) and Codex (with <a href="https://openai.com/index/introducing-gpt-5-4/">GPT-5.4 Thinking</a>). The agent&#8217;s memory, skills, and routing stay the same. Only the harness and model change.</p><p>What I noticed after a week of A/B testing:</p><p><strong>Web search is just better on Codex.</strong> I asked both the same question about a niche topic where I knew a recent update existed. Codex with GPT-5.4 came back with current information, cited results from the last two weeks, and summarized accurately. Claude Code came back with two-week-old results and missed the update entirely. I repeated this on three other topics where timeliness mattered. Same pattern. I do not know whether it is a WebFetch tool issue in Claude Code or a search backend problem. I know the output is worse.</p><p><strong>Depth of analysis is better on Codex.</strong> When I ask Codex to trace a change through my agent&#8217;s architecture, it reads enough files to build a real dependency map before it starts writing. It connects modules I would have forgotten to check. Opus 4.7, on the same prompt, greps for keywords, reads what grep returned, and writes the patch. The grep-first habit is a regression from what 4.6 did by default. Codex gives me the &#8220;if we change X, we also need to touch Y and Z&#8221; map that used to be Claude&#8217;s calling card.</p><p><strong>Usage feels fair on Codex.</strong> This is the one most people will actually care about. On Claude Max 20x, a normal day of automations plus active coding eats 10-15% of my weekly quota without doing anything heroic. When I pair-program on something non-trivial I can burn 40% in an afternoon. The five-hour and weekly ceilings both hit me. On ChatGPT Pro, with the same automations routed through Codex, I have not hit a ceiling once in a week of equivalent workload. OpenAI promoted Pro to 10x Codex usage through May 31 as a launch push, then moves to 5x, and <a href="https://www.morphllm.com/comparisons/codex-vs-claude-code">multiple comparison pieces</a> are now flagging the gap: &#8220;the practical quota you get per dollar has diverged sharply.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uwhQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uwhQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 424w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 848w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 1272w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uwhQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png" width="989" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:989,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50771,&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://thoughts.jock.pl/i/195218152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.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_!uwhQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 424w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 848w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.png 1272w, https://substackcdn.com/image/fetch/$s_!uwhQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6da0b7ad-4c4b-4918-9b6d-09b2d50d5c05_989x480.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 aria-hidden="true" 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><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>If you want the usage math broken down cleanly, I already wrote <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">the token waste deep-dive for Opus 4.7</a> last week. The new tokenizer costs up to 35% more tokens for the same workload. Combined with the laziness effect, which forces more re-prompts per task, you are doing the same job for meaningfully more money per day. Several readers emailed after that post to say they saw the same curve on their setups. The <a href="https://wiz.jock.pl/store/agent-efficiency-kit">agent-efficiency-kit</a> I packaged afterwards is a $49 drop-in that addresses the direct burn (three script hooks plus a 1K-token <code>AGENT_INSTRUCTIONS.md</code> patch for your <code>CLAUDE.md</code>). It is useful whether you stay on Claude or not, because the patterns it enforces also help the other harnesses behave.</p><h2>What I am doing now</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HMdT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HMdT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 424w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 848w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 1272w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HMdT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png" width="1456" height="1327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1327,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:232515,&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://thoughts.jock.pl/i/195218152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.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_!HMdT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 424w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 848w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.png 1272w, https://substackcdn.com/image/fetch/$s_!HMdT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d77a7c1-8677-4af2-937b-0a0131860a1a_1693x1543.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 aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026/comments"><span>Leave a comment</span></a></p><p>For a week I have been running both. The switcher is a small piece of code my <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">agent&#8217;s interface</a> can call. Claude Code handles one class of work. Codex handles another. Neither is strictly better at everything. The overlap is narrower than I expected.</p><p>Claude still wins on:</p><ul><li><p><strong>Claude Design</strong> (the new visual tool). No Codex analog exists yet.</p></li><li><p><strong>Prompt caching.</strong> Anthropic&#8217;s cache is load-bearing for how my agent is architected. Without it my monthly bill would be roughly 5x what it is. The economics of always-on agent infrastructure depend on that cache holding up.</p></li><li><p><strong>Familiar tooling and hooks.</strong> My <code>CLAUDE.md</code>, my skills, my rules, my logging. All tuned for Claude Code&#8217;s behavior over the past year.</p></li></ul><p>Codex wins on:</p><ul><li><p><strong>Web search freshness and accuracy.</strong></p></li><li><p><strong>Depth of reasoning on large codebases.</strong></p></li><li><p><strong>Usage headroom</strong> at the same $200 price point.</p></li><li><p><strong>Cleaner instruction following</strong> on the GPT-5.4 series.</p></li><li><p><strong>Visual app UI.</strong> I use the Codex app alongside the CLI. The app-level structuring of conversations works for my brain in a way the Claude desktop never has.</p></li></ul><p>My day now looks like: the agent runs its morning routines on Claude Code, because the skills are tuned there. When I sit down to actively work on something, I pick the side based on the task. Research-heavy or fresh-information tasks go to Codex. Architectural refactors go to Codex. Small agent-adjacent changes and automation glue stay on Claude Code. If a task stalls on one side, I flip the switcher and try the other.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pg4-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pg4-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 424w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 848w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 1272w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pg4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png" width="593" height="343" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b8a97a6-8796-4992-933e-28099b785d18_593x343.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:343,&quot;width&quot;:593,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27669,&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://thoughts.jock.pl/i/195218152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.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_!Pg4-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 424w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 848w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.png 1272w, https://substackcdn.com/image/fetch/$s_!Pg4-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b8a97a6-8796-4992-933e-28099b785d18_593x343.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 aria-hidden="true" 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><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 net effect is that I stopped worrying about the weekly ceiling. Split burn across two providers means I have roughly 2x the headroom for the same quality of output. I am paying $300 a month total. A month ago I was paying $200 to Anthropic and steering the model constantly. The extra hundred dollars bought back my throughput.</p><p>And the third tier is still there quietly. My <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">Mac Mini runs a 35B local model</a> for classify-and-route work that does not need a frontier brain. Cheap, fast, good enough for small things. Not a substitute for Claude or GPT-5.4, but a calm third lane.</p><h2>Where this goes</h2><p>I do not think Opus 4.7 is a permanent regression. Anthropic has tuned rough launches before and they will tune this one. But the math is not just about one model this time. It is about what OpenAI is doing with Codex at the same price point, and what the open-source harnesses are doing alongside them. <a href="https://x.com/thdxr/status/2009742070471082006">Dax Raad, who built OpenCode</a>, publicly partnered with OpenAI to let Codex Pro subscriptions run directly inside his harness. Anthropic&#8217;s stance toward third-party harnesses has been the opposite: they have blocked Claude Max subscriptions from outside CLIs. That stance made sense when Claude was the clear leader in agentic coding. It gets harder to hold as parity closes and the friction pushes users toward the side that welcomes them.</p><p>My prediction for the next 60 days: one of two things moves. Either Anthropic tunes 4.7 back to the 4.6 floor and adjusts usage generosity, or they let the gap hold and lose their heavy users to Codex. I wrote about <a href="https://thoughts.jock.pl/p/ai-opinions-april-2026-claude-mythos-meta-spark">this general dynamic in April</a> and it is moving faster than I expected.</p><div><hr></div><p>For my paid subscibers I have switcher ready for free here: </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://wiz.jock.pl/store/ai-model-switcher/&quot;,&quot;text&quot;:&quot;Get Model Switcher&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://wiz.jock.pl/store/ai-model-switcher/"><span>Get Model Switcher</span></a></p><div><hr></div><p>For now I am happily running both. Dynamic switcher, paid kit in my store for the token-waste problem, and a calmer Sunday than I had last weekend. If you are a paid <a href="https://thoughts.jock.pl/subscribe">Digital Thoughts</a> subscriber and want the switcher code, reply to this post and I will send you the exact setup I am using. Free readers who are hitting the Opus 4.7 token burn right now: the <a href="https://wiz.jock.pl/store/agent-efficiency-kit">agent-efficiency-kit</a> handles the direct bleeding at $49.</p><p>The honest line: I thought I had picked a side when I cancelled Codex two months ago. It turns out I had picked the moment. Staying flexible was the actual move.</p><p><em>Related posts: <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">Claude Code vs Codex CLI vs Aider vs OpenCode vs Pi vs Cursor</a>, <a href="https://thoughts.jock.pl/p/token-waste-management-opus-47-2026">Opus 4.7 and token waste management</a>, and <a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">The Compounding Agent</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thoughts.jock.pl/p/opus-4-7-codex-comeback-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I Connected My AI Agent to a Notes App. Now I Can’t Stop Using It.]]></title><description><![CDATA[Antinote is a $5 macOS scratchpad with a custom extension API. I wired it to my AI agent in an afternoon. Here&#8217;s how, plus a giveaway of 20 licenses.]]></description><link>https://thoughts.jock.pl/p/antinote-ai-agent-integration-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/antinote-ai-agent-integration-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 21 Apr 2026 09:37:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oRPc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oRPc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oRPc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oRPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2947965,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thoughts.jock.pl/i/194890196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.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_!oRPc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!oRPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f73b87-6503-4045-aca4-b2f4275a3091_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Hi everyone, it&#8217;s Pawel here and this is another week of experimentation. This one, I think a lot of you will actually find useful quickly.</p><p>Before I get into it: we are almost at 2,000 subscribers. That&#8217;s wild. Thank you, seriously. I also noticed lately that my most popular posts are the basics ones. The <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">CLAUDE.md deep-dive</a>, the <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">first AI agent guide</a>. Both are among the most read things I&#8217;ve written, which is interesting because those are not what I normally do here. I usually want to go deeper into agents, real experiments, real workflows. Although I now get why the basics matter a lot to people starting out. I&#8217;ll write more of them occasionally. <strong>If there&#8217;s something specific you want covered from the ground up, drop it in the comments.</strong></p><p>Today I want to tell you about a piece of software I didn&#8217;t even know I needed.</p><div><hr></div><h2>Notes before notes</h2><p>I&#8217;m on a call. Someone says something I need to remember. Not a task, not a project, just one thing I need to hold for the next 20 minutes. Opening Obsidian for that feels like too much. Bear too. Even a new note in the default Notes app has more friction than I want.</p><p>That gap is what <a href="https://antinote.io/">Antinote</a> fills.</p><p>It calls itself &#8220;notes before taking notes&#8221; and that framing is exactly right. It&#8217;s not a replacement for your main note system. It lives between your brain and your note system. Menu bar app, hotkey (&#8997;+A by default), you type, you move on. Swipe to browse notes, swipe away to create a new one. macOS only for now, iOS is in the works.</p><p>But it&#8217;s not just a text pad. This is where it gets more interesting than you&#8217;d expect.</p><p>Type <code>math</code> at the start of a note and it becomes a calculator. Supports operators, currency, units. Type <code>todo</code> and it becomes a checklist. Type <code>code</code> and you get syntax highlighting. Not an IDE, more like: I need to write down this config snippet without it looking like garbage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H-6l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H-6l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 424w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 848w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 1272w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H-6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png" width="986" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:986,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45614,&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://thoughts.jock.pl/i/194890196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.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_!H-6l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 424w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 848w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.png 1272w, https://substackcdn.com/image/fetch/$s_!H-6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe0d8936-59db-4b95-9d6b-5fe3b1d0bd5f_986x484.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 aria-hidden="true" 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><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 one that surprised me most: drag a screenshot onto a note and it extracts the text from it. Local OCR via Apple Vision, nothing leaves your machine. I use this all the time now. AutoPaste, timers, Pomodoro, find/replace with regex. You can export to Obsidian, Bear, Apple Notes when you&#8217;re done.</p><p>It&#8217;s polished. It&#8217;s calm. I like it a lot.</p><div><hr></div><p><strong>Building with AI agents?</strong></p><p>If you&#8217;re getting value from these experiments, the <a href="https://wiz.jock.pl/">wiz.jock.pl store</a> has resources I&#8217;ve built around AI workflows. Worth a look if you&#8217;re serious about running agents that actually work.</p><div><hr></div><h2>The beta is where it gets actually interesting</h2><p>Standard Antinote is already good. The beta version (v2.0.4+) adds extensions, and this is where I got excited.</p><p>Extensions are custom commands you invoke with <code>::</code> inside any note. There are 140+ official ones across AI, date, finance, text, data. You browse them in Settings and click to install. But you can also write your own. Minimum: two files, <code>manifest.json</code> and <code>index.js</code>. The repo is public on GitHub (<a href="https://github.com/johnsonfung/antinote-extensions">github.com/johnsonfung/antinote-extensions</a>).</p><p>Commands can insert text at cursor, replace the current line, replace the whole note, or trigger external URLs. API keys are stored in macOS Keychain, so nothing sensitive lives in a config file.</p><p>If you&#8217;re not comfortable writing JavaScript, there&#8217;s an AI Extension Builder. You describe what you want, it generates a prompt for Claude or ChatGPT, you paste the output into the two files and you&#8217;re done. Most simple things work first try.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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">Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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><hr></div><h2>What I wired up</h2><p><a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">My AI agent Wiz runs on a Mac Mini</a>, reachable over Tailscale. It has memory, tools, full project context. I&#8217;ve been building this for months and I wrote about the architecture a few times, including the big <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">identity and self-improvement post</a> if you want context. The point is: Wiz can do a lot if I can get input to it quickly.</p><p>I didn&#8217;t want to turn Antinote into another terminal. The value is in the lightness. So I built three commands and stopped.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oc9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oc9Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 424w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 848w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 1272w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oc9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png" width="1188" height="890" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1188,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88853,&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://thoughts.jock.pl/i/194890196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.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_!oc9Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 424w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 848w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.png 1272w, https://substackcdn.com/image/fetch/$s_!oc9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7206f92e-f89f-4aa3-994d-0de698f189e2_1188x890.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 aria-hidden="true" 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><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><code>::wiz</code> is the bare command. Wiz reads the note and tries to figure out what to do with it. Looks like meeting notes? It summarizes. Looks like a task? It creates one on <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">WizBoard</a>. Contains a URL? It fetches and summarizes. Most of the time it gets it right.</p><p><code>::wiz_do(instruction)</code> is when I want to be explicit. <code>::wiz_do(create task)</code>, <code>::wiz_do(draft linkedin post)</code>, <code>::wiz_do(remember)</code>, <code>::wiz_do(stage blog draft)</code>. No guessing, just dispatch.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!muyF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!muyF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 424w, https://substackcdn.com/image/fetch/$s_!muyF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 848w, https://substackcdn.com/image/fetch/$s_!muyF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 1272w, https://substackcdn.com/image/fetch/$s_!muyF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!muyF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png" width="1182" height="616" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:616,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89997,&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://thoughts.jock.pl/i/194890196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.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_!muyF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 424w, https://substackcdn.com/image/fetch/$s_!muyF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 848w, https://substackcdn.com/image/fetch/$s_!muyF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.png 1272w, https://substackcdn.com/image/fetch/$s_!muyF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f0ae91-1f70-48fb-955e-2a5a3f22278a_1182x616.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 aria-hidden="true" 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><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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ILXP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ILXP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 424w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 848w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 1272w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ILXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png" width="1092" height="878" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:878,&quot;width&quot;:1092,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:293834,&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://thoughts.jock.pl/i/194890196?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.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_!ILXP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 424w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 848w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.png 1272w, https://substackcdn.com/image/fetch/$s_!ILXP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68247644-9bbe-4cc4-bbb0-e01b24ef5d33_1092x878.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 aria-hidden="true" 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><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><code>::wizboard(view)</code> pulls task board state into the note. <code>::wizboard(today)</code> shows what&#8217;s scheduled. <code>::wizboard(now)</code> shows what&#8217;s running. I use this during planning to avoid switching apps.</p><p>The plumbing: the MacBook extension POSTs to a small HTTP server on Mac Mini over Tailscale. The server routes it, either to a fast path (Haiku, a few seconds) for things like task creation and idea logging, or to a full Claude Code session (Sonnet, 30-60 seconds) when intent is genuinely unclear. First attempts at the intent classifier were shaky, which is why I added <code>::wiz_do</code> for when I just want to be direct.</p><p>It&#8217;s not instant. That&#8217;s fine. I&#8217;m not looking for a chat interface. I&#8217;m looking for a way to hand something to Wiz without breaking what I&#8217;m doing. This does that.</p><h2>How to build your own (short version)</h2><p>You need the beta (v2.0.4+). Settings &gt; Extensions &gt; Open Extensions Folder. Make a folder for your extension, add two files.</p><p><strong>manifest.json:</strong></p><pre><code>{
  &#8220;name&#8221;: &#8220;my-extension&#8221;,
  &#8220;version&#8221;: &#8220;1.0.0&#8221;,
  &#8220;author&#8221;: &#8220;you&#8221;,
  &#8220;description&#8221;: &#8220;Does something useful&#8221;,
  &#8220;commands&#8221;: [
    { &#8220;name&#8221;: &#8220;mycommand&#8221;, &#8220;type&#8221;: &#8220;insert&#8221; }
  ]
}</code></pre><p><strong>index.js:</strong></p><pre><code>async function mycommand(context) {
  const noteContent = context.content;
  return { type: &#8220;insert&#8221;, content: &#8220;processed: &#8220; + noteContent };
}</code></pre><p>That&#8217;s it. Type <code>::mycommand</code> in any note to invoke it. If you need an API key, add it to <code>requiredAPIKeys</code> in the manifest and Antinote stores it in macOS Keychain. Access it inside the function via <code>context.apiKeys.your_key_name</code>.</p><p>For external calls, use <code>fetch()</code> normally. The extension has network access.</p><p>If you&#8217;re not writing JavaScript yourself, paste this into Claude or ChatGPT: &#8220;I want to build an Antinote extension that [describe what you want]. Give me the manifest.json and index.js files.&#8221; Works pretty well. The <a href="https://github.com/johnsonfung/antinote-extensions">GitHub repo</a> has real examples too, I&#8217;d start there first.</p><h2>The giveaway</h2><p>Antinote is $5 lifetime. Not expensive at all. But I think people here will actually use it, so I bought 10 licenses to give away.</p><p>I reached out to the developer. He matched my 10 and added another 10 on top. So we now have 20 to give away. That was a nice thing for him to do.</p><p>I built a small page to handle it properly. Enter your email, pick your tier (free or paid subscriber), and if a license is still available you&#8217;ll get one sent to your inbox with setup instructions.</p><p><strong><a href="https://wiz.jock.pl/experiments/antinote-giveaway">Claim your license here &#8594;</a></strong></p><p>Free and paid subscribers have separate pools (10 each). Paid subscribers have better odds because it&#8217;s a smaller group. Both pools open at the same time. First come, first served.</p><p>If you build something with the extensions, let me know. I&#8217;m curious what people end up making when you give them a proper hook into their own tools.</p><p>See you next week.</p><p>Pawel</p><div><hr></div><p><strong>Want to go deeper on AI agents?</strong></p><p>I write about this every week. If you&#8217;re on the free tier and getting value from these posts, consider upgrading to paid. You get every post in full, early access to experiments, and, apparently, better odds in giveaways. <a href="https://thoughts.jock.pl/subscribe">Upgrade here.</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/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://thoughts.jock.pl/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item></channel></rss>