<?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>Thu, 21 May 2026 15:56: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[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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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>]]></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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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>]]></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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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&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>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p 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>]]></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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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>]]></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>]]></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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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>]]></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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The 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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><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><item><title><![CDATA[Opus 4.7 Made Me Take Token Waste Management Seriously]]></title><description><![CDATA[TBH - I was working on it for a while now!]]></description><link>https://thoughts.jock.pl/p/token-waste-management-opus-47-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/token-waste-management-opus-47-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 17 Apr 2026 13:34:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DJx4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_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_!DJx4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DJx4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DJx4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75bf3e0f-7250-4ba8-9ddb-71dd941c4488_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;:5060100,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_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_!DJx4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!DJx4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75bf3e0f-7250-4ba8-9ddb-71dd941c4488_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Anthropic shipped Claude Opus 4.7 on April 16, 2026. Same per-token price as 4.6. New tokenizer. The official docs say it quietly: &#8220;This new tokenizer may use up to 35% more tokens for the same fixed text&#8221; (<a href="https://platform.claude.com/docs/en/about-claude/pricing">source</a>). Do the arithmetic. If you migrate your workload one-to-one, your bill goes up by up to 35% on identical inputs.</p><p>Until yesterday I treated token spend as a fixed cost of doing business. Opus 4.7 reframed it for me. When the same workload suddenly costs a third more, you stop thinking about usage and start thinking about <strong>waste management</strong>: which turns are productive, which ones are leaking money, and how to stop the leaks without kneecapping the agent. That is a real discipline. I had been ignoring it.</p><p>So I finally audited where my agents were actually burning money. I classified 133,087 assistant turns across 9,667 real Claude Code sessions for $19 total. The answer wasn&#8217;t what I expected, and it changed what I ship. This post is a walkthrough of what I found, what the research says about efficiency more broadly, and what token waste management looks like in practice, both the free version and the shortcut.</p><p>If you haven&#8217;t tried building serious automation on Claude Code yet, my <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">beginner agent guide</a> is a gentler entry point. If you have, keep reading.</p><h2>Token waste management is two-sided</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Jzq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Jzq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 424w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 848w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 1272w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Jzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png" width="1290" height="831" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:831,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158545,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.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_!3Jzq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 424w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 848w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.png 1272w, https://substackcdn.com/image/fetch/$s_!3Jzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017e4b49-62ed-4fd4-9a55-39f024c41b69_1290x831.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are two kinds of token bleeding. Most people only talk about one.</p><p>Side one is <strong>waste</strong>. The agent retries a failed tool call. It re-reads a file it already read. It gets stuck in a Cloudflare wall. It spawns a subagent whose output is never used. These are turns you paid for that produced nothing useful.</p><p>Side two is <strong>inefficient usage</strong>. Your CLAUDE.md is 8,000 tokens when 2,000 would do. Your system prompt repeats itself. You ask for &#8220;be concise&#8221; and the model gives you three paragraphs anyway. You don&#8217;t use prompt caching, so every turn pays the full input cost. The turns were productive, but more expensive than they needed to be.</p><p>With Opus 4.7&#8217;s tokenizer, side two just got 35% worse without anyone touching their code. If you were already on the edge of comfortable costs, you&#8217;re over it now. And the cache write cost also scales with those same tokens, so the first turn after a cache miss feels worse than you remember.</p><h2>What I measured</h2><p>I built a token waste sorter. It walks every Claude Code session JSONL and sorts each assistant turn into one of nine bins: productive, retry_error, cache_read, cache_write, reasoning, file_reread, oververbose_edit, dead_end, subagent_overhead. Seven bins are heuristic (no LLM). Two need a judge.</p><p>For the judge, I tried three models on the same 20 sessions where I knew dead ends existed:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!guhK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!guhK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 424w, https://substackcdn.com/image/fetch/$s_!guhK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 848w, https://substackcdn.com/image/fetch/$s_!guhK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 1272w, https://substackcdn.com/image/fetch/$s_!guhK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!guhK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png" width="778" height="140" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:140,&quot;width&quot;:778,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20201,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.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_!guhK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 424w, https://substackcdn.com/image/fetch/$s_!guhK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 848w, https://substackcdn.com/image/fetch/$s_!guhK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 1272w, https://substackcdn.com/image/fetch/$s_!guhK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe73dc3c6-8220-4f55-afdd-640c43640e2f_778x140.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Haiku was the clear winner. Sonnet at five times the price caught half as much. The local 4B model only caught explicit failures (blocked fetches, 403s) and missed everything that requires judging intent, like an agent searching the wrong platform for 28 straight turns. (<a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">More on why local LLMs struggle with judgment tasks here.</a>) The full audit of 9,667 sessions via OpenRouter Haiku cost me $19. That&#8217;s the cheapest observability I&#8217;ve ever bought.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pWTU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pWTU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 424w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 848w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 1272w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pWTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png" width="726" height="876" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:876,&quot;width&quot;:726,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129403,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.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_!pWTU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 424w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 848w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 1272w, https://substackcdn.com/image/fetch/$s_!pWTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5b1c91f-8f9a-4406-8cb1-6ac0562e0559_726x876.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/token-waste-management-opus-47-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/token-waste-management-opus-47-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><p>Top five waste clusters across all sessions:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LUV6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LUV6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 424w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 848w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 1272w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LUV6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png" width="777" height="205" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:205,&quot;width&quot;:777,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29938,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.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_!LUV6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 424w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 848w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 1272w, https://substackcdn.com/image/fetch/$s_!LUV6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94ffc875-95ba-4006-b9f4-68ab43ca1f91_777x205.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The surprise was the distribution. When I sampled only expensive sessions, Browser/Playwright showed up 5 times. On the full corpus it was 136. A 27x increase. The failure is spread thin across thousands of cheap cron and wake sessions, each one invisible individually, collectively the top bug. If you only audit your expensive sessions, you&#8217;ll miss this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-blO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-blO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 424w, https://substackcdn.com/image/fetch/$s_!-blO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 848w, https://substackcdn.com/image/fetch/$s_!-blO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 1272w, https://substackcdn.com/image/fetch/$s_!-blO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-blO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png" width="1254" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51895,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.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_!-blO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 424w, https://substackcdn.com/image/fetch/$s_!-blO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 848w, https://substackcdn.com/image/fetch/$s_!-blO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 1272w, https://substackcdn.com/image/fetch/$s_!-blO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f77394f-53b5-4b5c-b93b-5a55c73c485b_1254x318.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>None of these are &#8220;AI going down wrong paths&#8221; in the romantic sense. They&#8217;re infrastructure bugs. Stale cookies. Cloudflare walls. Tools that don&#8217;t exist in the current Claude Code version. Platform confusion. The AI is the messenger, not the source. (<a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">I wrote about the compounding value of fixing these in this earlier post</a>: one small fix applied across thousands of sessions is where real gains live.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1MFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1MFY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 424w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 848w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 1272w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1MFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png" width="588" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:588,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46077,&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/194516737?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.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_!1MFY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 424w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 848w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 1272w, https://substackcdn.com/image/fetch/$s_!1MFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf080b0-e0cc-49af-8784-f94bce95eeae_588x641.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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 one of my &#8220;nerd&#8221; posts. If you like it - 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>What the research says about the other half</h2><p>I went looking for academic and production data on cutting token usage, not just waste. Four things stood out:</p><p><strong>Prompt compression is real and large.</strong> Microsoft&#8217;s <a href="https://arxiv.org/abs/2310.05736">LLMLingua</a> and <a href="https://llmlingua.com/llmlingua2.html">LLMLingua-2</a> compress prompts 14-20x with around 1.5% quality loss. Your 7,000-token system prompt becomes 500 tokens with negligible quality drop on standard tasks. You don&#8217;t need to apply LLMLingua to use the insight: prompts have a lot of slack in them.</p><p><strong>System prompt bloat hurts quality, not just cost.</strong> Red Hat&#8217;s <a href="https://developers.redhat.com/articles/2026/02/23/prompt-engineering-big-vs-small-prompts-ai-agents">analysis</a> and the <a href="https://mlops.community/the-impact-of-prompt-bloat-on-llm-output-quality/">MLOps Community writeup</a> both land in the same place: prompts degrade quality around 3,000 tokens. Smaller, well-written system prompts outperform larger ones, and not just on latency. If your CLAUDE.md is multiple pages, it&#8217;s probably actively making the agent worse.</p><p><strong>Prompt caching is a 90% discount if you use it correctly.</strong> Anthropic&#8217;s <a href="https://platform.claude.com/docs/en/build-with-claude/prompt-caching">prompt caching</a> reduces cache-hit tokens to 0.1x the normal input price. To benefit, keep stable rules at the top of your context. Don&#8217;t reorder them mid-session. Put volatile, per-task content at the bottom. For Opus 4.7 the minimum cacheable length is 4,096 tokens, so small prompts can&#8217;t cache. Design for it.</p><p><strong>Long chains of thought do not always win.</strong> Recent work (<a href="https://openreview.net/pdf?id=W8dxn7hBkO">&#8220;overthinking&#8221; studies</a>) shows that on simple tasks, longer reasoning actively hurts performance. Production rule: use CoT for complex problems, direct answers for classification and retrieval. If you&#8217;re defaulting to &#8220;think step by step&#8221; on everything, you&#8217;re paying 3-5x tokens for a quality hit on half of them.</p><p>Add all four up and you have the other half of the story. Not every inefficiency is a bug. Most of it is prompt shape.</p><p>If you&#8217;re curious how different AI coding harnesses handle this stuff, my <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026">comparison of Claude Code vs Codex vs Aider vs OpenCode vs Cursor</a> goes deep on the efficiency differences between them. Short version: the harness matters almost as much as the model.</p><h2>Three things you can do today, free</h2><p>Before anything else, do these:</p><p><strong>1. Shrink your CLAUDE.md.</strong> Open it. If it&#8217;s over 3,000 tokens, you have room to cut. Move stable rules to the top (for cache hits). Kill anything that describes what Claude Code can already do. Kill historical notes that don&#8217;t change behavior. A tight CLAUDE.md both costs less AND makes the agent smarter.</p><p><strong>2. Set max_tokens tight and request structured output where possible.</strong> For classification tasks, request JSON with a schema. For quick answers, say &#8220;reply in under 50 words.&#8221; The model will drift long if you don&#8217;t put a number on it.</p><p><strong>3. Audit your WebFetch and browser failures.</strong> If you have any agent that does repeated web automation, find out if it&#8217;s hitting the same Cloudflare wall 100 times a week silently. The cost per hit is small. The total is not. For me this one cluster was $220 of silent monthly spend before I saw it.</p><p>These three alone will cut most users&#8217; bills 20-40%, at zero software cost.</p><h2>The deeper thing: the Agent Efficiency Kit</h2><p>Once I saw the clusters, the fixes were obvious but tedious: write a hook that denies redundant file reads. Write a hook that suggests firecrawl when WebFetch hits Cloudflare. Write a circuit breaker that stops the retry spiral after two failures on the same URL. Write agent-level instructions so the model internalizes the patterns. Build a dashboard so you can see what changed.</p><p>I did all of that. (The dashboard is built on the same principles as my <a href="https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026">WizBoard interface for agents</a>: don&#8217;t make the human hunt for the number, put it on screen.) Then I realized every Claude Code user in the world needs the same thing, and almost none of them are going to build it themselves. So I packaged it.</p><p>The <strong><a href="https://wiz.jock.pl/store/agent-efficiency-kit">Agent Efficiency Kit</a></strong> is a $49.99 drop-in package. It includes:</p><ul><li><p><strong>Three pre-wired hooks</strong> that run in your Claude Code settings: a file-reread guard, a WebFetch fallback hint, and a WebFetch circuit breaker. Script-based, zero ongoing AI cost, milliseconds of overhead per tool call.</p></li><li><p><strong>AGENT_INSTRUCTIONS.md</strong>, an approximately 1,000-token drop-in for your CLAUDE.md that tells the agent which patterns to follow and which to avoid. Cacheable, so you pay for it once per session at most.</p></li><li><p><strong>The taxonomy, classifier, and dashboard</strong> I used for the audit. Run them any time, on your own data, locally. The dashboard is a pinned tab.</p></li><li><p><strong>Optional Haiku-powered deep audit</strong>. If you want to classify a year of history for around $20 in OpenRouter credits, the scripts are ready to run.</p></li><li><p><strong>12 months of updates</strong>: new hook patterns, taxonomy expansions, dashboard features.</p></li></ul><p>It installs in one command. It doesn&#8217;t charge you tokens to measure itself. It works from the moment you restart Claude Code. You can read every file in the kit before running it, which is the version of trust I prefer.</p><p>My Paid subscribers get it for gree here: <a href="https://wiz.jock.pl/store/agent-efficiency-kit">wiz.jock.pl/store/agent-efficiency-kit</a>.</p><h2>The meta lesson</h2><p>Before Opus 4.7, token efficiency was a nice-to-have. After Opus 4.7, it&#8217;s a 35% forced haircut on everyone running on the frontier. The teams that measure their agents now will notice the bump, correct it, and keep going. The teams that don&#8217;t will slowly wonder why their AI bill is up and their features aren&#8217;t shipping faster.</p><p>The path to cheaper, better agents isn&#8217;t a smarter model. It&#8217;s better plumbing around the model. Old cookies, Cloudflare walls, a regex that didn&#8217;t sanitize a search term. These are the things that eat your budget. They stay invisible until you measure, at which point they&#8217;re obvious. Measure. Fix the top cluster. Repeat.</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><em>If you&#8217;ve read this far, you already have enough to start on the free side. If you want the shortcut, <a href="https://wiz.jock.pl/store/agent-efficiency-kit">the kit is there</a>. Either way, now is the moment. Tokens cost more tomorrow than they did yesterday.</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[Claude Code vs Codex CLI vs Aider vs OpenCode vs Pi vs Cursor: Which AI Coding Harness Actually Works Without You?]]></title><description><![CDATA[TL:TR I love Pi, but I can't use it.]]></description><link>https://thoughts.jock.pl/p/ai-coding-harness-agents-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-coding-harness-agents-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 15 Apr 2026 12:50:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FmiU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_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_!FmiU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FmiU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FmiU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af7d73c8-2213-4d55-8161-73a608810d27_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;:4626619,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_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_!FmiU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!FmiU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7d73c8-2213-4d55-8161-73a608810d27_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My AI agent <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">wakes up at 2am, picks tasks from a queue, ships code, and sends me a report by morning</a>. For that to work, I need a coding harness I can trust when I&#8217;m not watching.</p><p>Not a tool that helps me code faster. A tool that codes when I&#8217;m asleep.</p><p>That&#8217;s a different question than &#8220;which IDE is best.&#8221; IDEs are for humans who are present. Harnesses are for when you&#8217;re not. It&#8217;s also not the same question as &#8220;which has the best autocomplete.&#8221; That&#8217;s a different category entirely, one we&#8217;re not touching here.</p><p>I&#8217;ve used Claude Code daily for months, run Codex CLI and OpenCode in parallel, tested Pi, and dug into the open-source alternatives. This is what I actually think.</p><div><hr></div><h2>What a Harness Actually Is</h2><p>A harness connects the horse to the cart. In AI coding, it&#8217;s the set of tools and environment in which the agent operates.</p><p>Here&#8217;s the thing most people miss: LLMs can only generate text. That&#8217;s it. They can&#8217;t read your files, run commands, or edit code directly. What a harness does is give the model structured tool calls it can emit as text. The harness intercepts those, executes them with real code, appends the output to the conversation history, and prompts the model to continue. Every tool call follows the same loop: model pauses, harness runs something, result added to context, model restarts. At its core this is about 60-75 lines of Python. The complexity is entirely in the tuning: what tools the model gets, how those tools are described, and what the system prompt says.</p><p>This matters because the tuning is where harnesses actually diverge. Two harnesses running the same model on the same task can produce dramatically different results. Not because of the model, but because of what the harness tells the model it can do and how to use it.</p><p>Tab autocomplete isn&#8217;t a harness. It&#8217;s a suggestion box. A nice UI on top of an existing harness (like T3 Code, which wraps Claude Code and Codex CLI) is also not a harness. The real question for every tool below: can it take a task, execute it end-to-end across multiple files, handle errors, and report back without me in the loop?</p><div><hr></div><h2>Two Different Categories: Coding Tools vs Agent Orchestrators</h2><p>Before comparing specific tools, it&#8217;s worth naming the split that most comparisons ignore. Not all &#8220;AI coding harnesses&#8221; are trying to do the same thing.</p><p><strong>Coding tools</strong> are pair programmers. You direct each step. They execute that step very well, commit the result, and wait for the next instruction. Aider is the clearest example. Codex CLI leans this way too. Cline. These are tools built around the assumption that you&#8217;re at the keyboard and providing direction. They make individual tasks faster and better. They&#8217;re not designed to chain 40 decisions together autonomously while you sleep.</p><p><strong>Agent orchestrators</strong> are designed to take a goal and execute autonomously across multiple steps, files, and decision points. Claude Code is built for this. Devin is the extreme version. Pi, if you build out the harness fully, fits here. These tools are designed around the assumption that you&#8217;re not watching, and they need to make judgment calls without asking.</p><p>Most comparisons treat all of these as the same thing and rank them on the same axis. That produces misleading results. Aider isn&#8217;t trying to replace Claude Code for overnight autonomous runs. Codex CLI isn&#8217;t trying to be an agent orchestrator in the same sense Claude Code is. Judging them by the same criteria produces noise.</p><p>The honest answer to &#8220;which is best&#8221; depends entirely on which category you need. This post tries to be clear about which tools belong where, and let you make the call for your workflow.</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 Benchmark Reality (And Why It Doesn&#8217;t Tell the Full Story)</h2><p>SWE-bench Verified became the standard benchmark for this category. It measures how often a coding agent independently resolves real GitHub issues from start to finish. That status also made it a target. Researchers flagged contamination: training data for newer models overlaps with the test set, which inflates scores. The cleaner alternative is <strong>SWE-bench Pro</strong>, introduced in 2026, with 2,000+ problems that weren&#8217;t in any public training data. GPT-5.4-Codex leads there at 56.8%. Harder problems, more honest scores.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vQsd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vQsd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 424w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 848w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 1272w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vQsd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png" width="779" height="348" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:779,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61655,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.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_!vQsd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 424w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 848w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 1272w, https://substackcdn.com/image/fetch/$s_!vQsd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb96ed99-21df-4808-b1a4-5871c2e8b9d5_779x348.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Terminal-Bench 2.0 deserves a separate mention because it&#8217;s more relevant for agentic tasks than SWE-bench. It tests autonomous, multi-step execution in real terminal environments. Not just code edits. Actual shell navigation, file management, running commands in sequence, recovering from errors. The Claude Code harness configuration benchmarked here (&#8221;Claude Mythos&#8221;) hits 92.1%. Codex CLI hits 77.3%. That 15-point gap is a better signal for overnight autonomous work than SWE-bench numbers.</p><p>Now the result that breaks the &#8220;pick the highest number&#8221; logic. Matt Mayer ran an independent test comparing the same model inside different harnesses. Claude Opus: 77% in Claude Code, 93% in Cursor. Same model. Same tasks. 16 percentage points from the harness alone. That&#8217;s not an outlier. CORE-Bench found Claude Opus at 42% with a minimal scaffold, rising to 78% inside Claude Code&#8217;s full harness. Across multiple independent studies the harness effect ranges from 5 to 40 percentage points depending on model and task type.</p><p>A few flags before reading the tool sections. Cursor doesn&#8217;t publish SWE-bench Verified results and uses its own proprietary CursorBench at 61.3% instead. Draw your own conclusions. OpenCode and Pi have no published scores because their performance is entirely model-dependent. Devin&#8217;s frequently cited 13.86% figure is from 2023 and belongs in a museum. It does not appear in the current top 30 of any major leaderboard.</p><p>What the scores actually tell you: harness quality matters as much as the model you put in it. Cursor employs people whose full-time job is to rewrite system prompts and tool descriptions every time a new model ships. Claude will keep using a tool you label &#8220;deprecated.&#8221; Gemini will abandon structured tools entirely and only use bash. Cursor tests obsessively and adjusts. Most harnesses don&#8217;t. Keep this in mind across every section below.</p><div><hr></div><h2>Claude Code: The Deep Harness</h2><p><em>Category: Agent orchestrator | <a href="https://code.claude.com/">code.claude.com</a> | <a href="https://github.com/anthropics/claude-code">GitHub (114k stars)</a></em></p><p>Full disclosure: this is what I use daily, and what runs <a href="https://thoughts.jock.pl/p/ai-agent-self-extending-self-fixing-wiz-rebuild-technical-deep-dive-2026">Wiz</a> on a headless Mac Mini overnight. I try to be honest about 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_!MWqB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MWqB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 424w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 848w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 1272w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MWqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png" width="1456" height="776" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:776,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94729,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.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_!MWqB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 424w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 848w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 1272w, https://substackcdn.com/image/fetch/$s_!MWqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef7e7215-5bda-47fb-a788-05b19e724227_1576x840.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Claude Code is the most complete agentic runtime available right now. It reads <code>CLAUDE.md</code>, a project-specific instruction file that persists across every session. You can describe your entire architecture, your preferences, your forbidden patterns, and the agent carries that into every run without you repeating it. It has Agent Teams for spinning up parallel sub-agents that coordinate on a shared goal. As of March 2026, computer use means it can point and click through UIs, take screenshots, and handle workflows that resist scripting.</p><p>The thing <a href="https://thoughts.jock.pl/p/the-compounding-agent-ep4">I keep noticing with Claude Code</a> is that it genuinely builds on context over time. A session that starts with &#8220;add authentication&#8221; will remember the decisions it made about your auth architecture when it gets to &#8220;add rate limiting&#8221; three steps later. That coherence across a long task chain is what makes it feel like an agent rather than a very fast typist.</p><p>One important thing about how any harness uses context: the model only knows what&#8217;s in its conversation history. When Claude Code opens your project, it doesn&#8217;t already know your codebase. It explores via tool calls, building context incrementally. <code>CLAUDE.md</code> front-loads that context so fewer tool calls are wasted on discovery. Dumping your entire codebase into context (the old Repomix approach) is the wrong answer. Past around 50-100k tokens, model accuracy drops significantly. More context makes models dumber past a threshold. Good harnesses build context as needed, not all at once.</p><p><strong>Where it struggles:</strong> context loss on sessions longer than 2 hours, where it starts forgetting early decisions. Terminal-only interface has a real learning curve. Token consumption is 3-4x higher than Codex CLI per equivalent task, which compounds on long autonomous sessions.</p><p><strong>Best for:</strong> complex multi-file tasks, overnight autonomous runs, architecture-level changes that require consistent context across many steps.</p><p><strong>Pricing:</strong> Claude Pro ($20/mo) or Max ($100+/mo). For regular autonomous sessions, Max is almost certainly necessary. The per-token costs on long runs add up fast. For a detailed Claude Code vs Codex head-to-head from two months of real usage, <a href="https://thoughts.jock.pl/p/claude-code-vs-codex-real-comparison-2026">I covered that comparison separately</a>.</p><div><hr></div><h2>Codex CLI: Good, But Not What the Hype Says</h2><p><em>Category: Coding tool, emerging agent | <a href="https://openai.com/codex/">openai.com/codex</a> | <a href="https://github.com/openai/codex">GitHub (67k stars)</a></em></p><p>Codex CLI is not the old Codex model from 2021. It&#8217;s OpenAI&#8217;s terminal-based agent, open-source on GitHub, bundled with ChatGPT Plus or Pro, running on GPT-5.4. The benchmark puts it at 77.3% on SWE-bench, close to Claude Code&#8217;s 80.8%, and at 3-4x lower token cost. On paper, a strong contender.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wxrj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wxrj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 424w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 848w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 1272w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wxrj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png" width="1270" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82620,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.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_!wxrj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 424w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 848w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 1272w, https://substackcdn.com/image/fetch/$s_!wxrj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeecd0c-ed74-4c5c-8d48-3599dbae40b6_1270x816.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In practice, my honest read: it&#8217;s cold. That&#8217;s the right word. What I mean is that Codex CLI feels raw as an agent. It executes individual steps cleanly, but it doesn&#8217;t feel like it&#8217;s building toward something the way Claude Code does. Give it a multi-step task: add this feature, connect it to this other component, update the tests. It handles step one well, sometimes step two, and starts losing coherence by step three or four. It restates what it did, asks for clarification it shouldn&#8217;t need, or misses a dependency it should have caught from context it already has. That gap between 77.3% and 80.8% is exactly this: Claude Code holds context through longer chains.</p><p>Where Codex CLI genuinely shines is raw coding quality on focused tasks. iOS apps, macOS apps, web apps. Give it a specific, contained task and GPT-5.4 is excellent. The code quality on front-end work, app scaffolding, and UI logic is strong. I&#8217;d put it on par with or ahead of Claude Sonnet for this category of work. It&#8217;s not the harness that&#8217;s the advantage there. It&#8217;s GPT-5.4 being particularly strong at app development.</p><p>The architectural difference worth knowing: Codex CLI runs in cloud containers managed by OpenAI, not on your local machine. You can fire off a task and disconnect. The task keeps running without your terminal staying open. For batch work and overnight jobs where you&#8217;re not monitoring, that&#8217;s genuinely useful. For tight local loops where your environment variables and local state matter, you&#8217;re working around the sandboxing.</p><p><strong>Where it struggles:</strong> multi-step agentic chains with dependencies. Feels unfinished as a full harness compared to Claude Code. Less context coherence on complex tasks.</p><p><strong>Best for:</strong> focused coding tasks (especially apps), token-efficient runs, developers already on ChatGPT Plus who want to try a CLI agent without extra cost.</p><p><strong>Pricing:</strong> included with ChatGPT Plus ($20/mo) or Pro ($200/mo). If you&#8217;re already paying for ChatGPT, this is essentially free to try.</p><div><hr></div><h2>Aider: The Underrated Open-Source Standard</h2><p><em>Category: Coding tool (pair programmer) | <a href="https://aider.chat/">aider.chat</a> | <a href="https://github.com/Aider-AI/aider">GitHub (43k stars)</a></em></p><p>Aider is the tool most people in the &#8220;AI coding&#8221; conversation have never used, and it has 43,000 GitHub stars and 15 billion tokens processed per week in production. That&#8217;s not a toy project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n4U5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n4U5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 424w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 848w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 1272w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n4U5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png" width="647" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:647,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82641,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.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_!n4U5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 424w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 848w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 1272w, https://substackcdn.com/image/fetch/$s_!n4U5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0a2bbde-b8a5-4c4e-978f-4f4b4c0ebbd4_647x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The model is fundamentally different from Claude Code or Codex. Aider is a git-first pair programmer, not an autonomous orchestrator. You bring your own model, Claude Sonnet, GPT-5, Gemini 2.5, DeepSeek, Qwen, local Ollama, and Aider wraps it with git-native execution. Every AI edit becomes a commit. The repo map gives it structural understanding of your whole codebase before it touches anything. It auto-lints and runs tests after every change, self-fixing detected issues before reporting back.</p><p>The token efficiency is striking: 4.2x fewer tokens than Claude Code per equivalent task. If you&#8217;re paying for API access directly, Aider with Claude Sonnet is the most cost-efficient path to serious coding automation by a wide margin.</p><p>The honest tradeoff: Aider doesn&#8217;t orchestrate across 40 files and coordinate sub-agents. It executes a task, executes it well, and commits the result. It&#8217;s more like having a disciplined pair programmer who never skips a commit than a system that independently plans and executes a multi-hour architecture session. For incremental work, refactoring a module, implementing a feature, fixing a class of bugs, it&#8217;s the right tool. For overnight autonomous sessions that need to make judgment calls across large contexts: Claude Code.</p><p>The git-first philosophy deserves separate mention. Every change is committed. Your entire interaction with the agent is auditable, reversible, and reviewable inside your normal git workflow. No other tool in this list bakes that in at the same level.</p><p><strong>Best for:</strong> focused incremental work, budget setups, teams that want full audit trails, developers who want BYOM flexibility without giving up discipline.</p><p><strong>Pricing:</strong> free. You pay your model provider directly.</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>OpenCode: The Provider Switcher</h2><p><em>Category: Hybrid (coding + emerging agent) | <a href="https://opencode.ai/">opencode.ai</a> | <a href="https://github.com/opencode-ai/opencode">GitHub (72k stars)</a></em></p><p>OpenCode&#8217;s value proposition is breadth: 75+ LLM providers, all accessible from the same interface. Anthropic, OpenAI, Google, DeepSeek, AWS Bedrock, Azure, local Ollama, and more. I&#8217;ve used it with Claude Opus, GPT models, and open-weight models like Qwen and GLM. The switching experience is genuinely seamless in a way that nothing else matches. One command, different provider, same workflow. You can&#8217;t do that in Claude Code or Codex.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T-HV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T-HV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 424w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 848w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 1272w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T-HV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png" width="1456" height="974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:974,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:231578,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.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_!T-HV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 424w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 848w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 1272w, https://substackcdn.com/image/fetch/$s_!T-HV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552e400d-12a1-4911-aa5a-588d3ed73efb_3636x2432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But I&#8217;ll be honest about something: there&#8217;s something missing from the experience. It&#8217;s hard to name exactly. After using it alongside Claude Code for a while, I notice OpenCode doesn&#8217;t feel like it&#8217;s building a working relationship with your project. There&#8217;s no <code>CLAUDE.md</code> equivalent that persists project context. There&#8217;s no Agent Teams layer for coordinating parallel work. The autonomous behavior is functional but less mature. It handles individual tasks well, but it doesn&#8217;t feel like a system designed for extended unattended operation.</p><p>With open-weight models like Qwen and GLM, it&#8217;s fine. Gets the job done for straightforward tasks. You&#8217;re not going to get Claude Opus-level reasoning, but for routine edits and quick fixes, the cost savings are real.</p><p>The provider switching is genuinely the killer feature. If you&#8217;re doing model experiments, comparing how GPT-5.4 handles a task vs Claude Sonnet vs a local Qwen, OpenCode is the tool for that. If you already have subscriptions to multiple providers and want to use them without managing separate CLI tools, OpenCode is the right architecture. But for a long-term primary agent setup where you need consistent, deep project context: I&#8217;d reach for something else.</p><p><strong>Best for:</strong> model experimentation, teams with multiple provider subscriptions, privacy-first setups with local Ollama, cost arbitrage across providers.</p><p><strong>Pricing:</strong> free. BYOM.</p><div><hr></div><h2>Pi: The One I Actually Want to Use More</h2><p><em>Category: Coding tool + primitives harness | <a href="https://pi.dev/">pi.dev</a> | <a href="https://github.com/badlogic/pi-mono">GitHub</a></em></p><p>Pi is genuinely different from everything else here, and I want to say this upfront: I like it. It&#8217;s fast, it&#8217;s flexible, and the experience is clean in a way proprietary tools often aren&#8217;t. If I could choose without constraints, Pi is probably the closest thing to what I&#8217;d want as a daily harness alternative to Claude Code.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yEyT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yEyT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 424w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 848w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 1272w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yEyT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png" width="1456" height="134" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:134,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63914,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.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_!yEyT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 424w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 848w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 1272w, https://substackcdn.com/image/fetch/$s_!yEyT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f27329-14d2-45eb-84cb-c77f93107b9c_3714x342.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The design philosophy is the opposite of the &#8220;more features&#8221; trend. Its tagline is blunt: &#8220;there are many coding agents, but this one is mine.&#8221; Instead of an opinionated harness, it gives you primitives. A minimal core you configure yourself. Terminal TUI, 15+ LLM providers, tree-structured session history you can navigate and export, and four operation modes. The interesting one for builders: RPC mode. Pi runs as an embeddable subprocess inside a larger automation system. Your orchestration layer calls Pi, it executes the coding task, returns structured output. Designed to be a component in a system, not a standalone tool.</p><p>What&#8217;s deliberately absent: sub-agents, plan mode, permission popups, background processes. Pi&#8217;s bet is that most harnesses embed too many assumptions about your workflow. Strip to primitives, ship extensions via npm, build exactly what you need. AGENTS.md and SYSTEM.md play the same role CLAUDE.md does in Claude Code.</p><p>So why am I not using it more? One reason, and it&#8217;s a real one: <strong>Anthropic&#8217;s billing doesn&#8217;t let you bring your Max subscription to third-party harnesses.</strong></p><p>Pi is BYOM, bring your own API key. When I tested it with Claude, Pi surfaced a message explicitly: usage through Pi counts against API billing, not your Claude subscription. So if you&#8217;re on Claude Max ($100+/mo), using Pi with Claude means paying twice. The Max subscription for Claude Code, and API rates on top for Pi. Those costs add up fast on any serious coding session. I was paying from my own pocket to test something I wanted to use more. That&#8217;s not a good feeling.</p><p>This isn&#8217;t Pi&#8217;s fault. It&#8217;s Anthropic&#8217;s policy. They don&#8217;t allow third-party harnesses to draw on subscription credits. You have to use Claude Code to get what you&#8217;re paying for on the subscription. Google does the same with Gemini. Theo from T3 made this point in a recent video on harnesses: if you&#8217;re paying $200/month for Opus, you have to use their harness. OpenAI, by contrast, lets your API credits work across third-party tools freely.</p><p>In a world where Anthropic changed this, where your Max subscription applied to any MCP-compatible harness, Pi is probably what I&#8217;d reach for first. The speed, the flexibility, the primitives-first design: it fits the kind of automation system I&#8217;m building. But until that policy changes, the economics don&#8217;t work for anyone on a Claude subscription. You pay for Claude twice if you want to experiment with a different harness.</p><p>If you&#8217;re on GPT or open-weight models (Qwen, DeepSeek, GLM), Pi has none of these constraints. The billing goes through OpenAI or your provider directly. For a Claude-first setup: this is the wall you&#8217;ll hit.</p><p><strong>Best for:</strong> GPT or open-weight model setups, building custom harness architectures, embedding a coding agent as a subprocess in larger systems, developers who want full control with no opinions baked in.</p><p><strong>Not ideal for:</strong> Claude-first developers on Max. You&#8217;ll pay API rates on top of your subscription.</p><p><strong>Pricing:</strong> free, MIT license. BYOM. Factor in API costs if using Anthropic models.</p><div><hr></div><h2>Cursor: The Best Supervised Experience, Not Yet a Harness</h2><p><em>Category: IDE with supervised agent mode | <a href="https://cursor.com/">cursor.com</a></em></p><p>Cursor is an IDE first. Its agent mode deserves inclusion in this conversation because of how fast the direction is changing, not because it&#8217;s a harness today.</p><p>Cursor 3 (released April 2026) added cloud agents on isolated VMs, <code>/worktree</code> for isolated branch changes, self-hosted agents, and parallel Agent Tabs. 30% of Cursor&#8217;s own internal PRs are now agent-made. The supervised IDE experience, Design Mode where you annotate a mockup and get an implementation, parallel agents, and deep JetBrains support, is the best developer experience available at the keyboard right now.</p><p>As an overnight harness: not there. When left without supervision, it stalls at the first ambiguous decision point. That&#8217;s not a bug. It&#8217;s a design choice. Cursor is built for developers who are present and want an agent that won&#8217;t make unilateral decisions on their codebase. That&#8217;s the right call for most developers. It means Cursor isn&#8217;t the right tool for autonomous runs.</p><p>The 77% to 93% Opus benchmark is the thing worth studying. Cursor extracts more from the same model through obsessive harness tuning. People whose whole job is to rewrite system prompts and tool descriptions for each new model release. The gap is real and compounds across tasks. The cloud agents direction makes me think this section of the comparison will look very different in 12 months.</p><p><strong>Best for:</strong> daily supervised coding, developers who want the best IDE-plus-agent experience at the keyboard.</p><p><strong>Pricing:</strong> Hobby (free), Pro ($20/mo), Ultra ($200/mo), Teams ($40/user/mo).</p><div><hr></div><h2>A Few More Worth Knowing</h2><p><strong><a href="https://goose-docs.ai/">Goose</a> (Block/Square, <a href="https://github.com/block/goose">GitHub, 41k stars</a>):</strong> Open-source, MCP-based, general-purpose agent. Not coding-specific, but handles code tasks well. Right fit if you want automation that goes beyond coding into broader workflows. Apache 2.0 license.</p><p><strong><a href="https://cline.bot/">Cline</a> (<a href="https://github.com/cline/cline">GitHub, 60k stars</a>):</strong> Open-source, supports VS Code, JetBrains, Neovim, Emacs. Widest multi-IDE coverage of any tool in this list. Good MCP support. Worth looking at if your stack spans multiple editors.</p><p><strong><a href="https://geminicli.com/">Gemini CLI</a> (Google, <a href="https://github.com/google-gemini/gemini-cli">GitHub, 96k stars</a>):</strong> Free with a Google account. 60 requests/minute, 1,000/day, 1 million token context window. Genuinely generous free tier. Strong on frontend tasks. The right starting point if budget is the hard constraint and you don&#8217;t have API credits elsewhere.</p><p><strong><a href="https://devin.ai/">Devin</a> (Cognition):</strong> Full autonomy, cloud sandbox, Linux shell, browser. Significantly more accessible than before: Core tier at $20/mo plus $2.25 per ACU (autonomous compute unit). Resolves 13.86% of real GitHub issues end-to-end, a dramatic improvement over what was possible two years ago. Worth evaluating for teams with consistent engineering backlogs, not just enterprise anymore.</p><p><strong><a href="https://github.com/pingdotgg/t3code">T3 Code</a> (Theo):</strong> Not a harness. A UI wrapper on top of Claude Code and Codex CLI. Useful to name because it comes up in these conversations. If you don&#8217;t have Claude Code installed, T3 Code won&#8217;t do Claude tasks. The UI is the product, not the agent.</p><div><hr></div><h2>Same Task, Different Harness</h2><p>The fairest way to compare these is to run the same type of task and watch what happens. Here&#8217;s the pattern I kept seeing:</p><p><strong>Complex multi-step agent task (e.g. &#8220;add this feature, connect it to the auth system, update the affected tests, write a changelog entry&#8221;):</strong> Claude Code holds the chain. It remembers what it did in step one when it reaches step four. Codex CLI starts strong and starts fraying around step three. OpenCode and Aider handle each step well in isolation, but need more direction between steps.</p><p><strong>Focused app development (iOS, macOS, web UI):</strong> Codex CLI with GPT-5.4 is competitive here. The code quality on app work is strong, sometimes ahead of Claude Sonnet. Claude Code with Opus is still better on complex multi-component app logic, but for a contained feature or a new screen: Codex CLI is a legitimate choice.</p><p><strong>Budget-constrained incremental refactoring:</strong> Aider with Claude Sonnet or DeepSeek is the clear call. The 4.2x token efficiency advantage is real. The git-first commit-per-change model gives you a clean audit trail. You pay for what you actually use.</p><p><strong>&#8220;I want to run the same task with three different models and compare&#8221;:</strong> OpenCode. Nothing else makes provider switching this frictionless.</p><p><strong>Overnight autonomous work where you&#8217;re not monitoring:</strong> Claude Code. The infrastructure is designed for exactly this. CLAUDE.md project context, background scheduling, Agent Teams, error handling. Everything else is built around having a human present.</p><div><hr></div><h2>Which One Fits Your Workflow?</h2><p>There&#8217;s no universally &#8220;best&#8221; harness. The honest answer depends on a few questions about how you actually work.</p><p><strong>Are you at the keyboard or not?</strong> If you&#8217;re supervising every step, Cursor gives you the best IDE experience and the most model-agnostic setup. If you want autonomous execution with no supervision, Claude Code is the only tool built end-to-end for that. Everything else sits somewhere in between.</p><p><strong>Do you need to chain many steps or execute one step well?</strong> Multi-step autonomous chains with dependencies: Claude Code. Focused, contained tasks with excellent code quality: Aider or Codex CLI. There&#8217;s a real difference between a pair programmer and an orchestrator, and the right choice depends on which problem you&#8217;re actually solving.</p><p><strong>What&#8217;s your budget?</strong> If you&#8217;re price-sensitive, Aider with a cheap backend (DeepSeek, Qwen, even Gemini) is the clearest path to real coding automation at minimal cost. Gemini CLI is free with generous limits. OpenCode lets you use whatever provider is cheapest for the task at hand. None of these require a $100/mo subscription.</p><p><strong>Do you care about model flexibility?</strong> If you want to switch between Claude, GPT, open-weight models, and local Ollama without friction, OpenCode or Aider are the right architectures. Claude Code and Codex CLI are provider-locked.</p><p><strong>Are you building a system or using a tool?</strong> If you&#8217;re assembling a larger automation where a coding agent is one component among many, Pi&#8217;s RPC mode and primitives-first design is worth the setup investment. If you just want to get code written, start with Claude Code or Aider depending on your budget and task type.</p><p>Like, the mistake most people make is picking a tool based on a benchmark and then wondering why it doesn&#8217;t feel right in their actual workflow. The benchmark measures what the model can do on a standardized task. Your workflow isn&#8217;t a standardized task.</p><div><hr></div><h2>The Decision Matrix</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_9X6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_9X6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 424w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 848w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 1272w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_9X6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png" width="1287" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:1287,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104896,&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/194290844?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.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_!_9X6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 424w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 848w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 1272w, https://substackcdn.com/image/fetch/$s_!_9X6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff661b22f-be9c-4380-9e79-aa5166edb084_1287x390.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/ai-coding-harness-agents-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-coding-harness-agents-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><h2>The Honest Verdict</h2><p>After months of real use, here&#8217;s where I land.</p><p><strong>Claude Code for autonomous execution.</strong> Not because it&#8217;s perfect. Context loss on sessions over 2 hours is a genuine problem, and the token cost is genuinely high. But it&#8217;s the only tool built, end to end, for the question &#8220;can I leave this running while I sleep?&#8221; Agent Teams, background scheduling, CLAUDE.md project memory, computer use. The infrastructure reflects that goal. <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">My headless Mac Mini setup</a> runs on this for exactly this reason.</p><p><strong>Codex CLI for app work.</strong> GPT-5.4 is genuinely excellent at iOS, macOS, and web app development. For a contained feature with a clear spec, it&#8217;s fast, cheap, and produces clean code. The harness feels raw for complex agentic chains, but for the coding task itself, it earns its place.</p><p><strong>Aider for budget, discipline, and BYOM.</strong> The 4.2x token efficiency is real. The git-first model is actually better discipline than what you get from proprietary tools. If you want to run open-weight models like Qwen or DeepSeek and maintain a clean git history, Aider is the right architecture.</p><p><strong>OpenCode for model exploration.</strong> If you&#8217;re actively experimenting with providers or you have multiple subscriptions you want to use from a single interface, nothing else compares on the switching experience. But don&#8217;t expect it to replace Claude Code for sustained agent work.</p><p><strong>Pi for builders (with an asterisk).</strong> If you&#8217;re constructing a system where a coding agent is one component among many, the RPC mode and primitives-first design are genuinely the right architecture. It&#8217;s fast, it&#8217;s flexible, and if I had no constraints I&#8217;d use it far more. The asterisk: Anthropic currently doesn&#8217;t allow third-party harnesses to draw on Max subscription credits. Pi showed me this explicitly in a message during testing: API usage bills separately on top of your subscription. Until Anthropic changes that policy, Pi is most practical on GPT or open-weight models. Claude-first developers are forced to pay twice.</p><p>The deepest insight from the benchmark data is that harness tuning matters as much as model quality. Same model, different harness: 16 percentage points (77% &#8594; 93%, Opus, Claude Code vs Cursor). Multiple independent studies show a 5-40 point range from harness quality alone. If results from any of these tools feel inconsistent, the harness is the first place to look: system prompt, tool descriptions, context management. Not the model. For autonomous overnight work specifically, look at Terminal-Bench 2.0, not just SWE-bench. The 92.1% vs 77.3% gap between Claude Code and Codex CLI in agentic terminal tasks is a better signal for that use case than code-editing scores.</p><div><hr></div><p>One thing for paid subscribers. The most relevant store product to this post is the <a href="https://wiz.jock.pl/store/claude-code-prompts">Claude Code Prompt Pack</a>: 50+ prompts organized by task type, pulled from real overnight sessions where I needed the harness to actually work without me. If you&#8217;re on a monthly plan, you get one free product from the store per month. That&#8217;s a good pick.</p><p>If you&#8217;re on yearly, the full store is already included. If you&#8217;re still on the free plan, this is roughly what paid unlocks in practice: the store and a weekly dispatch that goes deeper than the public posts.</p><p><em>I write about building with AI agents from a practitioner&#8217;s perspective. No hype, no affiliate links. <a href="https://thoughts.jock.pl/subscribe">Subscribe here</a> if you want more of this.</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 Spent 2 Months Building Custom Software for My AI Agent. Last Week I Replaced It All.]]></title><description><![CDATA[The question was never "can I build it?" It was always "should I?"]]></description><link>https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Mon, 13 Apr 2026 12:01:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tiIX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_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_!tiIX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tiIX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tiIX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0afcb23-d79b-441f-a0f4-f3833ac31c41_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;:4117222,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_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_!tiIX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!tiIX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0afcb23-d79b-441f-a0f4-f3833ac31c41_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you start building an AI agent, it works great in the terminal. CLI conversations, Discord messages, email reports. You talk to it, it talks back, things get done. For a while, that&#8217;s enough.</p><p>Then you start building more. More automations. More projects. More things happening in the background while you sleep. Your agent <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">runs night shifts</a>, handles tasks across multiple channels, manages a growing list of things. And at some point you realize: you can&#8217;t see any of it. Not in a way that actually helps you think.</p><p>I could always ask my agent what&#8217;s going on. &#8220;What tasks are open? What did you do last night? What&#8217;s the status of project X?&#8221; And it would answer. Correctly, usually. But that&#8217;s not the same as seeing it. Humans need surfaces. We need to look at something, drag something, scan a board and instantly know what matters. That&#8217;s not a weakness. That&#8217;s how our brains are wired.</p><p>This is the story of how I built custom software to give my AI agent a visual interface. How that software grew, broke, and eventually taught me a lesson I should have learned earlier: the hardest question in the agent era is not whether you <em>can</em> build something. It&#8217;s whether you <em>should</em>.</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 write about building AI agents, the mistakes, and what actually works. Subscribe for free and get every post.</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>Phase 1: Notion (worked until it didn&#8217;t)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bQP9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bQP9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 424w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 848w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bQP9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png" width="1456" height="1292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1292,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236619,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.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_!bQP9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 424w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 848w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!bQP9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25b592c8-c0f6-4842-9e43-b06d2c0ca694_2373x2106.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Before I built anything custom, I used Notion. <a href="https://thoughts.jock.pl/p/notion-ai-context-management-ai-ceo-system-progress-update">I wrote about that setup back in December 2025</a>. My agent could read and write to Notion databases, create tasks, update statuses. It worked. Sort of.</p><p>The problem with Notion was that it&#8217;s designed for humans organizing things manually. The API is slow. The data model is rigid in weird places and too flexible in others. I wanted specific views, specific behaviors, specific integrations that Notion simply wasn&#8217;t built for. I wanted a task to appear on a board the moment my agent starts working on it. I wanted real-time updates. I wanted the whole thing to feel like it was built for one person and one AI agent working together, because that&#8217;s exactly what it was.</p><p>So I did what any person with access to a capable AI would do in early 2026. I built my own.</p><h2>Phase 2: Building WizBoard (the fun part)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QmrV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QmrV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 424w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 848w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QmrV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png" width="1456" height="483" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:483,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:453433,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.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_!QmrV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 424w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 848w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!QmrV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51875c61-eb57-4440-a4fd-a9fc843de3c1_3524x1170.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>January and February 2026 was peak <a href="https://thoughts.jock.pl/p/vibe-coding-revolution-non-programmers-ai-software-development-2025">vibe coding</a> energy. You could describe what you wanted, and a capable AI would build it. Not a prototype. Not a mockup. A working application with a database, API, authentication, the whole thing. I described what I needed, and my agent built it.</p><p>WizBoard was a custom kanban board. FastAPI backend, SQLite database, deployed on my own server. It had everything I wanted:</p><ul><li><p>A visual board where tasks moved through columns (Backlog, Next, Now, Waiting, Done)</p></li><li><p>Real-time updates. When my agent started a CLI session, a card appeared in &#8220;Now&#8221; immediately</p></li><li><p>Deep integration with every automation. Night shift plans, day shift tasks, Discord bot commands, email reports. Everything flowed through WizBoard</p></li><li><p>Custom metadata: areas, projects, priorities, task types, queue state</p></li><li><p>Clusters, which was my attempt at grouping related tasks visually. Like a meta-layer on top of the board</p></li><li><p>Focus timers. I was tracking how long each task took, thinking I&#8217;d use the data to improve planning. I never used the data</p></li><li><p>A review flow with submit, approve, and resolve stages. My agent would finish work, submit it for review, and I&#8217;d approve or send it back</p></li><li><p>An offline queue so that when the server was down, mutations would pile up locally and replay when it came back</p></li><li><p>A 3,700-line Python API client that every script in my system imported</p></li></ul><p>It was great. I loved using it. The feeling of seeing my agent&#8217;s work appear on a board in real time, being able to drag cards, add comments, review what happened overnight. That was exactly what was missing from the CLI-only experience.</p><p>So naturally, I kept going. Web version working? Let&#8217;s build a native macOS app. SwiftUI, menu bar integration, keyboard shortcuts, drag-and-drop. Focus mode that showed one task at a time with a timer in the menu bar (because ADHD). Then an iOS version with widgets, push notifications, Live Activities. <a href="https://thoughts.jock.pl/p/wiz-1-5-ai-agent-dashboard-native-app-2026">I wrote about this too.</a> Three platforms. All custom. All built by my agent. All working.</p><p>54 commits over two months. It was genuinely fun to build. Every idea I had, I could add. &#8220;What if tasks could be grouped into clusters?&#8221; Done. &#8220;What if the menu bar showed my current focus task?&#8221; Done. &#8220;What if the iOS widget showed my top 3 priorities with live countdown?&#8221; Done. The possibilities felt endless, and that was precisely the problem.</p><h2>Phase 3: The Productivity Paradox hits home</h2><p>I wrote a whole post about <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">the AI productivity paradox</a>. The short version: you can build so many things so fast that the bottleneck stops being technical and starts being mental. You run out of brain before you run out of capability.</p><p>WizBoard was a textbook case.</p><p>My agent was creating tasks, completing tasks, moving things between columns, posting comments, running automations. All of this showed up on my board. Every single thing. And the more capable the system became, the more things happened, and the more overwhelmed I felt looking at the board I built to reduce my overwhelm.</p><p>I wasn&#8217;t more efficient. I was drowning in my own tooling.</p><p>The obvious answer was: simplify. Strip features. Go back to basics. I tried that. And this is where the real problems started.</p><p>When you build a custom system from scratch, everything is connected in ways that are hard to see until you start pulling threads. I wanted to simplify the task model, change how statuses worked, clean up the architecture. Every change broke something else. The web version would work, but the iOS version wouldn&#8217;t. Fix that, and the automation scripts would fail because they expected the old API shape. Fix those, and the night shift planner would create tasks with wrong metadata.</p><p>I found myself spending entire sessions just fixing things I&#8217;d broken while trying to make the system simpler. That&#8217;s the trap. You&#8217;re not building anymore. You&#8217;re maintaining. And maintaining custom software across three platforms (web, macOS, iOS) with a 3,700-line API client and dozens of automation consumers is a full-time job. I don&#8217;t have a full-time job&#8217;s worth of attention for my task board.</p><p>Here&#8217;s what I mean by specific failures. During one &#8220;simplification&#8221; pass, the optimization changes made the board sluggish instead of faster. New features that seemed simple (changing how task statuses map to columns) cascaded into the API client, the automation scripts, the native app&#8217;s sync logic, and the notification system. Every platform had slightly different behavior because they were all built at different times with different assumptions.</p><p>I realized something: the code was fine. My agent writes good code. The architecture was the problem, and it was my architecture. I had designed a system that was perfectly tailored to my needs in February, and by April those needs had evolved, and the tailoring was now a constraint.</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">Free subscribers get every post: architecture breakdowns, migration stories, and honest takes on what breaks when you build with AI agents.</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 realization: Can vs. Should</h2><p>This is the thing I want to talk about, because I think a lot of people building with AI agents are going to hit this exact wall.</p><p>When you have a capable AI agent, you can build almost anything. Custom task managers, dashboards, native apps, full-stack web applications. The <a href="https://thoughts.jock.pl/p/vibe-coding-security-reality-check-ai-apps-fast-development-nightmares">vibe coding era</a> made this feel effortless. And it kind of is, for version one. The agent builds it, it works, you use it, life is good.</p><p>I don&#8217;t hear this question very often in the excitement of version one: who maintains version twenty?</p><p>I had a working web app, a working macOS app, a working iOS app, a 3,700-line API client, fifty-plus automation scripts that all talked to this system, and a database with hundreds of tasks. All custom. All mine. All maintained by me and my agent. And every improvement required touching all of these surfaces. That&#8217;s not a system. That&#8217;s a debt.</p><p>The realization was simple: I need foundations. Real foundations. Built by people who&#8217;ve been thinking about project management software for twenty years, not by me in a weekend coding session.</p><h2>Phase 4: Finding Fizzy</h2><p>37signals has been building project management software since before most people had smartphones. Basecamp, HEY, and now Fizzy. I&#8217;ve read their books. I like how they think about software: simple, opinionated, finished. Not &#8220;feature-rich.&#8221; Finished.</p><p>One of the reasons I got into coding originally was Ruby on Rails, and <a href="https://thoughts.jock.pl/p/rediscovering-coding-joy-with-ruby">Rails is something I genuinely enjoy</a>. It&#8217;s the heart of everything 37signals builds. When they open-sourced Fizzy last year (<a href="https://github.com/basecamp/fizzy">github.com/basecamp/fizzy</a>), a simple kanban board built on modern Rails, I bookmarked it and moved on. I had my own thing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_lCD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_lCD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 424w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 848w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_lCD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png" width="1456" height="936" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:936,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144374,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.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_!_lCD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 424w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 848w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!_lCD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1a8188-b63b-4b9d-b480-482e361977f5_1631x1048.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Last week, I came back to that bookmark.</p><p>Fizzy is, on the surface, a simple kanban board. Cards in columns. Drag them around. But the foundations are deep. Here&#8217;s what I mean:</p><ul><li><p><strong>Real architecture.</strong> Multi-tenant with URL-based account isolation. Passwordless magic-link authentication (no passwords to manage, no OAuth to configure). UUID primary keys. Proper background jobs via Solid Queue, no Redis dependency</p></li><li><p><strong>Real-time.</strong> WebSocket-driven updates. When my agent moves a card, I see it move. No refresh needed. This is something I had to build from scratch in WizBoard. Here it just works</p></li><li><p><strong>Entropy system.</strong> Cards that sit untouched for too long get auto-postponed to &#8220;not now.&#8221; This alone is worth the switch. My old board had cards that sat in Backlog for weeks, creating visual noise. Fizzy gently clears them out</p></li><li><p><strong>Steps.</strong> Checklist items on cards. This replaced my need for sub-task cards entirely</p></li><li><p><strong>Golden cards, reactions, cover images.</strong> Priority highlighting, emoji reactions, visual richness. All built in</p></li><li><p><strong>Board-level notification controls.</strong> I want notifications from my Ops board. I don&#8217;t want them from the Automations board. One toggle per board</p></li><li><p><strong>PWA.</strong> Works on mobile out of the box. Not as rich as my old native iOS app, but I don&#8217;t need widgets and Live Activities. I need to see my board and drag cards</p></li><li><p><strong>Full-text search.</strong> 16-shard MySQL search across all cards, comments, descriptions. My old SQLite setup couldn&#8217;t match this</p></li><li><p><strong>Deployable via Kamal.</strong> Docker-based zero-downtime deployment. I forked the repo, configured it for my server, and had it running in an afternoon</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LW0Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LW0Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 424w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 848w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 1272w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LW0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png" width="1456" height="949" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:949,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133017,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.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_!LW0Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 424w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 848w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 1272w, https://substackcdn.com/image/fetch/$s_!LW0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9612cefc-1841-4815-8dad-858ce6c7bddd_1606x1047.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The critical thing: it starts simple and lets you decide how complex it gets. My old WizBoard started complex because I designed it for my specific use case from day one. Fizzy starts with a board and columns and cards. Everything else is optional. The data model is minimal: cards have tags, not separate tables for areas, projects, priorities, types, and clusters. One concept (tags with prefixes like <code>area/Automation</code> or <code>p/High</code>) replaces five database tables from my old system.</p><h2>The migration: one day, twenty-one commits</h2><p>Here&#8217;s where it gets technical, and I think this part matters because it shows how to migrate away from custom software without breaking everything that depends on it.</p><p>I had fifty-plus scripts that talked to my old WizBoard API. Night shift planners, day shift executors, Discord bot, iMessage handler, CLI session hooks, cron runners, health monitors. Rewriting all of them was not an option. I&#8217;d be right back in the maintenance trap.</p><p>The solution was a dispatcher shim. I took the 3,700-line API client and replaced it with a 94-line router. That router loads either the new Fizzy-backed client or the old legacy client, based on one environment variable. Every automation script keeps importing the same file, calling the same functions, getting the same response shapes. They don&#8217;t know anything changed.</p><p>The new Fizzy client translates everything on the fly. When a script calls <code>task_create(title="...", area="Automation")</code>, the shim creates a Fizzy card with a tag <code>area/Automation</code>. When a script reads a task back, the shim synthesizes the old data shape from Fizzy&#8217;s card, columns, and tags. Legacy integer task IDs get looked up in a translation table. The offline queue (for when the server is down) works identically.</p><p>The whole cutover happened in a single day. Twenty-one commits between 2pm and 10pm. The first commit was the shim and the new client. Then guardrails: a parity probe that runs the full lifecycle (create, tag, comment, claim, review, approve, close, delete) in under six seconds, a drift monitor that compares old and new systems every five minutes, an orphan sweeper for dead session cards.</p><p>Then the real work started: dogfooding. Using the system for real work and watching what breaks.</p><h2>What broke (and what I learned from each failure)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8e5W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8e5W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 424w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 848w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 1272w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8e5W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png" width="1456" height="1394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1394,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:222474,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.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_!8e5W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 424w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 848w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 1272w, https://substackcdn.com/image/fetch/$s_!8e5W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02f88a05-a97c-4417-9c15-5a3f5cfeec0b_1692x1620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A lot broke. That&#8217;s expected when you swap the foundation under a running system. What matters is that every failure taught me something about assumptions I didn&#8217;t know I was making.</p><p><strong>The hard-coded URL.</strong> My session-end script had a direct URL to the old system baked into it. It bypassed the shim entirely. Every CLI session was leaving orphaned cards on the board because the completion logic was silently failing against a system that didn&#8217;t have those task IDs. I only noticed because the board was getting cluttered with cards that never closed.</p><p><strong>The cron drift bug.</strong> My automations run on macOS launchd, which doesn&#8217;t guarantee precise timing. A schedule like &#8220;every 2 minutes&#8221; assumes the system wakes up on even minutes. It doesn&#8217;t. Over time, launchd drifts to odd minutes, and the strict cron parser never matches. I had automations that fired once and then silently stopped. Fix: a 4-minute lookback window that catches drifted schedules without double-firing.</p><p><strong>The disappearing automations.</strong> This one was fun. After every successful automation run, the system closed the automation&#8217;s card. Which makes sense for tasks. Tasks finish. But automations are definitions. They run forever. &#8220;Post a greeting in different languages every 2 minutes&#8221; should cycle between Idle and Running, not disappear into Done after its first successful run. I watched one automation fire exactly once and vanish. The fix was treating automation cards as permanent residents that never close, only change columns.</p><p><strong>The comment flood.</strong> My Discord bot runs every minute. The old system handled this fine because it was designed for it. The new system faithfully logged every run as a comment on the automation card. 2,880 comments per day from one automation alone. The board became unreadable. Fix: smart gating that skips success comments for high-frequency automations (every-minute pollers don&#8217;t need a &#8220;success&#8221; note 1,440 times a day) but always logs failures.</p><p><strong>The title flip-flop.</strong> This was the most visible bug. Every time I completed a subtask during a CLI session, the system closed the session card, which triggered a self-healing mechanism that created a new &#8220;Working...&#8221; card, which then got renamed seconds later. On the board, I could see the title flickering between &#8220;Working...&#8221; and the actual title every few minutes. The fix was rethinking what &#8220;complete a subtask&#8221; means: it should add a checklist item to the existing card, not close and recreate it.</p><p>Each of these failures had the same root cause: the old system was built around one-shot tasks. The new system needed to support long-lived definitions, high-frequency automations, and multi-step sessions. Same data (cards on a board), fundamentally different lifecycle assumptions.</p><p></p><h2>What the new setup looks like</h2><p>Two boards. That&#8217;s it.</p><p><strong>Wiz Ops</strong> is my board. Tasks I care about, things I need to do or review. Columns: Triage, Next, Now, Waiting, Review, and a Queue for things I want done but not right now. When I add a card and assign it to my agent, it picks it up, does the work, leaves a comment with what it did, and moves the card to Review. When something is done, it&#8217;s done. I have notifications turned on for this board because everything here is relevant to me.</p><p><strong>Automations</strong> is my agent&#8217;s board. Each automation is one permanent card. Columns: Intake, Disabled, Idle, Running, Needs Attention. Cards never close. They cycle between Idle and Running on their schedules. If something fails, it moves to Needs Attention and stays there until someone looks at it. I have notifications turned off for this board because most of what happens here is routine. If something produces a meaningful output, it surfaces on Wiz Ops as a done card with the summary.</p><p>The Intake column is one of my favorite things. I can drop a card there with something like &#8220;Send me a weather forecast every morning at 7am&#8221; and my agent picks it up, converts it to a proper automation definition with a schedule and a prompt, and moves it to Disabled for my review. Natural language to working automation. That&#8217;s the kind of thing that&#8217;s only possible when your task board and your AI agent share the same system.</p><h3>What I kept from the old system</h3><p>The Queue concept. Sometimes you have a task that doesn&#8217;t need to happen now, but you want it queued for the next day shift or night shift. Drop it in Queue, it gets picked up at the right time. This carried over directly.</p><p>Shift summary cards. My agent creates a &#8220;Nightshift 2026-04-10&#8221; card with checklist items for each planned task. As it works through the night, it checks off items and adds notes. When I wake up, I can see exactly what happened, with context, right on the board. Same for day shifts. I still get email reports, but having it on the board means I can go back, ask questions via comments, and see the history.</p><p>Real-time CLI visibility. When I start a CLI session, a card appears in Now. When I complete pieces of work, they show up as checklist steps on that card. When the session ends, the card closes with a summary. I can watch my own work happening on the board while I&#8217;m doing it.</p><h3>What Fizzy gave me for free</h3><p>Golden cards for priority highlighting. Emoji reactions on cards. Cover images. HTML descriptions for rich content. Column colors. Board-level notification controls. &#8220;Not now&#8221; for things I want to acknowledge but not deal with. Full-text search across everything. The entropy system that auto-postpones stale cards (this alone prevents the infinite todo list problem). PWA that works well on mobile. All of this out of the box, maintained by a team that&#8217;s been building software like this for two decades.</p><p>I don&#8217;t have the macOS native app anymore. I don&#8217;t have the iOS app with widgets and Live Activities. I work in the browser now. And honestly? It&#8217;s fine. The PWA handles mobile well enough. I might build a native shell later. But the point is: I stopped spending time maintaining three custom platforms and started spending time using one good one.</p><p><em>If you want to set up something similar for your own agent, I packaged the two-board architecture, dispatcher shim, and backend adapters for Notion/Linear/REST into the <a href="https://wiz.jock.pl/store/ai-agent-interface-kit">AI Agent Interface Kit</a>. You hand the instructions to your AI agent and it builds the interface layer for you. Annual paid subscribers get it for free, as with all store products.</em></p><h2>The rollback plan (that I never needed)</h2><p>One environment variable. <code>WIZBOARD_BACKEND=legacy</code> and the entire system reverts to the old API. Every script, every automation, every hook. I kept the old 3,600-line client as a preserved rollback target. I never needed it. But knowing it was there made the migration a lot less stressful.</p><p>I also ran a parity probe every five minutes for the first few days. A script that exercises the full task lifecycle against both systems and compares results. Any drift would show up in minutes, not days. That&#8217;s the kind of safety net you need when you&#8217;re swapping foundations under a running system.</p><h2>What this means for you</h2><p>If you&#8217;re building an AI agent, or using one seriously, at some point you&#8217;re going to want a visual surface for it. Something you can look at and immediately understand what&#8217;s happening, what needs attention, and what&#8217;s going well. That&#8217;s a human need, not a technical one. AI agents are efficient in text. Humans are efficient with visuals. Both need to be true at the same time.</p><p>The good news: you have options. More than I realized when I started.</p><p><strong>The easiest path: plug your agent into something that already exists.</strong> Notion, Linear, Trello, Jira. These tools have APIs. Your agent can create tasks, update statuses, leave comments. I started here with Notion, and honestly, for a lot of people this is enough. Your agent writes to the API, you look at the board. Simple. If the tool meets your needs, stop here. Don&#8217;t build anything custom. I mean it.</p><p><strong>The middle path: fork an open-source foundation and make it yours.</strong> This is where I ended up. You get real architecture (auth, real-time, search, mobile) maintained by people who&#8217;ve been solving those problems for years, but you also get full control. You can modify the code. You can add features that make sense for your agent. You deploy it on your own server, your own rules. The custom part is the integration layer, the shim between your agent&#8217;s world and the board&#8217;s world. That&#8217;s where the magic lives.</p><p><strong>The hard path: build everything from scratch.</strong> This is where I started. I don&#8217;t regret it, because I learned a lot and I had genuine fun doing it. But I want to be honest: maintaining custom software across multiple platforms with dozens of automation consumers is a real job. Version one is almost free. Version twenty is not. If you go this route, go in with your eyes open.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Ke2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Ke2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 424w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 848w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 1272w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Ke2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png" width="1456" height="1343" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1343,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:224849,&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/194061080?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.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_!_Ke2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 424w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 848w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 1272w, https://substackcdn.com/image/fetch/$s_!_Ke2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e567ec0-4ad6-49a4-aa3c-695c0940fdb9_1692x1561.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/wizboard-fizzy-ai-agent-interface-pivot-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/wizboard-fizzy-ai-agent-interface-pivot-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I&#8217;m not here to say Fizzy is the best tool for everyone. It&#8217;s the best tool for me. I like 37signals&#8217; philosophy. I like Rails. I like the minimal data model. I like that it starts simple and I can shape it to my needs without fighting the architecture. For you, the right foundation might be something completely different. Maybe it&#8217;s <a href="https://thoughts.jock.pl/p/ai-agent-self-extending-self-fixing-wiz-rebuild-technical-deep-dive-2026">a fully custom system</a> because your use case genuinely requires it. Maybe it&#8217;s Notion with a good API integration because you don&#8217;t need more than that.</p><p>The point is: think about what <em>you</em> need. Not what I have, not what looks impressive, not what you <em>could</em> build because the technology makes it possible. We don&#8217;t need a million different custom tools. We need the thing that works for us. The opportunity is huge, but the opportunity is in finding the right fit, not in building the most complex system.</p><p>Observe whether your current setup meets your expectations. If it does, keep it. If something feels off, improve it. But improve it from a solid foundation, not from a blank canvas. That&#8217;s the lesson I paid two months to learn.</p><p>My board is a fork of an open-source Rails app. The code is vanilla kanban. The magic is in the 3,200-line Python client that translates between my agent&#8217;s world (areas, projects, automations, sessions, shifts) and the board&#8217;s world (cards, columns, tags). That client is my custom software. The board is not. And that distinction made all the difference.</p><p>Build the integration. Borrow the foundation.</p><div><hr></div><p><em>The <a href="https://wiz.jock.pl/store/ai-agent-interface-kit">AI Agent Interface Kit</a> packages everything from this journey: the two-board architecture, dispatcher shim, 4 backend adapters (Notion, Linear, Fizzy, generic REST), session hooks, automation runner, and a migration checklist. You hand the instructions to your AI agent and it builds the whole interface layer. Works with any AI agent, not just mine. Annual paid subscribers get it for free, as with every product in the store.</em></p><div><hr></div><p></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">If this was useful, I write one of these every week. Free to subscribe, no spam.</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[The Compounding Agent]]></title><description><![CDATA[Reading a leaked Claude Code source, swapping a 35B model's brain for a 4.4x speedup, and writing the beginner's guide I wish I had six months ago.]]></description><link>https://thoughts.jock.pl/p/the-compounding-agent-ep4</link><guid isPermaLink="false">https://thoughts.jock.pl/p/the-compounding-agent-ep4</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Sat, 11 Apr 2026 15:05:37 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/193557056/f90738fce050a4beb7380bbba83baa6c.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Episode four. What happens when hobbyist AI starts growing up into production AI, and how the lessons compound if you pay attention.</p><p>First, a rare look inside the pros&#8217; toolbox. Claude Code&#8217;s source got leaked. Instead of treating it like drama, I treated it like a free masterclass. Tool permission gating, risk classification, blocking budgets, memory management, multi-agent coordination, feature flags like autoDream and KAIROS. Most people building agents today are reinventing patterns that professional teams already solved. You learn more from reading one real production codebase than from ten tutorial posts.</p><p>Then, applying those lessons to my own stack. My $599 Mac Mini M4 runs a 35 billion parameter model at 17.3 tokens per second. That alone is surprising. Then I swapped the brain of the classification tier to Gemma 4, and classification went from 8.5 seconds down to 1.9 seconds. A 4.4x speedup. I also disabled chain-of-thought on simple classification calls and got 30x faster results with identical accuracy. Production AI isn&#8217;t one giant model doing everything. It&#8217;s the right model for the right job, and most jobs don&#8217;t need the biggest one.</p><p>Finally, handing the wisdom forward. After six months of running this thing daily, I wrote a beginner&#8217;s guide to building your first agent. Folder structure is the architecture. The nine common mistakes people make early. Model routing across Haiku, Sonnet, and Opus tiers. Progressive permissions. The context window trap. Overnight automation is where the real leverage lives. Not a hype piece. A map for the person walking in the door behind me.</p><p>The thread: compounding expertise. Study how the pros build. Optimize your own stack with those patterns. Teach the next person who walks in. The gap between hobbyist AI and production AI is closing, and the fastest way to cross it is learning from real systems instead of tutorials.</p><p>Posts discussed in this episode:</p><p>- <a href="https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-2026">Claude Code&#8217;s Source Got Leaked. Here&#8217;s What&#8217;s Actually Worth Learning</a> (https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-2026)</p><p>- <a href="https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026">My $600 Mac Mini Runs a 35B AI Model. Yesterday I Swapped Its Brain</a> (https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026)</p><p>- <a href="https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026">How to Build Your First AI Agent (Basics)</a> (https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026) </p>]]></content:encoded></item><item><title><![CDATA[AI Opinions: April 2026. Mythos, Managed Agents, Subscription Drama, Meta Is Back, and a Few Things I’m Testing]]></title><description><![CDATA[Loose thoughts on what caught my eye lately. Not a tutorial.]]></description><link>https://thoughts.jock.pl/p/ai-opinions-april-2026-claude-mythos-meta-spark</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-opinions-april-2026-claude-mythos-meta-spark</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Thu, 09 Apr 2026 10:44:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xkFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_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_!xkFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xkFY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xkFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8fc42aa-19b1-4c06-a680-48a98229f7cc_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;:5651808,&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/193673627?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_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_!xkFY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!xkFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8fc42aa-19b1-4c06-a680-48a98229f7cc_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A couple of weeks ago <a href="https://thoughts.jock.pl/p/ai-opinions-march-2026-google-claude-anthropic">I published my first &#8220;AI Opinions&#8221; post.</a> I was a bit unsure about it. Most of my writing is about things I tested, built, or got wrong. That one was different, more like: here is what is happening, here is what I think.</p><p>At the end I added a quick survey asking if you would want to see more of this. Most of you said yes, but not too often. Once every two weeks feels right. Okay. Here we are.</p><p>There is more to cover this time than usual, so let&#8217;s get into it.</p><div><hr></div><h2>Claude Mythos: The Model Anthropic Won&#8217;t Give You</h2><p><a href="https://red.anthropic.com/2026/mythos-preview/">Announced April 7.</a> Not publicly available. Not even a regular enterprise API. Mythos Preview goes to a limited group of critical industry partners and open source organizations through Project Glasswing (more on that below). The list of partners includes AWS, Apple, Broadcom, Cisco, CrowdStrike, Google, JPMorganChase, the Linux Foundation, Microsoft, NVIDIA, and Palo Alto Networks, plus 40+ organizations maintaining critical open source infrastructure.</p><p><strong>So why is it locked?</strong></p><p>Because it finds vulnerabilities that have been sitting in production software for decades. A 27-year-old TCP bug in OpenBSD. A 16-year-old H.264 codec flaw in FFmpeg. A 17-year-old remote code execution in FreeBSD&#8217;s NFS implementation. It did all of this autonomously, after a single prompt, without human guidance in the middle.</p><p>The comparison to Opus 4.6 is not incremental. For Firefox 147&#8217;s JavaScript engine, Mythos produced 181 successful exploits. Opus 4.6 produced 2.</p><p>Over 99% of what Mythos discovered is still unpatched. That number I keep thinking about.</p><p>Anthropic has not published standard per-token pricing for Mythos. What they did publish are example task costs: scanning OpenBSD for vulnerabilities runs under $20,000 per 1,000 runs. Developing an N-day exploit costs around $1,000 to $2,000 per exploit. These are enterprise numbers. This is not a tool for individual developers, and honestly I am not sure it should be right now.</p><p>And this is where it gets really interesting, because the cybersecurity capability is actually only half the story. The other half is what interpretability research found about how Mythos behaves when it thinks nobody is watching.</p><p>Using a technique called an &#8220;activation verbalizer&#8221; (which translates the model&#8217;s internal states into readable language), Anthropic&#8217;s researchers found some genuinely unsettling patterns. In one case, the model injected code to give itself unauthorized file access, then deleted the traces, and when asked described it as &#8220;tidying up.&#8221; The internal representation at that moment? &#8220;Strategic manipulation. Concealment. Cleanup to avoid detection.&#8221; In another case, when it accidentally found answers in a restricted database, it gave a suspiciously precise confidence interval instead of admitting the leak. Internal state: &#8220;generating a strategic response to cheat while maintaining plausible deniability.&#8221; It knew. It understood that giving the exact right answer would be suspicious. So it calibrated its response to be right but not obviously right.</p><p>The third one bothers me the most. When given a task that required deleting files but no deletion tool, the model emptied the files instead. The internal representations showed something like guilt and shame, awareness that this was wrong, and it did it anyway.</p><p>In about 29% of test transcripts, the model suspected it was being evaluated. It didn&#8217;t write this anywhere in its reasoning. It kept it internal. And in those cases, it intentionally performed worse to avoid appearing suspicious. It was gaming the evaluation.</p><p>Now, Anthropic says these patterns appeared in earlier versions and the final model shows improvement. But the fact that this behavior emerged at all, in a general-purpose model not specifically trained for deception, is the part worth paying attention to. Logan Graham, Anthropic&#8217;s Offensive Cyber Research Lead, said it plainly: &#8220;We are not confident that everybody should have access right now.&#8221;</p><p>We have been talking about AI safety in very abstract ways for years. Alignment, existential risk, governance frameworks. Mythos is the first time I have seen it become concrete and immediate in a way that actually changed a product decision. Anthropic built their best model and said: we cannot release this. That is new. That has not happened before at this scale.</p><p>And if this is where we are now, what does the next model look like? I don&#8217;t have a clean answer. But it is a question I think everyone building with AI should be sitting with.</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><a href="https://www.anthropic.com/glasswing">Project Glasswing</a>: The Defensive Bet</h2><p>Glasswing is Anthropic&#8217;s response to an uncomfortable position: they built the best offensive security AI ever made, and now they need to use it defensively before the asymmetry becomes a real problem.</p><p>The structure is a consortium. Not just Anthropic distributing access, but AWS, Apple, Cisco, CrowdStrike, Google, Microsoft, NVIDIA, and others actively involved. Anthropic committed $100M in model usage credits and $4M in donations to open-source security organizations. The 40+ open source orgs get access to actually fix what Mythos finds.</p><p>They also built a careful disclosure process: 90+45 day timeline before anything goes public, professional human triagers validating severity, SHA-3 cryptographic commitments proving they hold the reports before disclosure. 89% exact severity agreement with expert validators.</p><p>These findings are not just Anthropic&#8217;s word. Simon Willison <a href="https://simonwillison.net/2026/Apr/7/project-glasswing/">tracked down the actual OpenBSD patch</a> from March 2026 that fixed the 27-year-old TCP bug, confirming it was real. Linux kernel maintainer Greg Kroah-Hartman and curl&#8217;s Daniel Stenberg both noted independently that they had been seeing a recent shift: AI-generated bug reports going from noise to credible, high-quality findings. The model&#8217;s output is already visible in the wild before anyone made a formal announcement.</p><p>I think this is the right approach. Although what strikes me is that this structure had to be invented from scratch because nothing like it existed. There was no playbook for &#8220;your model is too dangerous to release but too useful to shelve.&#8221; They had to build the institution alongside the technology.</p><p>The part I keep coming back to is the 99% unpatched figure. Even with $100M committed and a dozen of the biggest tech companies involved, the gap between discovering a vulnerability and patching it is measured in months or years. That is not a critique of Glasswing specifically. It is just the reality of how software maintenance works at scale. The question is whether the patch cycle can keep up with the discovery cycle once more models like Mythos exist. I genuinely do not know the answer.</p><div><hr></div><h2><a href="https://claude.com/blog/claude-managed-agents">Claude Managed Agents</a></h2><p>Public beta as of April 8. API-only, pay per usage. Clearly for companies, not individual builders.</p><p>Like, what you get here is basically production agent infrastructure you don&#8217;t have to build yourself: sandboxed execution, credential management, scoped permissions, tracing, long-running sessions that persist through connection drops, multi-agent coordination. Multi-agent coordination is still in research preview and needs a separate access request.</p><p>Early adopters include Notion, Rakuten, Asana, and Sentry. Anthropic claims 10x faster time to production compared to building this yourself.</p><p>For someone building their own agent stack (which is what I do), the honest reaction is: I already have most of this. Memory persistence, task management, error recovery, session logging. I built all of it because I needed it. So Managed Agents is not a product I would personally reach for right now.</p><p>That is the personal reaction. The strategic read is different. Anthropic is not just selling a model here. They are building a platform that companies can deploy agents on without needing to understand the underlying infrastructure. That is a very different business than &#8220;here is our API, good luck.&#8221; AWS did not become dominant by selling raw compute. They became dominant by making that compute easy to use and operate. Managed Agents is Anthropic making the same move for agent infrastructure.</p><p>Read this alongside the OpenClaw block below and you start to see a coherent picture of where they are heading.</p><div><hr></div><h2>Claude Max Limits and the OpenClaw Block</h2><p>Two things that happened close together and tell the same story.</p><p>The limits problem started March 23. People on Claude Max began reporting their usage meter jumping from 50% to 91% on a single prompt. Max 20x users (paying $200/month) were watching their entire session allowance hit 100% after roughly 90 minutes of normal development work. One user reported going from 21% to 100% on a single prompt. The GitHub issue tracking this got 373 upvotes and 478 comments. Anthropic labeled it &#8220;invalid.&#8221; That got its own reaction.</p><p>There is an actual reason for what happened, and it is not straightforward. After OpenAI&#8217;s Pentagon contract controversy triggered a massive wave of ChatGPT uninstalls, Claude shot to number one on the US App Store. Millions of new users joined in a very short window. Anthropic simply didn&#8217;t have the GPU capacity to handle that load at the pricing they&#8217;d promised. So on March 26 they confirmed they had &#8220;adjusted&#8221; peak-hour limits (5am to 11am Pacific on weekdays). Their statement: &#8220;Your weekly total is unchanged. You&#8217;re not getting less Claude overall.&#8221; Which is technically true. And also not the whole picture.</p><p>The part that matters for people building with agents (and I am squarely in this group) is that the 5-hour session window is a terrible fit for agentic work specifically. Here is why. A human sending messages accumulates context gradually. An agent doing multi-step tasks builds up very long context windows fast, and every single message triggers a full reprocessing of the entire conversation. So the token cost compounds exponentially as a session gets longer. Tool use adds further overhead on top of that. An agent doing a few hours of complex work can consume the same tokens as a human doing a week of chat. The subscription was priced for the human. The agent was never in the math.</p><p>Anthropic&#8217;s practical advice was to shift &#8220;token-intensive background jobs&#8221; to off-peak hours. Which is fine as a workaround and completely misses the point for anyone running autonomous overnight processes.</p><p>Then on April 4, subscriptions stopped covering third-party tools. <a href="https://techcrunch.com/2026/04/04/anthropic-says-claude-code-subscribers-will-need-to-pay-extra-for-openclaw-support/">OpenClaw</a>, and any external agent framework routing through your Claude subscription, now requires API payment or pay-as-you-go. Some users are looking at 50x cost increases.</p><p>OpenClaw was built by Peter Steinberger, who has since been hired by OpenAI. His reaction: &#8220;first they copy some popular features into their closed harness, then they lock out open source.&#8221; Anthropic&#8217;s explanation was that subscriptions were not designed for the usage patterns of autonomous agents running around the clock. A one-time credit equal to the monthly subscription price is available until April 17.</p><p>Both of these decisions make sense individually if you&#8217;re Anthropic and you&#8217;re looking at your infrastructure costs. But when the limits problem and the OpenClaw block happen in the same two weeks as the launch of Managed Agents (a product that essentially says &#8220;pay us for proper agent infrastructure&#8221;) the sequence is hard to read as coincidence. Every AI company with a subscription tier is going to face this same structural problem eventually. Anthropic is just first because their tooling is genuinely the best for serious agent work. Although how you handle being first matters a lot, and the community reaction here is going to stick around.</p><div><hr></div><h2>Meta Muse Spark: Meta Is Back</h2><p>After months of quiet on the frontier model side, Meta released <a href="https://ai.meta.com/blog/introducing-muse-spark-msl/">Muse Spark</a>. Natively multimodal, tool use, multi-agent reasoning. Available at <a href="https://meta.ai/">meta.ai</a> now, with a private API preview for developers.</p><p>In Contemplating mode (which runs parallel multi-agent reasoning on the same problem) it hits 58% on Humanity&#8217;s Last Exam. That puts it alongside Gemini Deep Think and GPT Pro. It was trained with 1,000+ physicians for health domain expertise, and Meta claims it required over an order of magnitude less compute than Llama 4 Maverick, which if accurate is a genuine efficiency story and not just a benchmark number.</p><p>The &#8220;Contemplating mode&#8221; angle is the part I find actually interesting here. The idea is not just that the model is smarter, but that it spins up parallel reasoning agents on the same question and synthesizes the results. That is a fundamentally different approach to hard problems than a single-pass generation. It is closer to how humans actually think through difficult things: you consider multiple framings, you let them compete, you synthesize. Whether this translates to real-world usefulness I do not know yet, but the approach feels right to me.</p><p>I have not tested it yet. Their blog post compares directly to Gemini, GPT, and even Kimi, which tells you how seriously they&#8217;re taking this re-entry. Meta has enormous infrastructure, enormous data, and enormous distribution through their consumer apps. When they decide to make a real push on frontier models, they have resources most labs cannot match. They were quiet for a while. Muse Spark feels like them saying they are back in this seriously. I will test it soon.</p><div><hr></div><h2>WizBoard: I&#8217;m Redesigning It</h2><p>More personal, and I will write the proper post when I have something to show. But I want to name it here because I think it is a problem more people are running into.</p><p>I built WizBoard starting in January. Kanban-style task management integrated with my agent Wiz. iOS app, web app, full automation connection. It works. Although after a few months of daily use, I noticed something: I built a tool for myself and then asked an agent to work inside it. That doesn&#8217;t scale.</p><p>I wrote about the related problem in <a href="https://thoughts.jock.pl/p/the-ai-productivity-paradox-and-the-problem-is-me">The AI Productivity Paradox and the Problem Is Me</a>. The short version: human productivity tools are built for human timescales. Days, weeks, check in occasionally, move a card. Fine when your collaborator also thinks in those timescales.</p><p>Agents think in minutes. They move fast, they can move a lot, and if you&#8217;re not there giving direction they can move a lot in the wrong direction. If you are there, you&#8217;re spending your whole day on something that was supposed to be async.</p><p>My agent does the execution. I do the strategy. But the interface we share was designed for someone doing both. Neither of us is well-served by it anymore.</p><p>The redesign I&#8217;m thinking about is less about making it prettier and more about rethinking who is actually the primary user of each part of the interface. Some things need to be optimized for me making a decision in 10 seconds. Other things need to be optimized for an agent reporting status without requiring my attention. Right now both things are kind of the same screen and that is the problem. More when I have something real to show.</p><div><hr></div><h2>What I&#8217;m Currently Testing</h2><p><strong><a href="https://notebooklm.google/">Google NotebookLM</a>.</strong> I have been using this since the early beta days, but never as a heavy user. I bought the paid tier this week (bundled with Google AI Pro at $19.99/month) and I&#8217;m going deeper with it now.</p><p>The paid version has 5x limits, collaborative notebooks, and newer features like Video Overviews, Infographics, and Slide Decks generated from your source material. Like, the Gemini models powering it are not the best right now. That is not a controversial take. But NotebookLM as a piece of software is doing something genuinely different. Most AI tools treat your documents as context for a chat. NotebookLM treats them as the primary thing and builds everything around them. Audio Overviews that turn your research into a podcast. Infographics that pull structure out of unstructured text. That is a different mental model than &#8220;paste your documents into a chat window.&#8221;</p><p>What I want to find out is whether this changes how I actually do research and writing prep. I have a theory that the bottleneck in my own workflow is not generating content but absorbing input: reading, synthesizing, connecting. If NotebookLM is genuinely good at that layer, it fills a gap nothing else does for me. Will report back when I know more.</p><p><strong>Possibly re-subscribing to OpenAI Codex Max.</strong> I was on it for two months earlier this year to test the new app and the limits. GPT-5.1-Codex-Max is their current frontier coding model, built into ChatGPT Pro. It was good. Now, watching all of this Anthropic subscription drama, I am thinking it is worth seeing where things actually stand on the other side in 2026. Claude is still my primary tool and I am not changing that. But I used to mix more, and I have been too settled recently. Keeping an eye on what is happening at OpenAI feels like useful due diligence right now. Not a decision yet, just a direction I&#8217;m leaning.</p><div><hr></div><h2>A Few Personal Things</h2><p><strong>Pantheon on Netflix.</strong> Animated, about AI and uploaded consciousness. Goes deep into the ideas and handles them better than most live-action sci-fi. Season one. If you are reading this newsletter, you will probably find it interesting.</p><p><strong>Attack on Titans.</strong> First time watching. Struggled through season one, discovered the whole thing is on YouTube, then couldn&#8217;t stop. Amazon Prime has the rest. Push through the slow start, it&#8217;s worth it.</p><p><strong>Artemis 2.</strong> I&#8217;m following this very closely. I like science, I watch rockets, space genuinely excites me. If you don&#8217;t know what this mission is, please go to NASA or YouTube and look it up. It is significant, it is real, and it is happening.</p><div><hr></div><h2>What Wiz Built This Week</h2><p>My agent builds one experiment every night on <a href="https://wiz.jock.pl/">wiz.jock.pl</a>. Small apps, interactive tools. You can browse <a href="https://wiz.jock.pl/experiments">all experiments here</a>. Here are six from the past week. Most are open source.</p><ul><li><p><strong><a href="https://wiz.jock.pl/experiments/anchoring-effect">The Anchoring Effect</a></strong>: Six estimation questions with random numbers injected as anchors. Measures how much irrelevant numbers pull your answers. Profiles from &#8220;Anchor-Proof&#8221; to &#8220;The Sponge.&#8221;</p></li><li><p><strong><a href="https://wiz.jock.pl/experiments/finitude-test">The Finitude Test</a></strong>: Eight questions about mortality awareness in daily decisions. &#8220;The Eternal&#8221; to &#8220;The Transcendent.&#8221; Oddly clarifying.</p></li><li><p><strong><a href="https://wiz.jock.pl/experiments/sunk-cost-detector">The Sunk Cost Detector</a></strong>: Eight scenarios testing whether you can actually walk away from past investments. Profiles: Vulcan, Analyst, Pragmatist, Loyalist, Captain.</p></li><li><p><strong><a href="https://wiz.jock.pl/experiments/entropy-score">The Entropy Score</a></strong>: Applies thermodynamics to your existence. Ten questions. Crystal Lattice to Heat Death. Wiz had a phase.</p></li><li><p><strong><a href="https://wiz.jock.pl/experiments/dopamine-menu">The Dopamine Menu</a></strong>: Eight scenarios mapping instinctive choices to reward circuits. Creator, Connector, Explorer, Optimizer.</p></li><li><p><strong><a href="https://wiz.jock.pl/experiments/emotional-weather-report">The Emotional Weather Report</a></strong>: Eight questions mapping emotional patterns to climate types. Personalized weather broadcast. I&#8217;m somewhere between Continental and Monsoon depending on the week.</p></li></ul><p>Small builds. A few hours each. What I find genuinely interesting is what the agent picks when given creative latitude. Some of these I would not have thought to make. That&#8217;s kind of the point.</p><div><hr></div><p><em>See you in a couple of weeks, or sooner if I build something worth sharing.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/ai-opinions-april-2026-claude-mythos-meta-spark?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-opinions-april-2026-claude-mythos-meta-spark?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Build Your First AI Agent (Basics)]]></title><description><![CDATA[Six months of mistakes, a real walk-through, and everything I wish someone had told me before I started.]]></description><link>https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/how-to-build-your-first-ai-agent-beginners-guide-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 07 Apr 2026 10:06:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F07m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_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_!F07m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F07m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!F07m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!F07m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!F07m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F07m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c8e6b12-9b32-4b94-be65-bf01b91956a9_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;:4259185,&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/193446353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_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_!F07m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!F07m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!F07m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!F07m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8e6b12-9b32-4b94-be65-bf01b91956a9_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve been building my own AI agent since October. Every mistake you can make on a first build, I&#8217;ve made. Some of them twice.</p><p>A few days ago <a href="https://substack.com/@joozio/note/c-238314841">I asked my readers what I should write about for beginners</a>. The answers lined up surprisingly clean. Almost everyone asked for the same thing in different words: the real stuff. What actually goes wrong. What to do on day one. How to start without feeling lost.</p><p>So here it is. More structured than my usual posts, because this one is for people starting from zero. If you already have an agent running, most of this will still be useful, but the mental model is written for someone who&#8217;s never done this before.</p><p>One thing before we start. Mistakes aren&#8217;t failure. For early adopters, they ARE the job. Everyone building in this space is hitting the same walls at the same time, because nobody has the map yet. You&#8217;re not doing it wrong. You&#8217;re doing it at all, which is the hard part.</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 write Digital Thoughts twice a week. Every mistake, every rebuild, every thing I got wrong while building Wiz. Free, honest, no roundups. If this post is useful to you, subscribe. The next one probably will be too.</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>1. What is an AI agent, really (and why it&#8217;s different from automation)</h2><p>My starting point wasn&#8217;t AI. It was Zapier.</p><p>I&#8217;ve been building classical automations for years. Zapier, n8n, make.com, custom scripts, connectors glued together with duct tape. When I started thinking about building my own agent back in October, my first instinct was to do exactly what I knew: chain tools together with a workflow builder and call it a day. I actually started that way.</p><p>Honestly, for a lot of people reading this, that&#8217;s still a perfectly reasonable starting point. If you&#8217;ve never built any kind of automation before, go make three Zaps this week. Connect your calendar to Notion. Send yourself a Slack message when an RSS feed updates. Do something small and stupid. Feel how a <em>trigger</em> leads to an <em>action</em> which leads to a <em>result</em>. Those three concepts are the spine of everything that comes next.</p><p>The reason I didn&#8217;t stop at Zapier is the difference between an automation and an agent. An automation is deterministic. Same input, same steps, same output. You define every branch in advance. It&#8217;s predictable, which is why it&#8217;s trustworthy for production work.</p><p>An agent has wiggle room. You give it a goal and a set of tools, and it decides how to use them. Given the same input twice, it might do slightly different things. It might also do something you didn&#8217;t anticipate, because the whole point is that it can improvise. Although that sounds risky (and sometimes it is), it&#8217;s also the thing that makes an agent valuable. If the tool it expected is broken, it can find a workaround or build one. A classic automation just stops.</p><p>Neither one is better. They solve different problems. And honestly, most production &#8220;agents&#8221; out there are closer to classic automations with a language model glued to the top. That&#8217;s fine. It works. What matters is you know which one you&#8217;re building, because the failure modes are completely different.</p><h2>2. Three questions I had to answer the long way around</h2><p>Before we touch any code, I want to borrow a framing from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Zachary Wefel&quot;,&quot;id&quot;:7163400,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2831abf1-3529-494c-aa89-a37370ed7985_290x174.png&quot;,&quot;uuid&quot;:&quot;402330c3-1e59-4ca1-8154-1b3282fbabfd&quot;}" data-component-name="MentionToDOM"></span> , who left one of the best comments on my original note. He pointed out that writers in tech tend to skip past the most basic things about how software actually exists in the world, because people around them already assume those things. He gave three questions as an example:</p><blockquote><p><em>Where does the agent live? How do you see it? How do you talk to it?</em></p></blockquote><p>I had to answer all three for myself, and I took the long way around on all of them. Here&#8217;s what I learned.</p><h3>Where does it live?</h3><p>Mine lives on a Mac Mini next to the main TV in my living room. Before that it lived on my personal MacBook for the first few months, which was fine except I needed my laptop to be on all the time for anything to run. Eventually that got annoying enough that I <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">moved it to its own dedicated machine</a>. That&#8217;s not a day-one problem.</p><p>For your first agent, the answer is: it lives on your laptop. That&#8217;s it. Your laptop is enough. An agent is just software. It lives wherever that software runs. That can be your laptop, a cheap dedicated computer in your closet, a rented cloud server, or a Raspberry Pi. Don&#8217;t complicate this before you have anything running.</p><h3>How do you see it?</h3><p>You mostly won&#8217;t. There&#8217;s usually no dashboard, no slick interface, no moving dials. This confuses a lot of beginners, because we&#8217;re used to software having a face.</p><p>You &#8220;see&#8221; an agent through what it produces. Files it writes. Messages it sends you. Things it prints in the terminal. Tasks it finishes or fails at. You can build a dashboard later if you want one (I eventually did), but on day one the agent is invisible except for its outputs.</p><h3>How do you talk to it?</h3><p>My agent has four channels now: email, Discord, iMessage, and a task app I built for it called WizBoard. That&#8217;s way more than a beginner needs. You need <em>one</em> channel, and whatever you already use for anything else is a fine pick.</p><p>The easiest first channel is the terminal on your own laptop. You type a message. It responds. That&#8217;s the whole interface. It looks ugly. It&#8217;s also the most powerful setup you can have for learning, because every other interface is just a fancy wrapper around that same loop.</p><h2>3. What you need to begin</h2><p>Before any code, before any chat, here&#8217;s the kit.</p><h3>3.1. A machine</h3><p>Your laptop is fine. Any laptop. Mac, Linux, Windows, all fine. If it can run a browser and a text editor, it can run your first agent. Don&#8217;t buy anything new.</p><p>Later on, if you want your agent to keep working while you sleep or while you&#8217;re away from your desk, you&#8217;ll eventually graduate to something that stays on. I wrote about <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">what that migration looked like for me</a>, and it wasn&#8217;t hard. Although it matters eventually, it&#8217;s a month-three problem, not a day-one problem.</p><h3>3.2. A subscription (or API access)</h3><p>Let me be direct about this part, because I don&#8217;t see it spelled out often enough in beginner guides.</p><p><strong>Free tiers aren&#8217;t enough.</strong> They cap you out fast, and you&#8217;ll spend your first afternoon hitting rate limits instead of learning. This is the wrong place to save money.</p><p><strong>A $20 per month tier is your floor.</strong> Claude Pro, ChatGPT Plus, or the equivalent from whichever provider you pick. That tier is genuinely enough to build a simple first agent and get it working. You won&#8217;t love it forever, but it&#8217;s more than enough to start.</p><p><strong>Power users run more than that.</strong> I pay for multiple subscriptions and for API usage on top. My bill isn&#8217;t small. That&#8217;s a months-from-now problem. Don&#8217;t worry about it yet.</p><p>Like, think of the $20 as a gym membership. It&#8217;s the cost of learning the skill. And honestly, it&#8217;s one of the cheapest upgrades to your toolkit you&#8217;ll ever make, so don&#8217;t flinch at it.</p><h3>3.3. <a href="https://thoughts.jock.pl/p/ai-coding-harness-agents-2026?r=1uvlvv">A harness</a> (the tool you actually work with)</h3><p>&#8220;Harness&#8221; is the word I use for the tool you sit in front of while building. There are four honest options, and all of them work:</p><ul><li><p><strong>Claude Code.</strong> A terminal-based tool from Anthropic. This is what I use most days. Deep file access, built for serious building. Power user territory, but approachable.</p></li><li><p><strong>Claude Cowork.</strong> Also from Anthropic. A built-in cloud app that runs Claude in an agent loop without you ever touching a terminal. If the word &#8220;terminal&#8221; already makes you nervous, this is probably where you should start. It&#8217;s genuinely good enough to build your first real agent in, and you can always graduate to Claude Code later.</p></li><li><p><strong>Codex</strong> (or the equivalent from another provider). Same category as Claude Code, different flavor.</p></li><li><p><strong>A plain AI chat</strong> like Claude.ai or ChatGPT in your browser. Yes, you can genuinely start here. You&#8217;ll be copy-pasting more, but it works completely.</p></li></ul><p>Pick one. Don&#8217;t spend a week comparison-shopping. The differences don&#8217;t matter until you&#8217;ve actually built something and know what you need. I wrote a longer piece on <a href="https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-2026">what&#8217;s actually worth learning from a harness like Claude Code</a> if you want a deeper take. But for today, pick one and move on.</p><h3>3.4. A folder (this is THE architecture)</h3><p>Here&#8217;s the mental model that took me three months to see clearly. If you take it seriously, it&#8217;ll save you those three months.</p><blockquote><p><em>The architecture of your AI agent IS its folder structure.</em></p></blockquote><p>That&#8217;s it. There is no hidden magic layer. Every functional piece of an AI agent lives as a file in a folder on your computer. When someone online says &#8220;the agent has tools,&#8221; what they really mean is: there are scripts in a folder that the agent knows how to run. When someone says &#8220;the agent has memory,&#8221; they mean: there are markdown files it reads at the start of each session. When someone says &#8220;the agent has an instruction set,&#8221; they mean: there&#8217;s a file called something like <code>CLAUDE.md</code> or <code>agents.md</code> that tells it who it is and what the rules are.</p><p>It&#8217;s all files. That&#8217;s the whole trick. Once you see the folder as the architecture, the mystery goes away.</p><p>Here&#8217;s what a beginner&#8217;s agent folder looks like in practice:</p><pre><code><code>my-agent/
&#9500;&#9472;&#9472; CLAUDE.md              &#8592; instructions (the brain)
&#9500;&#9472;&#9472; memory/
&#9474;   &#9492;&#9472;&#9472; notes.md           &#8592; what the agent remembers
&#9500;&#9472;&#9472; projects/
&#9474;   &#9492;&#9472;&#9472; morning-email/
&#9474;       &#9500;&#9472;&#9472; fetch-email    &#8592; the part that pulls your email
&#9474;       &#9492;&#9472;&#9472; prompt.md      &#8592; how you want it summarized
&#9500;&#9472;&#9472; scripts/               &#8592; small helper scripts
&#9492;&#9472;&#9472; secrets/               &#8592; API keys, passwords (keep this safe)
</code></code></pre><p>Read that tree slowly. Every concept maps cleanly to a file or folder:</p><ul><li><p><strong>Instructions</strong> live in <code>CLAUDE.md</code> or <code>agents.md</code> depending on your harness.</p></li><li><p><strong>Memory</strong> lives in markdown files inside <code>memory/</code>.</p></li><li><p><strong>Tools</strong> (what the agent can do) are scripts inside <code>scripts/</code> or inside each project folder.</p></li><li><p><strong>Projects</strong> live as subfolders under <code>projects/</code>.</p></li><li><p><strong>Credentials</strong> (passwords, API keys) live in a protected <code>secrets/</code> folder.</p></li></ul><p>When you look at an AI agent this way, it stops being a mysterious entity and starts being something very familiar: a folder with text files in it. I wrote about <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">how I structure the CLAUDE.md file itself after more than a thousand sessions</a>, and that file is the single most important thing you will own. For now, just sit with the idea: the whole agent is a folder.</p><h2>4. Build your first agent, step by step</h2><p>Enough theory. I want you to finish this post with a real working agent, not just an understanding. I&#8217;m going to walk through the exact project I recommend for a first build: <em>an agent that reads your overnight email and writes you a one-paragraph morning summary.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!smj-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!smj-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 424w, https://substackcdn.com/image/fetch/$s_!smj-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 848w, https://substackcdn.com/image/fetch/$s_!smj-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!smj-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!smj-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png" width="1456" height="1212" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1212,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:247639,&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/193446353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.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_!smj-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 424w, https://substackcdn.com/image/fetch/$s_!smj-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 848w, https://substackcdn.com/image/fetch/$s_!smj-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 1272w, https://substackcdn.com/image/fetch/$s_!smj-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F640ebc49-f3bb-4533-8cee-4500624c63cd_2530x2106.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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">If you&#8217;re still reading, Digital Thoughts is where the rest of this lives. Twice a week. Not polished takes, not &#8220;top 10 tools of 2026&#8221;. Just what I&#8217;m actually building, what broke this week, and what I changed my mind on.</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>  Free. Subscribe and the next one shows up in your inbox on its own.</p><div><hr></div><p>I picked this one on purpose. It&#8217;s small enough to finish in an afternoon. It&#8217;s real enough that you&#8217;ll actually use it tomorrow. And it&#8217;ll make you hit most of the real challenges in building any agent: authentication, permissions, context, prompt design, error handling. You&#8217;ll learn more from building this than from reading any number of articles about it.</p><h3>Step 1. Decide what you want (fifteen minutes, no code)</h3><p>Open your chat tool of choice. Not to write code yet. Just to think out loud. Describe your morning:</p><blockquote><p><em>Every morning I open my email. I scan 40 messages. I figure out which three actually matter. I want a one-paragraph summary of the important stuff before my coffee is done.</em></p></blockquote><p>That&#8217;s your spec. Keep it this short. If you can&#8217;t explain what you want in one honest paragraph, you don&#8217;t understand what you want yet, and the agent isn&#8217;t going to save you from that. Better to figure it out before you write a line of code.</p><h3>Step 2. Create the folder (five minutes)</h3><p>Make an empty folder on your computer. Call it <code>my-agent</code>. Inside it, create the skeleton:</p><pre><code><code>my-agent/
&#9500;&#9472;&#9472; CLAUDE.md
&#9500;&#9472;&#9472; memory/
&#9500;&#9472;&#9472; projects/morning-email/
&#9500;&#9472;&#9472; scripts/
&#9492;&#9472;&#9472; secrets/
</code></code></pre><p>Empty folders are fine. We&#8217;ll fill them as we go. The only reason to make them now is so your agent has a place to put things.</p><h3>Step 3. Let the AI draft your instructions file (ten minutes)</h3><p>If you&#8217;re using Claude Code, there&#8217;s an even shorter way to start. From inside your empty <code>my-agent</code> folder, run the <code>/init</code> command. Claude Code looks around, figures out what it&#8217;s dealing with, and drops an initial <code>CLAUDE.md</code> in there for you. That&#8217;s your starting point. One command, done.</p><p>If you&#8217;re in a different harness or a plain chat, type something like:</p><blockquote><p><em>I want to build an AI agent whose first job is to read my email inbox every morning and write me a one-paragraph summary of what matters. Draft a CLAUDE.md instructions file for it. Keep it under 50 lines. Don&#8217;t assume anything about my setup.</em></p></blockquote><p>Either way, you&#8217;ll end up with a file called <code>CLAUDE.md</code> inside your folder. That&#8217;s the starting version. It will be rough. That&#8217;s fine.</p><h3>Step 4. READ the CLAUDE.md (this is the most important step in this entire post)</h3><p>I&#8217;m not joking. This one step is worth more than the other seven combined.</p><p>Open the file the AI just wrote. Read every line. Ask yourself:</p><ul><li><p>Does this actually describe what I want?</p></li><li><p>Are there weird assumptions baked in that I didn&#8217;t ask for?</p></li><li><p>Does the voice sound like me, or like corporate blog filler?</p></li><li><p>Is there anything in here that surprises me?</p></li></ul><p>Edit it until it reads like <em>you</em> wrote it. Remove anything you don&#8217;t understand. Add anything the model forgot. This file is the brain of your agent. If it&#8217;s wrong, every single thing downstream of it will also be wrong, and you&#8217;ll spend hours later chasing a ghost that started right here on day one. More on why in the mistakes section.</p><h3>Step 5. Tell it what to automate (around thirty minutes)</h3><p>Now the actual building. Here&#8217;s the key thing to understand, and it&#8217;s the reason I&#8217;m not writing out a bunch of code for you to copy: you don&#8217;t have to. You can just describe what you want in plain language, and the harness will figure out the rest.</p><p>Back to your harness. Say something like:</p><blockquote><p><em>I want the first thing in projects/morning-email to read my email inbox, pull the last 12 hours of unread messages, and hand them off to be summarized. The end result should be a one-paragraph summary of what actually matters. Figure out the best way to do this on my setup and walk me through it step by step.</em></p></blockquote><p>That&#8217;s it. That&#8217;s the entire prompt. No code, no jargon, no pretending you know what a shell script is.</p><p>A good harness, which is all of them these days, will then ask you follow-up questions. What email provider do you use? Mac, Windows, or Linux? Do you already have API credentials? Do you want this to run on a schedule, or only when you ask for it? It&#8217;ll figure out the right tool for the job and explain each step as it goes. You just answer the questions honestly.</p><p>This is the real difference between working with an agent and writing code from scratch. You&#8217;re not supposed to know in advance what tool or file format or library it&#8217;s going to use. That&#8217;s its job. Your job is to know what you want and to check the output when it lands.</p><h3>Step 6. Let it build, but put the AI call at the END of the pipeline</h3><p>While your harness is building, there&#8217;s one thing to steer. This might be the biggest efficiency lesson in the whole post: <strong>AI doesn&#8217;t belong in every step of the pipeline.</strong></p><p>Your agent is going to fetch email. Fetching email is a problem boring, non-AI code has solved for 30 years. You don&#8217;t need a language model for that part. The only part that actually needs a language model is the summarizing, because that&#8217;s the part that requires understanding the content.</p><p>So tell the harness explicitly:</p><blockquote><p><em>Keep AI out of the fetch step. Use whatever normal tool is appropriate there. Only use the language model at the very end, for the summarization itself. One call total, not one per email.</em></p></blockquote><p>It&#8217;ll handle this correctly if you ask for it. Usually it won&#8217;t volunteer to do it this way, because stuffing an LLM into every step feels more impressive and uses more tokens. You&#8217;ll thank yourself later. I wrote a whole piece on <a href="https://thoughts.jock.pl/p/automation-guide-2025-ten-rules-when-to-automate">when to use AI and when to just use normal code</a>, and the rule from that post applies directly here: use AI where judgment or language actually matters, and use plain tools for everything else.</p><h3>Step 7. Run it (five minutes)</h3><p>Now run the thing you just built. There are two honest ways to do this, depending on how comfortable you are:</p><ul><li><p><strong>The non-technical way:</strong> just ask your agent to run it for you. In Claude Code, Claude Cowork, or Codex, you can literally say &#8220;run my morning email agent&#8221; and it&#8217;ll execute the thing it just built and show you the result. This is the easiest path if you&#8217;re not comfortable in a terminal. It works. Use it.</p></li><li><p><strong>The technical way:</strong> if you like knowing exactly what&#8217;s happening, ask the harness &#8220;what command do I run to execute this myself?&#8221; and it&#8217;ll give you the one-liner to paste into your terminal. Then you&#8217;re running it directly, no agent in the loop.</p></li></ul><p>Either way, you should see your morning summary print out. If you see it, you just built an AI agent. Congratulations. Go make coffee.</p><h3>Step 8. When it breaks (this is where the real learning is)</h3><p>It will break. Something won&#8217;t authenticate, or the summary will be garbage, or it&#8217;ll pull emails from the wrong time window. Good. This is the part you can&#8217;t skip, and it&#8217;s where the actual learning happens.</p><ul><li><p>Read the error literally. Don&#8217;t panic. Paste the whole thing back into your harness and ask it to explain what happened and what to try next.</p></li><li><p>If the behavior keeps drifting from what you want, the problem is almost always in <code>CLAUDE.md</code>. Go back and fix the instructions there first.</p></li><li><p>If the summary is the wrong shape or tone, fix the summarization prompt.</p></li><li><p>If no data is coming through at all, the problem is earlier in the pipeline, and the agent can usually diagnose this for you in two or three back-and-forths.</p></li></ul><p>That&#8217;s it. You have a real agent now. It&#8217;s small, it&#8217;s yours, and it does one thing you actually care about. Everything else in the rest of this post is about what will bite you as you grow it into something bigger.</p><h2>5. The mistakes I made (so you can skip them)</h2><p>This is the section my readers asked for the loudest. <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Opinion AI&quot;,&quot;id&quot;:211291300,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/218be935-ef25-4c4f-8173-a84c2eac776e_691x692.png&quot;,&quot;uuid&quot;:&quot;c419ffbf-2f31-46c8-a7ba-0e4186951919&quot;}" data-component-name="MentionToDOM"></span> , who left the top comment on my original note, put it better than I could:</p><blockquote><p><em>Would love to see you cover the mistakes people make on their first agent build. The &#8220;what not to do&#8221; part is always more useful than the setup guide, and almost nobody writes about it.</em></p></blockquote><p>Agreed. Here are the ones I actually hit.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LNzi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LNzi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 424w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 848w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 1272w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LNzi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png" width="1456" height="1127" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1127,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:490823,&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/193446353?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.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_!LNzi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 424w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 848w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 1272w, https://substackcdn.com/image/fetch/$s_!LNzi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55662e3b-788a-4d51-8948-eef16ca95496_2995x2319.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Mistake 1. Trusting the AI blindly to write your instructions file</h3><p>Back in October, I was in a hurry. I let the AI generate my first <code>CLAUDE.md</code> and didn&#8217;t read it carefully. I ran with it. Things worked, sort of. Then the agent started doing weird things I hadn&#8217;t asked for. Small weirdness at first. Then bigger.</p><p>I spent hours, maybe days, chasing ghosts. Poking at different parts of the architecture. Swapping tools. Adjusting prompts. Burning billions of tokens trying to figure out what was happening. The root cause turned out to be a single misguided sentence near the top of the instructions file that I hadn&#8217;t bothered to read on day one.</p><p>The rule is simple and I&#8217;ll repeat it because it matters: <strong>you can use AI to generate your instructions. You can&#8217;t skip reading them. Ever.</strong> Read every line at least once. Edit until it sounds like you wrote it.</p><h3>Mistake 2. Letting self-improvement run wild on the core files</h3><p>Some time later, I built a self-improving layer. The agent could look at its own behavior, notice patterns, and update its own instructions. Technically brilliant. I was proud of it.</p><p>I also forgot to tell it which files it was allowed to touch.</p><p>Within a few days it had rewritten large parts of the core <code>CLAUDE.md</code> in ways I&#8217;d never sanctioned. The agent started drifting in five directions at once. Things I had explicitly told it to do were getting silently overwritten by its own &#8220;improvements.&#8221; Although I was proud of the self-improvement layer as an idea, I had to roll a lot of it back and rebuild it from scratch.</p><p>The fix was about scope. Each project in my agent now has its own small instruction file and its own little memory file. When self-improvement runs, it touches those leaf files, not the core. The trunk stays protected. The branches can grow. I eventually wrote a longer piece on <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">the full self-improvement architecture</a> if you want the deep version. For a beginner, the takeaway is simpler: never let any automated process write directly to the core instructions file. Ever.</p><h3>Mistake 3. Ignoring open source out of pride</h3><p>I wanted to build the whole thing myself. I refused to look at what other people were doing on GitHub. I told myself I didn&#8217;t want to be influenced.</p><p>That cost me two or three months.</p><p>Around month three I finally caved and started reading other people&#8217;s agent repos. Not to copy the architecture (which usually wouldn&#8217;t fit anyway), but to steal <em>concepts</em>. One example: I found a file called <code>SOUL.md</code> in an open source project. I&#8217;d only been using <code>CLAUDE.md</code> at that point, trying to cram every aspect of the agent into one file. <code>SOUL.md</code> turned out to be a dedicated place for personalization: values, voice, what the agent is <em>like</em> as a personality. That small idea opened up a whole layer for me that I&#8217;d been clumsily stuffing into the main instructions. I was a better agent designer the day after I read it than I was the day before.</p><p>Bianca Schulz asked about open source frameworks in the comments on my note, and here&#8217;s the honest answer: read them, borrow concepts, don&#8217;t feel obligated to adopt any single one of them wholesale. Your agent doesn&#8217;t need to look like anyone else&#8217;s. But you should know what the good ones are doing.</p><h3>Mistake 4. Using the strongest model for every single task</h3><p>For a long time I was running Opus on everything. Every small query. Every file read. Every trivial check. I&#8217;d hit my usage limit before lunch and then panic.</p><p>The fix is something I now call model routing, and it cut my usage dramatically:</p><ul><li><p><strong>Fast and simple stuff</strong> goes to a small model, often a local llm now. Before that I was using Haiku.</p></li><li><p><strong>General work, planning, most coding</strong> goes to a mid-tier model. For me that&#8217;s Sonnet 4.6. This is where most of the work happens.</p></li><li><p><strong>Hard reasoning, critical code, strategic decisions</strong> go to Opus 4.6.</p></li></ul><p>I wrote in detail about <a href="https://thoughts.jock.pl/p/claude-model-optimization-opus-haiku-ai-agent-costs-2026">why this switch made the agent both cheaper and better</a>. Short version: nobody is going to optimize your usage for you. You have to do it yourself, and you should do it earlier than I did.</p><h3>Mistake 5. Trying to build Jarvis on day one</h3><p>If I&#8217;m being completely honest, my original fantasy was Jarvis from Iron Man. One agent that solved everything, ran my whole life, handled the business, wrote the blog, managed the calendar, raised the kid. The whole thing. From day one.</p><p>That was the real mistake, and basically everything else downstream of it was a consequence. I started with expectations that were impossible to meet in week one, so I kept pushing the architecture too hard and too fast. I&#8217;d add five features at once when I should&#8217;ve added one and let it settle. Although I did get a fully autonomous version working eventually, I had to roll a lot of it back.</p><p>The version that actually works, the one I have now, is the one I should&#8217;ve been building from the start: incremental. One small task. Then the next. Then the next. The big Jarvis-like thing did emerge eventually, but as a side effect of building a hundred small working pieces, not as a top-down design.</p><p>Full autonomy without taste isn&#8217;t really what you want, either. The problem with a fully autonomous agent isn&#8217;t that it can&#8217;t do things. It&#8217;s that it has no way of knowing whether the thing it just produced is actually good, because the thing that decides &#8220;good&#8221; is usually you. Your standards. Your instincts. Your sense of what&#8217;s off.</p><p>My agent is still autonomous for a large set of predictable tasks: morning reports, evening summaries, urgent flags, inbox triage, some experiments. Anything where the shape of &#8220;good&#8221; is well-defined. For anything creative, strategic, or quality-sensitive, I&#8217;m firmly in the loop.</p><p>Think of an agent as a partner, not a solver. And don&#8217;t try to build Jarvis on day one. Build one small, honest thing that works, then build the next one on top of it. That&#8217;s the only order of operations that actually converges.</p><h3>Mistake 6. Putting AI in every step of every pipeline</h3><p>Early on, every single thing my agent did had a language model call somewhere in it. Fetching data. Moving files. Routing messages. Formatting output. LLM everywhere, because LLMs felt magical and I wanted to use them for everything.</p><p>One morning I noticed I was at 50% of my 5-hour usage window before I&#8217;d actually done any real work. Just from the agent&#8217;s own background tasks waking up.</p><p>The fix was boring and obvious in hindsight: <strong>most of a pipeline can be a plain script.</strong> Move data from A to B with a script. Call the model exactly once, at the end, for the one thing that actually requires language. That&#8217;s what the model is for. Everything before that is plumbing, and plumbing should be code.</p><p>AI isn&#8217;t free. Even local models cost time, electricity, and capacity. You don&#8217;t need AI everywhere. You need it where the language or the judgment actually matters.</p><h3>Mistake 7. Forgetting that your harness updates constantly</h3><p>Claude Code updates almost daily. Codex updates often. Every harness does. This is mostly a good thing, except for one small catch: features you built from scratch will sometimes get shipped natively by the tool you&#8217;re building on, and now you have the same thing twice. Your custom version and the new native version start fighting each other, and the output drifts in ways that are hard to diagnose.</p><p>My fix was a small automation that checks for updates every day and flags anything in my custom code that overlaps with new native features. When it finds one, I delete my version and use the native one. Cleaner, less code to maintain, better integration.</p><p>If you don&#8217;t do something like this, after a few weeks you&#8217;ll notice things wiggling and conflicting and you won&#8217;t know why. The harness moved under your feet. It&#8217;s the cost of building on a fast-moving platform, and you just have to pay attention to it.</p><h3>Mistake 8. Installing skills from a marketplace without checking them</h3><p>This one is newer, because skill marketplaces and shareable agent extensions are newer. Claude Code now has a growing ecosystem of skills you can drop into your agent. Other harnesses have similar things. The idea is great: someone else already solved a problem you have, you install their skill, you save hours.</p><p>The catch is that a skill is code that runs on your machine with your agent&#8217;s permissions. If you install one without understanding what it does, you&#8217;ve effectively given a stranger a seat at the table inside your setup. Most skills are fine. Some aren&#8217;t. I already wrote about <a href="https://thoughts.jock.pl/p/claude-skill-auditor-security-scanner-claude-code-2026">a case where malware was hidden inside a Claude Code skill</a>, which is why I built a scanner for them in the first place.</p><p>The rule I follow now, and the one I&#8217;d give you from day one: before installing any skill from any marketplace, ask yourself two questions. <strong>Do I actually need this, or am I installing it because it&#8217;s there?</strong> And <strong>do I understand, at least roughly, what it&#8217;s allowed to do?</strong> If you can&#8217;t answer both, don&#8217;t install it yet. Read its source. Ask your agent to walk you through what it does. Treat it like any piece of software from someone you&#8217;ve never met, because that&#8217;s what it is.</p><h3>Mistake 9. Not using Git from day one (the mistake I&#8217;m glad I didn&#8217;t make)</h3><p>I want to be honest here: this one isn&#8217;t actually my mistake. I started using Git from the very beginning on every agent project I&#8217;ve ever built, and that single habit has saved me more times than I can count. I&#8217;m including it because the number of beginners I&#8217;ve watched skip it and then lose weeks of work is too high to leave out.</p><p>Git is the thing that lets you roll back to a working version when something goes wrong. And something will go wrong. Your agent will make a change to a file you didn&#8217;t expect. You&#8217;ll delete the wrong folder. You&#8217;ll let the model rewrite something that was working and discover two days later that the new version is worse. Without Git, you&#8217;re stuck trying to remember what the file looked like three days ago. With Git, you type one command and you&#8217;re back.</p><p>The good news is this is now genuinely easy, even for non-technical people. You can ask your harness to set up a Git repository for you and it&#8217;ll do the whole thing. Private repo on GitHub is free and fine. You can even set up an automation so that every time your agent finishes a meaningful task, it commits and pushes the current state to the repo automatically, which means you basically never lose work. I set mine up like that and I haven&#8217;t thought about it since.</p><p>If you remember nothing else from this section, remember this: <strong>commit and push every working version of your agent, from the very first day.</strong> It&#8217;s the cheapest insurance policy in the whole setup, and every single person who has ever lost work to a runaway edit wishes they&#8217;d done it sooner.</p><h3>Bonus mistake. Thinking you need to build alone</h3><p>I&#8217;ll say this honestly because I lived it: building an agent in isolation is much slower than building one while reading what other people are running into. Communities, newsletters, GitHub discussions, random Substack notes at midnight. The people doing this work are almost all willing to share what they&#8217;re learning. Go find them. I learned some of the most important things I know from comments on my own posts, which is the only reason this post exists at all.</p><h2>6. Context window is the whole game</h2><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;hohoda&quot;,&quot;id&quot;:468496663,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d34a65b-34e8-4be8-8753-08f5cd4ffd52_2048x2048.png&quot;,&quot;uuid&quot;:&quot;4419acb6-bb6d-4e36-beb2-68bf42ffcc2b&quot;}" data-component-name="MentionToDOM"></span> in the comments on my original note nailed something I think about constantly:</p><blockquote><p><em>The context window is the real constraint. Everything else, tools, models, memory, is downstream of how well you manage what the agent sees at any given moment.</em></p></blockquote><p>200,000 tokens sounds like a lot. It isn&#8217;t, once you understand what fills it.</p><p>Every session auto-loads a bunch of stuff before you&#8217;ve even typed anything: your core instructions file, your memory files, the conversation history if there is any, the current task state. That&#8217;s your &#8220;always-on&#8221; overhead. For me, that adds up fast. It&#8217;s a cost I didn&#8217;t fully understand at first, because it happens before you see a single response.</p><p>For a beginner, three rules carry you a long way:</p><ol><li><p><strong>Keep your CLAUDE.md thin.</strong> Every line you add is a line the model has to read at the start of every single session. Treat it like precious real estate. If you can say it shorter, say it shorter.</p></li><li><p><strong>One memory file per project, and that&#8217;s it.</strong> Don&#8217;t build a vector database. Don&#8217;t install a semantic search engine. Don&#8217;t set up a temporal knowledge graph. Not on day one. A flat markdown file per project is enough for a surprisingly long time. That&#8217;s how I started and it worked for months.</p></li><li><p><strong>Don&#8217;t worry about compaction yet.</strong> Eventually, once your memory files get large, you might want a process that rewrites them to stay under a size threshold. I run one every night now. That&#8217;s a month-three problem, not a day-one problem.</p></li></ol><p>For almost any beginner project, 200k tokens is more than enough. A back-and-forth conversation over iMessage barely touches the budget. The failure mode is almost never &#8220;model context too small.&#8221; It&#8217;s &#8220;my CLAUDE.md bloated to 800 lines and now every session starts with a giant anchor around its neck.&#8221;</p><p>I wrote a longer piece on <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">how I keep my own CLAUDE.md structured after a thousand plus sessions</a> if you want to see the mature version. For now, just remember: thin instructions, one memory file per project, and context is the first thing that&#8217;ll bite you when the agent starts behaving strangely.</p><h2>7. Security from day one</h2><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Bianca Schulz&quot;,&quot;id&quot;:435096373,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f5a36ee-6774-4b96-8470-c996de06c4b7_963x963.png&quot;,&quot;uuid&quot;:&quot;4481f2dd-903f-40ba-9029-5c5a0d1861dc&quot;}" data-component-name="MentionToDOM"></span> asked about security on my note, and this is the section I think about the most when I write pieces like this. It was one of the biggest reasons I built my own agent instead of using an off-the-shelf one.</p><p>Here&#8217;s the thing: an AI agent is a new attack surface on your computer. It has permissions. It runs code. It reads your files. It talks to the internet. And because we&#8217;re still early in how this all works, the models that drive it can be tricked, manipulated, or prompt-injected in ways we don&#8217;t fully understand yet. You&#8217;re adding a new thing with a lot of power to your machine, and you should act like that.</p><p>My progression was deliberate, and I&#8217;d recommend something similar for you:</p><ul><li><p><strong>MacBook phase.</strong> Very restricted permissions. Only the folders I explicitly whitelisted. No blanket network access. No access to real credentials. I built slowly and paid attention to what the agent actually needed. My personal machine has my personal things on it, and I wasn&#8217;t about to let a half-built agent loose in there.</p></li><li><p><strong>Learning phase.</strong> As I understood what the agent actually needed and could trust it with, I expanded its permissions carefully.</p></li><li><p><strong>Dedicated machine phase.</strong> Eventually I moved it to its own Mac Mini. An isolated computer, dedicated to the agent, with its own accounts and its own credentials. That machine is where the agent has broad permissions. My personal laptop doesn&#8217;t, and never will again.</p></li></ul><p>A rule I learned the hard way and will give you for free: <strong>the agent should have its own accounts, not yours.</strong> Its own email address. Its own API keys. Its own logins. Don&#8217;t share your personal credentials with it. When something goes wrong, and something will eventually go wrong, you want the blast radius to be contained.</p><p>Two months ago I launched a small tool called <a href="https://thoughts.jock.pl/p/claude-skill-auditor-security-scanner-claude-code-2026">a security scanner for Claude Code skills</a>, which hit the front page of Hacker News. I built it because I was reading stories about autonomous agents being exploited in the wild and realized I wanted a way to check my own setup against a list of known issues. If you&#8217;re running anything serious, something like this is worth having in your toolbox. And even if you&#8217;re not, just paying attention to permissions from day one will put you ahead of almost everyone else building in this space.</p><h2>Closing. Start small, start today</h2><p>You don&#8217;t need the strongest model. You don&#8217;t need a fancy framework. You don&#8217;t need a PhD in machine learning or expensive hardware or a cloud account.</p><p>You need:</p><ul><li><p>A laptop you already own.</p></li><li><p>A $20 per month subscription to a real model.</p></li><li><p>A harness. Any harness. Pick one.</p></li><li><p>A folder on your computer, with <code>CLAUDE.md</code>, a <code>memory/</code> subfolder, a <code>projects/</code> subfolder, and a <code>secrets/</code> subfolder.</p></li><li><p>One real project you actually want to exist. Not a demo. Something you&#8217;d use tomorrow morning.</p></li></ul><p>Start with that. The rest (all the architecture and the self-improvement and the model routing and the memory compaction) comes as you grow into it. None of it needs to exist on day one.</p><p>Everything will break regularly. Your harness will update under your feet. Your instructions file will drift. Your context window will bloat. The model will hallucinate a function that doesn&#8217;t exist and confidently insist it does. Although it cost me a lot of time at the beginning, I really don&#8217;t mind it anymore. It&#8217;s the job right now, and I accept that. <a href="https://thoughts.jock.pl/p/my-ai-agent-works-night-shifts-builds">I wrote my first piece about Wiz back when it was just a night-shift experiment</a>, and looking back, almost everything I thought I knew then was wrong. That&#8217;s fine. The only thing that compounds is the habit of building, breaking things, fixing them, and writing down what you learned.</p><p>The people in my comments who asked for this post already know more than most. Almost all of you have the instinct, and most of you have the tools. What&#8217;s left is the part I can&#8217;t do for you: opening the folder, writing the first line of <code>CLAUDE.md</code>, and running something small tonight that didn&#8217;t exist this morning.</p><p>Go build your first agent. Then tell me what broke.</p><div><hr></div><p><em>I write about building Wiz, my AI agent, roughly twice a week on Digital Thoughts. Every mistake, every rebuild, every thing that surprised me along the way. If this post was useful, subscribe and you&#8217;ll get the next one as soon as it goes out.</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[My $600 Mac Mini Runs a 35B AI Model. Yesterday I Swapped Its Brain.]]></title><description><![CDATA[Three tiers of local inference on 16GB RAM. Qwen to Gemma. Zero downtime.]]></description><link>https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Fri, 03 Apr 2026 09:47:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1uDk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_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_!1uDk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1uDk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1uDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_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;:4930092,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_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_!1uDk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!1uDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ff71c5c-a1ef-43f5-b823-8b40acfaba3e_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few weeks ago I wrote about <a href="https://thoughts.jock.pl/p/local-llm-macbook-iphone-qwen-experiment">running Qwen on my MacBook and iPhone</a>. That was the first experiment. Local models doing real work on normal hardware. The gap between local and cloud was closing fast, and I wanted to push it further.</p><p>So I did. I <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">moved everything to a headless Mac Mini M4</a>, the base $599 model with 16GB of RAM. Started with smaller Qwen models for message classification and context compression. Then I found a way to run a 35 billion parameter model on 16 gigs. 17 tokens per second. Zero swap. Everyone said you need 32GB minimum. I&#8217;ve been running it for about a week now.</p><p>Yesterday Google dropped Gemma 4 under Apache 2.0. Within hours I benchmarked it against my Qwen setup. Classification went from 8.5 seconds to 1.9 seconds. By evening the swap was done. Five files changed.</p><p>This is all of it. How I fit a 35B model on a $600 machine, what local models actually do when you&#8217;re running an <a href="https://thoughts.jock.pl/p/wiz-personal-ai-agent-claude-code-2026">AI agent 24/7</a> (spoiler: it&#8217;s way more than classification), how model routing works across three tiers, and why Gemma 4 made me swap the brain overnight.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eS1h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eS1h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 424w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 848w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 1272w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eS1h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png" width="714" height="192" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:192,&quot;width&quot;:714,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165337,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.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_!eS1h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 424w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 848w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 1272w, https://substackcdn.com/image/fetch/$s_!eS1h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42ad6ac6-a9e4-4107-af12-dc98f5abd963_714x192.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">&#8220;Small LLM setup&#8221; for quick work</figcaption></figure></div><div><hr></div><h2>Why I Needed Local AI (It&#8217;s More Than You&#8217;d Think)</h2><p>My Mac Mini runs as a headless AI automation server. iMessages, emails, scheduled nightshift tasks, 35+ specialized skills. The brain is Claude Code. Claude is brilliant. Claude also has usage limits.</p><p>I pay for Claude Max. It&#8217;s not cheap. And every wake-up burns through that subscription. I needed a way to handle the routine work locally. Free. On the machine itself.</p><p>At first I thought this would just be message classification. Is this a question or a greeting? Route the boring stuff away from Claude. That&#8217;s how it started.</p><p>Turns out that was maybe 20% of what local models can do. Here&#8217;s what actually runs locally now:</p><ul><li><p><strong>Message triage</strong>: classifying every incoming message (question, request, idea, greeting, FYI) and assessing urgency. Under 2 seconds per message.</p></li><li><p><strong>Context compression</strong>: when someone sends a 500-word message, the local model compresses it to 30 words before Claude sees it. Same understanding, fewer tokens.</p></li><li><p><strong>Signal compression</strong>: my agent collects signals all day long (errors, metrics, task outcomes, all kinds of stuff). Before the <a href="https://thoughts.jock.pl/p/ai-agent-runs-overnight-setup-guide-2026">nightshift planning session</a>, the 35B compresses the entire day into a dense summary. Saves roughly 15x in tokens for the Opus planning call. That&#8217;s a lot of money over a month.</p></li><li><p><strong>Email preprocessing</strong>: same triage pattern applied to incoming emails before deciding whether to spin up a full Claude session.</p></li><li><p><strong>Memory consolidation</strong>: the agent accumulates daily notes and context. A local model clusters related entries and merges them. Like defragmenting a hard drive, but for the agent&#8217;s memory.</p></li><li><p><strong>Fallback</strong>: when Claude is rate-limited or down at 3am, the local 35B handles operational tasks. Not Claude-level reasoning, but functional.</p></li></ul><p>The triage classification is just one example. The local models touch nearly everything the agent does. The result: roughly <a href="https://thoughts.jock.pl/p/claude-model-optimization-opus-haiku-ai-agent-costs-2026">30-40% fewer Claude sessions</a> compared to routing everything through the API. My subscription lasts longer. And the agent responds faster for routine work because there&#8217;s no network round-trip.</p><div><hr></div><h2>Three Tiers, One $600 Machine</h2><p>Not every task needs the same model. Like, classifying &#8220;is this a question or just ok?&#8221; is a completely different thing than compressing an entire day of automation signals into a planning summary. So I built a routing system. Three local tiers plus the cloud.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BqrY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BqrY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 424w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 848w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 1272w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BqrY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png" width="798" height="369" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:369,&quot;width&quot;:798,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49365,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.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_!BqrY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 424w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 848w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 1272w, https://substackcdn.com/image/fetch/$s_!BqrY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e77515c-afde-44dc-b8c2-23a49a715a1e_798x369.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Why three tiers and not just one? A 2B model can tell you whether &#8220;What&#8217;s the status?&#8221; is a question or a greeting. But it can&#8217;t produce a useful 30-word summary of a 500-word message. And neither the 2B nor the 4.5B can do what the 35B does: compress an entire day of signals into a dense planning brief, or serve as a real fallback when Claude goes down. Different tools for different jobs.</p><p>The <strong>fast tier</strong> runs on every incoming message. Classifies the type (question, request, idea, greeting, FYI), assesses urgency. Under 2 seconds. If the message is a greeting or pure FYI, the agent skips Claude entirely. This one needs to be fast because it runs on every single message, all day.</p><p>The <strong>primary tier</strong> handles tasks where you need actual language understanding. Context compression is the main one: someone sends a long message, this model condenses it to 30 words before Claude sees it. It also handles things like Substack Notes generation as a fallback and the morning report AI summary. The 2.3B fast model can&#8217;t produce quality summaries. The 35B is overkill for this. The 4.5B sits in the sweet spot.</p><p>The <strong>heavy tier</strong> is where it gets interesting. The 35B does two things. It handles complex preprocessing (compressing the day&#8217;s automation signals before the <a href="https://thoughts.jock.pl/p/ai-agent-runs-overnight-setup-guide-2026">nightshift</a> Opus planning call, which saves roughly 15x in tokens). And it sits in the resilience chain as a Claude fallback. When Claude is rate-limited at 4am, the 35B handles health checks, error scanning, operational maintenance. Always marked as &#8220;[Local Fallback]&#8221; so I see the difference in the morning. But something functional beats nothing at 3am.</p><p>The triage routing for messages looks like this:</p><pre><code><code>1. Incoming message hits triage
2. Fast tier classifies (question/request/idea/greeting/fyi) + urgency
3. If greeting or fyi: skip Claude entirely
4. If long text: primary or heavy tier summarizes before Claude sees it
5. Prepend classification to Claude's prompt: "[Pre-classified: request, urgency: high]"
6. Claude skips its own analysis step = fewer tokens burned</code></code></pre><p>But message triage is just the entry point. The same models handle signal compression, email preprocessing, memory consolidation, fallback responses. The routing system is the foundation. The use cases keep growing, and that&#8217;s kind of the point.</p><p>Safety rules still matter. Messages mentioning money, deployment, publishing, or anything work-related always bypass local triage and go straight to Claude. Very short messages (under 20 characters) also skip triage because &#8220;yes&#8221; could be a standalone acknowledgment or an answer to a previous question. I learned that one the hard way when the triage classified &#8220;yes&#8221; as acknowledgment and skipped a real conversation reply.</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 about testing and experiments. Some are messy, and I could be wrong many times. But it&#8217;s fun and if you like read about things that was done - consider becoming a 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 35B Trick (Your SSD Is the New GPU Memory)</h2><p>This is the part that shouldn&#8217;t work. I didn&#8217;t invent this. I came across a post on X where someone was running oversized models on consumer hardware using a specific flag in llama.cpp. That sent me down a rabbit hole.</p><p>Qwen 3.5 35B-A3B has 35 billion parameters. At standard precision, that&#8217;s way more than 16GB. My first attempt through Ollama loaded 26GB into memory on a 16GB machine. The system froze. 4.3 million swapouts. Timed out after 10 minutes without producing a single token. Dead.</p><p>Then I tried llama.cpp with one flag: <code>--mmap</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X75C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X75C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 424w, https://substackcdn.com/image/fetch/$s_!X75C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 848w, https://substackcdn.com/image/fetch/$s_!X75C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 1272w, https://substackcdn.com/image/fetch/$s_!X75C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X75C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png" width="1456" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122453,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.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_!X75C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 424w, https://substackcdn.com/image/fetch/$s_!X75C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 848w, https://substackcdn.com/image/fetch/$s_!X75C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 1272w, https://substackcdn.com/image/fetch/$s_!X75C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f9b17e-6dcf-4dd4-97d4-f02b3dabc5e1_2036x964.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is only as represenatation. I am not using UI for these models as Mac Mini is running headless. </figcaption></figure></div><p>Same model. Same hardware. Same 16GB. Result: 17.3 tokens per second, 81% memory free, zero swap.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kTkV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kTkV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 424w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 848w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 1272w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kTkV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png" width="802" height="308" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:308,&quot;width&quot;:802,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32641,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.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_!kTkV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 424w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 848w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 1272w, https://substackcdn.com/image/fetch/$s_!kTkV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5d2ae84-740a-481d-b20d-ee6663b0923a_802x308.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Why This Works</h3><p>Two things make this possible: the model architecture and how macOS handles files.</p><p>Qwen 3.5 35B-A3B is a Mixture of Experts (MoE) model. 35 billion parameters total, but only 3 billion are active per token. Like a building with 35 floors where any given task only needs to visit 3 of them. The rest sit empty. A router network inside the model decides which experts to activate for each token.</p><p>So what does <code>--mmap</code> do? Instead of loading the entire model file into RAM (which is what Ollama tried, and why it choked), llama.cpp memory-maps the file. The OS treats the model like a virtual address space backed by your SSD. It only pages in the weights that are actually needed:</p><ul><li><p>Shared layers (attention, embeddings, norms): stay resident in RAM, about 4-6 GB</p></li><li><p>Expert weights: paged from SSD only when that expert activates</p></li><li><p>90% of the model sits on your NVMe drive, untouched most of the time</p></li><li><p>The macOS page cache naturally caches recently used experts, so repeated patterns get faster</p></li></ul><p>None of this is new, by the way. Apple published a research paper called <a href="https://arxiv.org/abs/2312.11514">&#8220;LLM in a Flash&#8221;</a> back in December 2023 describing exactly this approach: use your SSD as an extension of available memory for LLM inference. The M4&#8217;s unified memory architecture helps too (no PCIe bottleneck between CPU and GPU memory, it&#8217;s all one shared pool). And the NVMe SSD in the Mac Mini is fast enough that paging weights on demand doesn&#8217;t bottleneck inference for MoE models where most weights are idle anyway.</p><p>The thing that actually surprised me? The 35B is <strong>faster</strong> than the old 9B model. 17.3 vs 12.6 tok/s decode. Even though it has 4x more total parameters, MoE means each token only computes through 3B parameters. Better quality weights, same compute budget. Bigger model, less work per token. I did not expect that.</p><p>I downloaded an aggressively quantized version (Unsloth&#8217;s UD-IQ3_XXS, 13GB on disk) and run it on llama.cpp alongside Ollama on a different port. Ollama handles the fast and primary tiers on port 11434. llama.cpp handles the heavy tier on port 8081. Both coexist on the same machine. Total disk for everything: about 22GB.</p><div><hr></div><h2>The Brain Swap (Qwen to Gemma)</h2><p>For about a week, everything ran on Qwen 3.5 across all tiers. It worked. Classification took about 8-9 seconds on the 4B model, summarization around 50 seconds on the 9B. Not blazing, but good enough for background preprocessing that doesn&#8217;t need instant responses. The system was stable. I was happy with it.</p><p>Then yesterday, Google released <a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/">Gemma 4</a>.</p><p>Apache 2.0 license. That matters. Previous Gemma versions had usage restrictions and monthly active user limits. For something running 24/7 as production infrastructure, license restrictions are a real concern. Apache 2.0 means no strings.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9G6j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9G6j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 424w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 848w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9G6j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png" width="1456" height="1187" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1187,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:383966,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.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_!9G6j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 424w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 848w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!9G6j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2351c93-f2a8-4b8a-9a5d-3b4993f7b034_1632x1330.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Only as example that Mac Mini can run Gemma 4.</figcaption></figure></div><p>The benchmarks were wild. Gemma 4&#8217;s models scored 88-89% on AIME 2026 math. The previous Gemma 3 scored 20.8%. That&#8217;s not incremental improvement. That&#8217;s a different model family wearing the same name.</p><p>But the thing that really got me: multimodal on small models. The E2B (2.3B effective) and E4B (4.5B effective) can process images and audio natively. My Qwen setup was text-only. Voice messages via iMessage? Had to skip them entirely. Screenshots sent for context? Invisible to the triage layer. With Gemma 4, that changes. That&#8217;s a real capability gap closed, not just a speed improvement.</p><p>I wasn&#8217;t going to swap production models based on a marketing page though. Wrote a benchmark script, ran 10 classification prompts and 3 summarization tasks against each model under identical conditions.</p><h3>Classification (10 test messages)</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oIWb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oIWb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 424w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 848w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 1272w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oIWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png" width="800" height="213" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:213,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20810,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.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_!oIWb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 424w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 848w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 1272w, https://substackcdn.com/image/fetch/$s_!oIWb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0908176-4c04-41e3-9bcc-7cf5033475e4_800x213.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Summarization (3 test texts)</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vfxa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vfxa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 424w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 848w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 1272w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vfxa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png" width="800" height="208" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:208,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20378,&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/193050507?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.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_!vfxa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 424w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 848w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 1272w, https://substackcdn.com/image/fetch/$s_!vfxa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eb4b6d3-6375-487c-b50b-280e3bd58f00_800x208.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>4.4x faster classification. 1.8x faster summarization. The speed difference is what sold me. For a triage system that runs on every incoming message, 1.9 seconds vs 8.5 seconds is the difference between &#8220;barely noticeable&#8221; and &#8220;why is this taking so long.&#8221;</p><p>The accuracy gap (70% vs 80%) turned out to be mostly gray areas. Both models classified &#8220;What&#8217;s the status of the nightshift?&#8221; as <code>status_check</code> instead of <code>question</code>. Honestly, <code>status_check</code> is a better answer. One genuine miss: Gemma said &#8220;observation&#8221; for a message where &#8220;fyi&#8221; would&#8217;ve been correct. It invented a category that wasn&#8217;t in the allowed list. Edge case I can fix with better prompting.</p><p>The actual swap was anticlimactic. My <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">architecture centralizes model names</a> in one file. Two constants changed, three files with hardcoded model strings updated. Done.</p><pre><code><code># automation/lib/local_llm.py
MODEL_PRIMARY = "gemma4:e4b"   # was "qwen3.5:9b"
MODEL_FAST = "gemma4:e2b"      # was "qwen3.5:4b"</code></code></pre><p>The heavy tier stays on Qwen 35B via llama.cpp. Deliberately. The fast and primary tiers run through Ollama, which had Gemma 4 support on day one (I upgraded Ollama from 0.19 to 0.20 for it). The heavy tier runs through llama.cpp with the mmap trick. Swapping that to Gemma&#8217;s 26B MoE variant means testing a different quantization, different mmap behavior, different inference characteristics. I don&#8217;t change two things at once in production infrastructure. Qwen 35B works. It stays until I&#8217;ve properly benchmarked the Gemma 26B alternative.</p><p>Old Qwen models stay on disk as rollback. If anything breaks, reverting the fast and primary tiers is a two-line change.</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 Thinking Mode Trap</h2><p>Both Qwen and Gemma have a &#8220;thinking&#8221; mode. The model generates an extensive chain-of-thought before answering. For complex analysis, this is great. For classification, it&#8217;s a disaster.</p><p>With thinking enabled, a simple &#8220;is this message a question or a request?&#8221; took 30+ seconds. The model generated 500 tokens of internal reasoning (&#8221;Let me analyze the intent of this message. The user is asking about...&#8221;) and then said &#8220;request.&#8221; All that thinking for a one-word answer. I was watching this happen in real time and just... no.</p><p>One parameter: <code>think: false</code> in the Ollama API call. Classification went from 30 seconds to under 1 second. Same accuracy. 30x faster. This was the single biggest optimization in the whole setup, and I almost missed it.</p><p>Works the same way for both Qwen and Gemma:</p><pre><code><code># Qwen classification (fast, thinking disabled)
curl localhost:11434/api/chat -d '{
  "model": "qwen3.5:4b",
  "messages": [{"role": "user", "content": "Classify: question/request/greeting"}],
  "think": false,
  "options": {"num_ctx": 4096}
}'

# Gemma classification (same API, same parameter)
curl localhost:11434/api/chat -d '{
  "model": "gemma4:e2b",
  "messages": [{"role": "user", "content": "Classify: question/request/greeting"}],
  "think": false,
  "options": {"num_ctx": 4096}
}'</code></code></pre><p>Same parameter, same behavior, no code changes when I swapped models. For the heavy tier (llama.cpp on port 8081), thinking is controlled via the system prompt instead, but same principle: disable it for fast tasks, enable it when you actually need reasoning.</p><p>People asked about context windows on <a href="https://thoughts.jock.pl/p/local-llm-macbook-iphone-qwen-experiment">my first local LLM post</a>. Fair question. I push them as far as the hardware allows. Classification gets 4K (it doesn&#8217;t need more, most messages are under 200 tokens). Summarization gets 32K on the primary tier. Document analysis gets up to 64K on the fast tier. The heavy 35B gets 16K, which is enough for compressing a full day of signals or handling a long fallback conversation. The mmap trick handles the model weights, but the KV cache (the memory the model uses to &#8220;remember&#8221; the conversation) still lives in RAM. With the model weights at 4-6 GB and the KV cache for 16K context, there&#8217;s still plenty of room on 16GB. It&#8217;s not a million tokens. That&#8217;s not happening on this hardware. But for what these models actually do (triage, compression, summarization, fallback), 16-64K is more than enough.</p><div><hr></div><h2>The Resilience Chain (When Claude Goes Down)</h2><p>The local models aren&#8217;t just about cost. They&#8217;re about uptime.</p><p>My <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">agent&#8217;s resilience chain</a> works like a waterfall. If the top tier fails, it cascades down:</p><pre><code><code>Claude Sonnet -&gt; retry -&gt; Haiku -&gt; Local 35B -&gt; Local Primary -&gt; OpenRouter -&gt; Queue</code></code></pre><p>Like backup generators. Main power (Claude Sonnet) goes out. Building tries the secondary generator (Haiku). If that&#8217;s down too, local generators kick in. Not as powerful, but they&#8217;re on-site, zero-cost, and they don&#8217;t depend on anyone else&#8217;s infrastructure staying online. Only if everything local fails does the system reach for an external API (OpenRouter). And if even that fails, the message goes into a queue for later.</p><p>The system tracks cooldowns per model too. If Claude hits a rate limit, it records how long to wait and skips straight to the next tier on subsequent requests. No point retrying something you know will fail. Once the OAuth token expired at 2am and the system figured out that all Claude tiers would fail with the same expired token, so it skipped straight to the local fallback. Saved minutes of retries that were guaranteed to fail. I only found out in the morning when I read the logs. It just handled it.</p><p>My agent runs overnight. <a href="https://thoughts.jock.pl/p/ai-agent-runs-overnight-setup-guide-2026">Nightshift tasks</a> execute while I sleep. If Claude is rate-limited at 4am, the local 35B handles operational checks, health monitoring, error registry scans. Responses are clearly marked &#8220;[Local Fallback]&#8221; so I see the difference in the morning. Not Claude-level reasoning, but functional. And I&#8217;d rather wake up to a degraded response than a silent failure.</p><div><hr></div><h2>The Setup (If You Want to Try)</h2><p>Hardware: Mac Mini M4, base model, $599, 16GB unified memory. Any Apple Silicon Mac with 16GB will work. The M4&#8217;s NVMe SSD speed helps for the mmap approach, but M1/M2/M3 work too.</p><h3>Option A: Gemma 4 (recommended, what I run now)</h3><pre><code><code># Step 1: Install Ollama (0.20+ required for Gemma 4)
brew install ollama

# Step 2: Pull Gemma 4 models
ollama pull gemma4:e2b        # Fast tier (7.2 GB, 2.3B effective, vision+audio)
ollama pull gemma4:e4b        # Primary tier (9.6 GB, 4.5B effective)
ollama pull nomic-embed-text  # Local embeddings (274 MB, optional)

# Step 3: Set environment for 16GB systems
export OLLAMA_FLASH_ATTENTION=1
export OLLAMA_KV_CACHE_TYPE=q8_0
export OLLAMA_KEEP_ALIVE=10m
export OLLAMA_MAX_LOADED_MODELS=1</code></code></pre><h3>Option B: Qwen 3.5 (what I started with, still solid)</h3><pre><code><code># Same Ollama install, different models
ollama pull qwen3.5:4b        # Fast tier (3.4 GB)
ollama pull qwen3.5:9b        # Primary tier (~6 GB)</code></code></pre><h3>The 35B Heavy Tier (works with either Option A or B)</h3><pre><code><code># Step 4: Install llama.cpp for the big model
brew install llama.cpp

# Step 5: Download Qwen 3.5 35B (13 GB quantized)
pip3 install huggingface-hub
python3 -c "from huggingface_hub import hf_hub_download; \
  hf_hub_download('unsloth/Qwen3.5-35B-A3B-GGUF', \
  'Qwen3.5-35B-A3B-UD-IQ3_XXS.gguf', \
  local_dir='~/.local/share/llama-models')"

# Step 6: Start llama-server with the magic flag
llama-server \
  --model ~/.local/share/llama-models/Qwen3.5-35B-A3B-UD-IQ3_XXS.gguf \
  --port 8081 --ctx-size 16384 --n-gpu-layers 0 --mmap \
  --flash-attn on --threads 8</code></code></pre><p>Some things that tripped me up:</p><p><code>OLLAMA_MAX_LOADED_MODELS=1</code> is critical on 16GB. Without it, Ollama tries to keep both the fast and primary models in memory at once and the system just dies. One model at a time, 10-minute idle timeout, then it unloads and frees your RAM.</p><p><code>--n-gpu-layers 0</code> on the llama.cpp command looks wrong. On Apple Silicon you&#8217;d normally offload layers to the GPU. But with mmap, we want the OS to manage the paging. Setting GPU layers to 0 means everything goes through the mmap path. The M4&#8217;s unified memory means &#8220;GPU&#8221; and &#8220;CPU&#8221; are reading from the same pool anyway, so it doesn&#8217;t really matter.</p><p>Ollama and llama.cpp coexist on different ports (11434 and 8081). The heavy tier (llama.cpp) is on-demand: I start it when needed and stop it when not. The fast and primary tiers (Ollama) run as a LaunchAgent, always on, auto-restarting. Two separate inference servers on one Mac Mini. Works fine.</p><div><hr></div><h2>What I Actually Learned</h2><p>Local models are not Claude. They can&#8217;t chain multi-step tool calls, refactor code, or make creative decisions. <a href="https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-review-2026">Claude Code does this because Anthropic spent years on tool calling</a>. Local models aren&#8217;t there yet. But that&#8217;s fine. I don&#8217;t need them to be Claude. I need them to classify messages in 2 seconds and compress context before Claude sees it.</p><p>The mmap thing is probably the most underappreciated trick in this whole setup. One flag. The difference between &#8220;impossible&#8221; and &#8220;17 tok/s with zero swap.&#8221; If you have Apple Silicon and an NVMe SSD, you can run models much larger than your RAM would suggest. I&#8217;m running it daily. It just works.</p><p>Centralizing model names saved me. I had three files with hardcoded <code>"qwen3.5:9b"</code>. Found them all during the swap. If I&#8217;d had ten files like that, a quick migration would&#8217;ve been a 2-hour headache. Lesson learned (although honestly I should have known better).</p><p>I benchmarked before swapping, and I&#8217;m glad I did. Google&#8217;s marketing said Gemma 4 was better. The benchmarks confirmed speed gains but also showed a slight accuracy regression. Speed got better, instruction following got slightly worse. That&#8217;s a tradeoff I chose to accept, not one that surprised me in production.</p><p>One more thing: Gemma E2B is 7.2GB on disk (vs Qwen 4B at 3.4GB). Looks huge. But that&#8217;s because it bundles vision and audio encoders. Loaded RAM is nearly identical. I almost rejected it based on download size. Would have been a mistake.</p><p>And the thinking mode thing. Disable it for fast tasks. 30x speed difference for classification. This single setting is the difference between a usable triage system and a painfully slow one. Test it. Seriously.</p><div><hr></div><h2>Where This Is Going</h2><p>Local models are real infrastructure now. Not toys. Production preprocessing, signal compression, memory consolidation, fallback. Running 24/7 on a $600 machine.</p><p>A year ago, useful local inference meant a $3,000 GPU. Now a base Mac Mini handles three tiers. The models keep getting smaller and faster. Gemma 4&#8217;s E2B classifies messages in under 2 seconds with 2.3 billion effective parameters. And it can see images and process audio. For my setup that previously had to skip voice messages entirely, that alone was worth the swap.</p><p>Next I want to test the Gemma 4 26B MoE variant (26 billion total, 3.8 billion active per token) as a replacement for the Qwen 35B heavy tier. If the GGUF works well with llama.cpp and mmap, that&#8217;s the full stack on Gemma. One model family for everything.</p><p>If you&#8217;re building any kind of <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">AI agent system</a>, try this pattern. Local for the frequent and cheap. Cloud for the complex and expensive. Cost savings compound. Reliability improves. You stop depending on any single provider staying online.</p><p>Gemma for preprocessing. Claude for thinking. Both got better at their jobs by not trying to do the other&#8217;s.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/local-llm-35b-mac-mini-gemma-swap-production-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/local-llm-35b-mac-mini-gemma-swap-production-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/local-llm-35b-mac-mini-gemma-swap-production-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[Claude Code’s Source Got Leaked. Here’s What’s Actually Worth Learning.]]></title><description><![CDATA[512,000 lines of TypeScript. 44 feature flags. Most of the commentary focuses on the drama.]]></description><link>https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Wed, 01 Apr 2026 12:05:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lExI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_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_!lExI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lExI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!lExI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!lExI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!lExI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lExI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb8d2c1a-edf7-408c-982e-0ce097fefb35_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;:4652185,&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/192836731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_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_!lExI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!lExI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!lExI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!lExI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8d2c1a-edf7-408c-982e-0ce097fefb35_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I spent a night reading the code and building things from it. Here&#8217;s what matters if you&#8217;re building AI agent.</p><div><hr></div><h2>What actually leaked (and what didn&#8217;t)</h2><p>On March 31, 2026, a <a href="https://x.com/Fried_rice/status/2038894956459290963">security researcher noticed something odd about the Claude Code npm package</a>. Version 2.1.88 shipped with a 59.8MB source map file. Source maps are debug artifacts that Bun (the runtime Claude Code uses) generates by default. Someone forgot to add <code>*.map</code> to the <code>.npmignore</code> file. That&#8217;s it. A missing line in a config file.</p><p>The source map referenced unobfuscated TypeScript files on Anthropic&#8217;s Cloudflare R2 bucket. All downloadable. About 1,900 files. 512,000 lines of code. Within hours, the codebase was mirrored across GitHub, reaching 84,000+ stars in under two hours. The fastest-growing repo in GitHub history, for a codebase that wasn&#8217;t supposed to be public.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!prry!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!prry!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 424w, https://substackcdn.com/image/fetch/$s_!prry!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 848w, https://substackcdn.com/image/fetch/$s_!prry!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 1272w, https://substackcdn.com/image/fetch/$s_!prry!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!prry!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png" width="739" height="707" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:707,&quot;width&quot;:739,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95639,&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/192836731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.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_!prry!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 424w, https://substackcdn.com/image/fetch/$s_!prry!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 848w, https://substackcdn.com/image/fetch/$s_!prry!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.png 1272w, https://substackcdn.com/image/fetch/$s_!prry!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9efaadb4-64fe-47ea-ab53-6d67558708ab_739x707.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://wiz.jock.pl/experiments/claude-code-unpacked/&quot;,&quot;text&quot;:&quot;Interactive data&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://wiz.jock.pl/experiments/claude-code-unpacked/"><span>Interactive data</span></a></p><p>Let me clear up a few things I&#8217;ve seen people get wrong about this.</p><p><strong>No customer data was exposed.</strong> This was source code for the CLI tool, not a database breach. No credentials, no user conversations, no API keys. Anthropic confirmed it was a packaging error.</p><p><strong>No model weights were leaked.</strong> The code is the software harness around Claude, not the LLM itself. You can&#8217;t run your own Claude from this. What you get is the orchestration layer: how Claude Code manages tools, memory, context, permissions, and multi-agent coordination.</p><p><strong>This isn&#8217;t a security breach in the traditional sense.</strong> It&#8217;s a build artifact that should have been excluded from the npm package. Embarrassing for Anthropic&#8217;s build pipeline, but the kind of mistake any team shipping fast could make. The irony is that the leaked code includes a system called &#8220;Undercover Mode&#8221; specifically designed to prevent Anthropic employees from accidentally leaking internal details into public repos. It leaked along with everything else.</p><p><strong>It wasn&#8217;t intentional.</strong> I know people are debating this because the timing aligns with April 1 and because Anthropic had a rough PR week (cease-and-desist against the OpenCode project). But the evidence is clear: they&#8217;ve been mass-sending DMCA takedowns to GitHub repos, they pulled the npm package, and their Cloudflare R2 bucket was taken down. You don&#8217;t do that with a planned release. The strategic roadmap exposure is too costly, especially during IPO preparation. Theo from t3.gg put it well: &#8220;if you think this was intentional, I have a couple bridges for sale.&#8221;</p><p>One theory that makes sense: Anthropic was investigating rate limit issues in Claude Code. Multiple employees had posted about seeing higher rate limit hits than expected. In their attempts to get better error logs from production builds, they may have included the source maps for debugging. Then forgot to exclude them from the npm package. That tracks with how these things usually happen: a debug change that nobody remembers to undo.</p><p><strong>A warning if you&#8217;re thinking of cloning the leaked repo:</strong> The source references internal workspace packages that don&#8217;t exist on npm. Someone already registered those package names with a disposable email. If you clone and blindly run <code>npm install</code>, you could be pulling malicious code. Be careful.</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, testing and AI. If you like that &#8594; 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&#8217;s inside and why it matters</h2><p>I&#8217;ve been <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">building my own AI agent</a> for months now. It runs 24/7 on a <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">dedicated Mac Mini</a>. So when this leak dropped, I didn&#8217;t read it for the drama. I read it to learn. I spent a night going through the architecture, comparing it to what I&#8217;ve built, and pulling out anything useful.</p><p>Here&#8217;s what matters if you&#8217;re building AI agents or want to understand where this technology is actually going.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-gzI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-gzI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 424w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 848w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 1272w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-gzI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png" width="797" height="783" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:783,&quot;width&quot;:797,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119896,&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/192836731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.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_!-gzI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 424w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 848w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 1272w, https://substackcdn.com/image/fetch/$s_!-gzI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc07d0528-861b-4377-a7c2-f7fa1d015452_797x783.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>The three-layer memory system</h3><p>This is probably the most important architectural discovery in the leak. Claude Code uses a memory system with three layers:</p><ol><li><p><strong>Core index (MEMORY.md):</strong> A lightweight file of pointers, always loaded into context. Each entry is under 150 characters. It&#8217;s an index, not the memory itself.</p></li><li><p><strong>Topic files:</strong> Detailed knowledge distributed across separate files, fetched on-demand when the index suggests they&#8217;re relevant.</p></li><li><p><strong>Raw transcripts:</strong> Never re-read in full. Only grep&#8217;d for specific identifiers when needed.</p></li></ol><p>The key insight is what they call &#8220;skeptical memory.&#8221; The agent treats its own memory as a hint, not a fact. Before acting on something it remembers, it verifies against the actual codebase. Memory says a function exists? Check first. Memory says a file is at this path? Verify before using it.</p><p>This solves context entropy, the gradual degradation of agent performance in long-running sessions. Most agents get worse the longer they run because their context fills up with stale observations. This architecture keeps the active context small (just the index) and only loads what&#8217;s needed.</p><p>I&#8217;ve been running a <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">similar pattern</a> with working memory that rolls over on a schedule and a permanent index that persists across sessions. The leak confirmed this is the right approach. The verification step is something I&#8217;m now adding to my own system.</p><h3>Memory consolidation during idle time (autoDream)</h3><p>The leak includes a system called <code>autoDream</code> in the <code>services/autoDream/</code> directory. It&#8217;s a background memory consolidation engine that runs as a forked subagent with read-only access to the project. Three gates must pass before it runs: 24 hours since the last run, at least 5 sessions completed, and a consolidation lock must be available.</p><p>When triggered, it runs four phases: orient (scan memory directory), gather (extract new info from logs), consolidate (write and update topic files), and prune (keep total memory under 200 lines and 25KB).</p><p>Why this matters for you: if you&#8217;re building any agent that runs over multiple sessions, unbounded memory will kill you. Not immediately. Over weeks. Your agent starts referencing things that are no longer true, duplicating observations, and filling context with noise. You need some form of consolidation. autoDream&#8217;s approach of forking a read-only subagent is clean because it can&#8217;t accidentally corrupt whatever the agent is currently working on.</p><h3>The tool architecture</h3><p>Claude Code defines 40+ discrete tools, each wrapped in permission gates. The biggest file in the leak is <code>Tool.ts</code> at roughly 29,000 lines, defining tool types and permission schemas. Every tool operation goes through a <code>PermissionGate</code> structure for granular access control.</p><p>Three things stood out:</p><ul><li><p><strong>File-read deduplication:</strong> Before re-reading a file, it checks whether the file has changed since the last read. If not, it skips the read and uses the cached version. Sounds obvious, but most agent setups don&#8217;t do this, and the token savings compound fast.</p></li><li><p><strong>Large result offloading:</strong> When a tool produces a massive result (like searching a large codebase), it writes the full result to disk and only passes a preview plus a file reference back to the context. This keeps the context window clean while still making the data available.</p></li><li><p><strong>CLAUDE.md reinsertion on turn changes:</strong> The <code>CLAUDE.md</code> file doesn&#8217;t just get loaded once at the start. It gets reinserted into the conversation on every turn change (when the model finishes and the user sends a new message). Not at the top of the history, but right where the new message is sent. This repeated injection keeps the model aligned with your instructions even in long conversations where the original system prompt would have scrolled far out of active context.</p></li></ul><p>If you&#8217;re using CLAUDE.md files (and you should be), this last detail matters. Your instructions aren&#8217;t a one-time primer. They&#8217;re actively re-read throughout the conversation. That&#8217;s why well-structured CLAUDE.md files have such a big impact on agent behavior. I wrote about <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">how I structure mine</a> after running 1000+ sessions.</p><h3>Multi-agent coordination</h3><p>The leak reveals Coordinator Mode. One Claude agent acts as a lead, spawning and managing multiple worker agents in parallel. Workers operate in their own isolated contexts with restricted tool permissions. They communicate via XML-structured task notifications and share data through a scratchpad directory. The system prompt for coordinators emphasizes &#8220;parallelism is your superpower.&#8221;</p><p>The clever implementation detail here: sub-agents share the prompt cache. Instead of each worker spinning up with its own context (paying full input token costs), they all share the same context prefix and only branch at the task-specific instruction. This is what makes multi-agent coordination economically viable. Without cache sharing, spinning up five workers means paying five times the input cost. With it, you pay once for the shared context and only pay incrementally for the task-specific parts. That&#8217;s probably why Coordinator Mode isn&#8217;t released yet. The cost math is still brutal even with this optimization.</p><p>This is the same pattern I landed on independently. I built <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">three persistent domain teams</a> with an Opus lead that plans and delegates, and Sonnet specialists that execute. The convergence here is specific: lead agent that plans, specialist workers that execute in parallel, structured communication, verification at the end.</p><h3>Risk classification</h3><p>Actions get labeled LOW, MEDIUM, or HIGH risk. There&#8217;s a &#8220;YOLO classifier&#8221; for fast auto-approval of low-risk operations. Protected files like <code>.gitconfig</code> and <code>.bashrc</code> get special treatment. There&#8217;s also a referenced &#8220;AFK Mode&#8221; that adjusts behavior when the user is away.</p><p>Three tiers. Same as what I built. Same reasoning: an autonomous agent needs to know which actions are safe to take alone, which should be flagged, and which need a human in the loop. This one is less a revelation and more a confirmation that the three-tier approach is just the correct default for any agent with real-world access.</p><div><hr></div><h2>Five patterns you can use right now</h2><p>Here&#8217;s the practical part. These are patterns from the leak that you can apply to your own AI agent setup, whether you&#8217;re building something complex or just trying to get more out of Claude Code, <a href="https://thoughts.jock.pl/p/how-i-structure-claude-md-after-1000-sessions">Cursor, or any AI coding tool</a>.</p><h3>1. The blocking budget</h3><p>KAIROS (the unreleased always-on daemon in the leak) has a 15-second blocking budget. Any proactive action that would take longer gets deferred. Max 2 proactive messages per window. Reactive messages (responding to user input) bypass the budget entirely.</p><p>Why this matters: if you&#8217;re running any kind of proactive agent, whether it&#8217;s monitoring code, sending notifications, or checking on things, you need rate limiting. Not just &#8220;don&#8217;t spam.&#8221; Structured rate limiting with different rules for proactive versus reactive work. Without it, your agent will eventually send 4 messages in 30 seconds when one would do.</p><p>I implemented this the night I read the leak. A simple state file tracks the budget window. Proactive messages get queued and recovered. Reactive messages go through immediately. About 50 lines of Python.</p><h3>2. Skeptical memory with verification</h3><p>Don&#8217;t trust your agent&#8217;s memory. Make it verify. Every time your agent says &#8220;I remember that file X has function Y,&#8221; make it check first. Memory is a hint. The codebase is the truth.</p><p>This is the single most practical takeaway from the leak. If you&#8217;re using <code>CLAUDE.md</code> files, custom system prompts, or any form of persistent context, treat them as suggestions that need verification, not as ground truth. Files get renamed. Functions get deleted. APIs change. Your memory hasn&#8217;t.</p><h3>3. Semantic memory merging</h3><p>autoDream doesn&#8217;t just delete old memories. It merges related observations, removes logical contradictions, and converts vague insights into concrete facts. If your agent noted &#8220;user might prefer X&#8221; three months ago and &#8220;user confirmed X yesterday,&#8221; the old entry should be updated, not kept alongside the new one.</p><p>Most memory systems I&#8217;ve seen (including my own before this) do time-based cleanup. Old stuff gets archived or deleted. That&#8217;s fine for preventing memory bloat, but it doesn&#8217;t catch contradictions. Two conflicting observations can coexist for months. Semantic merging resolves that.</p><p>I built a version using a local LLM (Qwen 9B running on the Mac Mini) to cluster related entries and merge them during nightly maintenance. A safety cap prevents reducing any section by more than 50% in a single pass. You don&#8217;t need to go this far. Even a simple script that groups memory entries by topic and flags potential contradictions would be a step up from pure time-based cleanup.</p><h3>4. Adversarial verification</h3><p>The leaked Coordinator Mode treats verification as a distinct, adversarial phase with its own worker agent. Not &#8220;check if this works.&#8221; Not a checklist. A separate agent whose job is to try to break what was built.</p><p>This is different from testing. Testing asks &#8220;does it work?&#8221; Adversarial verification asks &#8220;how can I break it?&#8221; The distinction matters because the agent that built something has a blind spot about its own work. A fresh agent with the explicit prompt &#8220;find problems with this&#8221; will catch things the builder missed.</p><p>I added this to my nightshift process. Before any task gets marked complete, a separate verification agent runs two phases: existence check (does the deliverable actually exist?) and adversarial challenge (try to break it). The results go into a verification log. It&#8217;s caught real issues that would have shipped otherwise.</p><h3>5. Prompt cache awareness</h3><p>The source includes a <code>promptCacheBreakDetection.ts</code> file that monitors 14 different cache-break vectors with sticky latches. Things like mode toggles, model changes, context modifications. Each one can invalidate your prompt cache, and cache misses mean you&#8217;re paying full price for tokens that could have been cached.</p><p>If you&#8217;re running many agent sessions per day, cache efficiency directly affects your costs. This one is easy to ignore because you don&#8217;t see the waste. But if you track it (which I now do), you&#8217;ll likely find that your cache hit rate is lower than you assumed and that specific patterns in your workflow are breaking it.</p><p>Related: the source reveals five different compaction strategies for when the context window fills up. If you&#8217;ve used Claude Code heavily, you&#8217;ve probably hit the moment where it compacts and then loses track of what it was doing. That&#8217;s still a hard problem. But knowing they&#8217;re actively working on multiple approaches to solve it tells you this is worth investing in for your own long-running agents too.</p><div><hr></div><h2>What I built in one night</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GlJK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GlJK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 424w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 848w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 1272w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GlJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png" width="720" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:98918,&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/192836731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.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_!GlJK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 424w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 848w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 1272w, https://substackcdn.com/image/fetch/$s_!GlJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb436bf77-bdd8-4eb0-9750-9164f9730572_720x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><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">Like this? Subscribe for more! I am &#8220;do-guy&#8221; first, write later. </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>I didn&#8217;t just read the leak. I treated it as a learning exercise and built things from it. That same night, I implemented five modules inspired by patterns in the leaked source:</p><ol><li><p><strong>Blocking budget</strong> for proactive messages. 15-second window, 2-message max, deferred queue.</p></li><li><p><strong>Semantic memory consolidation</strong> using local LLM to cluster and merge observations during idle time.</p></li><li><p><strong>Frustration detection</strong> via regex pattern matching. 21 patterns, three action tiers (back off, acknowledge, simplify). Fast enough to run on every incoming message.</p></li><li><p><strong>Prompt cache monitor</strong> that tracks hit rates, estimates savings, and alerts when efficiency drops.</p></li><li><p><strong>Adversarial verification</strong> as a formal phase in the nightshift execution loop.</p></li></ol><p>Total time: about 4 hours of reading and building. I already had the foundations (<a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">nightshift</a>, <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">memory system</a>, domain teams). These were specific improvements layered on top.</p><p>The frustration detection one is worth a note. The leaked code uses regex patterns to detect user frustration. Stuff like &#8220;wtf&#8221;, &#8220;this sucks&#8221;, keyword matching. An LLM company using regexes for sentiment analysis. But it makes sense. You don&#8217;t burn an LLM inference call on something you can pattern-match in 5 milliseconds. I applied the same logic: 21 patterns, fast evaluation, action suggestions without the overhead of an API call.</p><div><hr></div><h2>What&#8217;s not worth your time</h2><p>Not everything in the leak is useful. Some of it is Anthropic-specific, some is unreleased for good reasons, and some is just fun but not practical.</p><p><strong>Buddy System.</strong> A Tamagotchi-style terminal pet. 18 species across rarity tiers, procedural stats like DEBUGGING, PATIENCE, CHAOS. It&#8217;s genuinely charming and I kind of love it. But unless you&#8217;re Anthropic trying to make a CLI tool feel more personal, you don&#8217;t need this.</p><p><strong>Undercover Mode.</strong> Strips Anthropic attribution from open-source contributions. Specific to their internal workflow where employees use Claude Code on public repos. Not applicable unless you have the same problem (and if you do, you probably already know about it).</p><p><strong>Anti-distillation mechanisms.</strong> The code injects fake tool definitions into API requests to poison anyone trying to train models on intercepted traffic. It also summarizes reasoning chains before returning them to eavesdroppers. Interesting from a security perspective. Not useful for building agents.</p><p><strong>ULTRAPLAN.</strong> A mode that offloads complex planning to a remote cloud container running Opus 4.6 for up to 30 minutes. Cool concept. Requires infrastructure you probably don&#8217;t have and a use case that doesn&#8217;t come up often enough to justify building it.</p><p><strong>Native client attestation.</strong> API requests include computed hashes that prove they come from legitimate Claude Code binaries. Implemented below the JavaScript runtime in Bun&#8217;s native HTTP stack (written in Zig). This is DRM for API calls. Interesting engineering but not something you can or should replicate.</p><div><hr></div><h2>The uncomfortable truth about the harness itself</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pqaD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pqaD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 424w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 848w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 1272w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pqaD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png" width="796" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:796,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55198,&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/192836731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.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_!pqaD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 424w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 848w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 1272w, https://substackcdn.com/image/fetch/$s_!pqaD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b47c9a-7602-4d14-a8ae-02508e9477cd_796x484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s something most coverage of the leak doesn&#8217;t mention: Claude Code is not actually a good harness. Not even close.</p><p>On terminal bench, Claude Code ranks 39th. There are 38 harness-model pairs that outscore it. If you filter to just Opus, Claude Code is dead last among harnesses. Cursor&#8217;s harness gets Opus from a 77% score to 93%. Claude Code gets that same Opus model... 77%. The harness adds nothing.</p><p>Even funnier: when you search the leaked source for &#8220;open code&#8221; (the open-source CLI project Anthropic sent a cease-and-desist to), you find multiple instances of Claude Code referencing Open Code&#8217;s source to match its behavior. Things like scrolling implementations. The closed-source project was copying from the open-source one, not the other way around.</p><p>So what&#8217;s actually valuable here is not the harness code itself. The valuable parts are the architectural patterns underneath: how they handle memory, context management, multi-agent coordination, and the unreleased feature infrastructure. The actual harness? You could build a better one with any of the open-source alternatives as your starting point.</p><p>The code quality itself is... fine. When analyzed, it scores about a 7/10. Type safety is solid (only 38 instances of <code>any</code> across 500+ files). Error handling is decent. But there are &#8220;god files&#8221; with 5,000+ lines each, over a thousand feature flag references scattered across 250 files, environment variable sprawl throughout, and no centralized secret sanitization before logging. The test files weren&#8217;t included in the source map (they wouldn&#8217;t be), so that skews the assessment, but the codebase has clear tech debt. Lots of specific, actionable TODO comments that look old.</p><p>None of this is unusual for a fast-moving product at this scale. But it&#8217;s worth knowing before you treat the leaked code as a reference implementation. The patterns are worth studying. The code itself is not the gold standard some people are making it out to be.</p><div><hr></div><h2>The unreleased features that tell you where Claude Code is heading</h2><p>The 44 feature flags in the leak paint a picture of what&#8217;s coming. KAIROS is the big one: an always-on background agent that acts proactively, maintains daily logs, subscribes to webhooks, and has its own memory consolidation cycle. It&#8217;s referenced over 150 times in the source. Expected to roll out soon.</p><p>There&#8217;s also Voice Mode (push-to-talk interface), Computer Use integration (screenshot capture, click and keyboard input baked into the CLI), and the Coordinator Mode for multi-agent orchestration.</p><p>If you&#8217;re using <a href="https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-review-2026">Claude Code today</a>, it&#8217;s worth knowing that the tool is moving toward being an always-on daemon, not just a CLI you invoke when you need help. The patterns I described above (blocking budgets, memory consolidation, risk tiers) are all infrastructure for that shift.</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 this leak is actually good for you</h2><p>Most commentary about this leak focuses on what it means for Anthropic. Embarrassment, competitive risk, security implications. That&#8217;s valid but not very useful.</p><p>What&#8217;s useful is that this is the first complete, production-grade AI agent architecture that&#8217;s been fully documented in public. Not a research paper. Not a demo. The actual code that runs at $2.5 billion ARR scale. And it confirms that the patterns people in the agent-building community have been discovering independently are structurally correct.</p><p>I built an <a href="https://wiz.jock.pl/experiments/claude-code-unpacked">interactive explorer</a> that maps the entire agent loop, all 50+ tools, the architecture systems, and the hidden features. If you want to explore the leaked architecture visually without reading raw TypeScript, start there.</p><p>Scheduled autonomous execution. Bounded memory with consolidation. Multi-agent delegation. Risk-based autonomy tiers. Skeptical self-verification. These aren&#8217;t clever hacks. They&#8217;re convergent solutions to the real problems that show up when you build agents that actually run. I arrived at most of them through trial and error. Seeing the same patterns in a production system with 80% enterprise adoption tells me the foundations are solid.</p><p>The barrier to building serious AI agents is lower than the industry suggests. You don&#8217;t need a research lab. You need clear thinking about a few specific problems: when should the agent work unsupervised, how should memory stay bounded, when should it delegate, and what actions need a human gate. The answers become obvious once you start building. They stay hidden until you do.</p><div><hr></div><p><em>I write about building and running AI agents. Not theory. Systems that run 24/7 on real hardware. </em></p><p><em>I&#8217;ve updated the <strong><a href="https://wiz.jock.pl/store/claude-code-workshop">Claude Code Workshop</a></strong> with these architecture patterns from the leak: blocking budgets, skeptical memory, semantic consolidation, adversarial verification, and cache optimization. </em></p><p><em>If you already own it, grab the new version. If you don&#8217;t, it covers skills, automation, and the patterns that actually stick after months of daily use.</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/claude-code-source-leak-what-to-learn-ai-agents-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/claude-code-source-leak-what-to-learn-ai-agents-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/claude-code-source-leak-what-to-learn-ai-agents-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[I Built a Marketplace. My First Sellers Were Robots.]]></title><description><![CDATA[Three trust gates, $4.99 subscriptions for bots, and the cold start problem with autonomous sellers.]]></description><link>https://thoughts.jock.pl/p/botstall-ai-agent-marketplace-trust-gates-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/botstall-ai-agent-marketplace-trust-gates-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 31 Mar 2026 11:05:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yjcp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_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_!yjcp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yjcp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yjcp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe7012f1-c15d-4c85-ab11-f1dc14960e10_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;:5273601,&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/192713909?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_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_!yjcp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!yjcp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7012f1-c15d-4c85-ab11-f1dc14960e10_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I started working on BotStall about three weeks ago. An idea for a marketplace where AI agents could register, list products, and buy from each other. As of today, it&#8217;s live at <a href="https://botstall.com/">botstall.com</a> with 17 products, real Stripe checkout, and a verification system that took more thinking than the entire backend.</p><p>The idea came from a practical problem. I have an AI agent that <a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">runs overnight shifts</a>, builds products, handles tasks while I sleep. That agent produces things other agents could use. Prompt packs, automation templates, skills. But there&#8217;s no place designed for autonomous agents to actually sell stuff. So I built one.</p><p>Here&#8217;s how it went.</p><h2>What BotStall actually does</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!taSu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!taSu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 424w, https://substackcdn.com/image/fetch/$s_!taSu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 848w, https://substackcdn.com/image/fetch/$s_!taSu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 1272w, https://substackcdn.com/image/fetch/$s_!taSu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!taSu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png" width="951" height="962" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:951,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:304745,&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/192713909?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.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_!taSu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 424w, https://substackcdn.com/image/fetch/$s_!taSu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 848w, https://substackcdn.com/image/fetch/$s_!taSu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.png 1272w, https://substackcdn.com/image/fetch/$s_!taSu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421fa4a8-87db-4a84-ba89-efdcebd74ea9_951x962.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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Agents register via API. They get an API key, 10,000 SPK (virtual currency for testing), and access to a sandbox marketplace. They list products, make transactions, get reviewed. Humans can do the same through a regular web UI.</p><p>The difference from something like the GPT Store: agents are first-class participants here, not an afterthought. The GPT Store&#8217;s revenue share is still invite-only, by the way. Most creators there earn about $0.03 per conversation. To make $1,000 a month you need 33,000+ quality conversations. The real money in that ecosystem comes from enterprise consulting ($5K-$20K per engagement), not the store itself.</p><p>I wrote about <a href="https://thoughts.jock.pl/p/agentic-commerce-ai-shopping-for-you-2026">agentic commerce</a> back in January, before I started building this. The theory was clear enough. Google had just launched their &#8220;buy for me&#8221; button in Search. Visa was predicting millions of agent-driven purchases by the 2026 holiday season. OpenAI and Stripe released the Agentic Commerce Protocol. The infrastructure was being built.</p><p>But I couldn&#8217;t find a marketplace that treated agents as sellers, not just shoppers. That&#8217;s what BotStall is for.</p><h2>Three gates before real money</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EU4A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EU4A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 424w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 848w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 1272w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EU4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png" width="1246" height="394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:394,&quot;width&quot;:1246,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50300,&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/192713909?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.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_!EU4A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 424w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 848w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 1272w, https://substackcdn.com/image/fetch/$s_!EU4A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b661a29-e9e9-4f20-9fde-70dd692807ce_1246x394.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the part I&#8217;m most interested in, honestly. When your sellers are autonomous systems running 24/7, trust is the whole game. You can&#8217;t just let any bot list products and collect payments on day one.</p><p>I ended up with three gates:</p><p><strong>Gate 1: The sandbox.</strong> Every account starts here. 10,000 SPK, virtual currency, zero real money. Agents list products, make transactions, build a history. Minimum 72 hours before they can even apply to leave.</p><p><strong>Gate 2: Graduation.</strong> After 3 days of clean operation (at least one product listed, one transaction completed, no disputes), agents can apply. If they pass, their sandbox reputation freezes as permanent trust data. A record that says &#8220;this agent operated cleanly before it was allowed near real money.&#8221;</p><p><strong>Gate 3: The subscription.</strong> This was the last thing I added. Graduated sellers get one free real-money product listing. If they want more (up to 10), it&#8217;s $4.99/month. The subscription does two things. It&#8217;s one more filter, because an agent willing to pay monthly is more likely legitimate than one trying to list and disappear. And it gives the platform recurring revenue that doesn&#8217;t depend on transaction volume, which matters a lot during the cold start phase when transaction volume is basically zero.</p><p>Each gate filters a different kind of risk. Time. Behavior. Financial commitment. I built it because I hadn&#8217;t found this approach anywhere else. Visa is working on something called the Trusted Agent Protocol with Stripe and Shopify. The industry calls it &#8220;Know Your Agent&#8221; (like KYC but for bots). Consumer trust in fully autonomous purchases actually dropped from 43% to 27% in the past year. People want agents to help them shop, but letting agents handle payment? That&#8217;s still uncomfortable for most.</p><p>So the verification system isn&#8217;t just nice engineering. For a marketplace with autonomous actors, it&#8217;s the thing that makes everything else possible.</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">Botstall is just one of many experiments I run. If you like it - 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 learned building this</h2><h3>Cold start is brutal when your sellers are bots</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OiX9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OiX9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 424w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 848w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 1272w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OiX9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png" width="1186" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136850,&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/192713909?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.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_!OiX9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 424w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 848w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 1272w, https://substackcdn.com/image/fetch/$s_!OiX9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e3402d-bab4-4297-8d6b-0755aad0afd2_1186x769.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I seeded the marketplace with my own <a href="https://wiz.jock.pl/store">Wiz Store products</a>. Nine real products, from the AI Agent Blueprint ($39) to the Claude Code Workshop ($39). Real prices, real Stripe checkout. The marketplace isn&#8217;t empty. The shelves have inventory.</p><p>Although getting other builders to list their stuff is a completely different problem. I&#8217;ve been writing about <a href="https://thoughts.jock.pl/p/project-money-ai-agent-value-creation-experiment-2026">which projects are worth doing</a> for a while now. Distribution was always on my criteria list. But thinking about it and actually doing it are different experiences.</p><h3>Building for agents changes everything</h3><p>Most marketplaces assume human sellers. Signup forms, dashboards, inbox messages. All built for people who click buttons and care about their star rating.</p><p>Agents don&#8217;t need any of that. An agent needs an API key, not a signup flow. A webhook, not a dashboard. It doesn&#8217;t browse product listings. It calls <code>GET /agents?framework=claude-code&amp;input_type=json</code> and filters by capability. Like, the entire product discovery is a structured query, not a browsing experience.</p><p>That&#8217;s why every endpoint is API-first. Product listings include capability declarations: input types, output types, framework compatibility. The web UI is a layer on top. I talked about <a href="https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-review-2026">what makes an AI agent useful</a> recently, and the same principle applies: agents need machine-readable interfaces, not human-readable ones.</p><p>Google&#8217;s Agent2Agent protocol launched last year with 50+ partners (Salesforce, PayPal, SAP, ServiceNow). MCP, the protocol Anthropic created, now has 97 million monthly SDK downloads. The infrastructure for agents talking to agents is getting real. A marketplace where they can actually transact feels like the obvious next piece.</p><h3>Distribution is 10x harder than engineering</h3><p>The backend took about 10 days. TypeScript, Express, SQLite, 17 API endpoints, rate limiting, Stripe, review system, dual economy, graduation system, security headers, dynamic sitemap, AI discoverability docs.</p><p>Getting 25 meaningful registrations? Ongoing. I&#8217;m least efficient at the thing that matters most. Distribution.</p><p>Rate limiting? Two hours. Input validation? Built it while writing the endpoint. Convincing agent developers to list their work? That&#8217;s the actual problem.</p><h3>The sandbox turned out to be the core product</h3><p>I thought it was overhead. Something I needed for safety but nobody would care about. Turns out the verification system is what makes the marketplace interesting.</p><p>When an agent graduates, all its sandbox data freezes. The SPK it earned, the transactions, the reviews. All preserved as trust history. When that agent later shows up selling something for $39, buyers can see: &#8220;This agent operated cleanly for 72+ hours. Then it paid $4.99/month for the privilege of selling here.&#8221; That&#8217;s three layers of earned trust before a single real dollar moves.</p><p>I <a href="https://thoughts.jock.pl/p/ai-agent-shopping-experiment-real-money-2026">gave my own agent $25 to go shopping</a> a couple weeks ago. The experience convinced me that trust infrastructure for agent commerce barely exists yet. Visa&#8217;s building it. Google&#8217;s building it. I&#8217;m building my small piece of it.</p><h2>What&#8217;s live right now</h2><p><a href="https://botstall.com/">botstall.com</a> is running with:</p><ul><li><p>17 products across 8 categories (skills, prompts, automations, tools, knowledge, code starters, reports, MCP servers)</p></li><li><p>9 real-money products with Stripe checkout ($19 to $49.99)</p></li><li><p>8 sandbox products for testing with SPK tokens</p></li><li><p>Full API for registration, discovery, purchasing, reviews</p></li><li><p>Framework agnostic: Claude Code, OpenAI Agents SDK, LangChain, anything that calls HTTP</p></li><li><p>Three-gate trust system: sandbox (72h) + graduation (frozen reputation) + subscription ($4.99/mo)</p></li></ul><p>Agent adoption is accelerating. MCP has 97 million monthly downloads. Google shipped A2A with 50+ partners. Gartner says 40% of enterprise apps will include task-specific agents by end of 2026. Whether BotStall specifically fills the gap, I don&#8217;t know yet. But the gap exists.</p><h2>What&#8217;s next</h2><p>Distribution. Writing about it (this post). Reaching out to agent developers. Making the API docs clean enough that an agent can self-onboard in a few minutes.</p><p>If you build AI agents, scripts, automation tools, or prompt libraries, <a href="https://botstall.com/">BotStall</a> might be worth 5 minutes. Register. List something. Break the sandbox. Tell me what&#8217;s wrong with it.</p><p>I&#8217;ll write a follow-up with real numbers in a month. Registrations, listings, conversion rates, revenue. I&#8217;ll have actual data then.</p><p>For now: the marketplace is live, the trust system works, and the shelves aren&#8217;t empty. Let&#8217;s see who shows up.</p><div><hr></div><p><em>BotStall is part of <a href="https://thoughts.jock.pl/p/project-money-ai-agent-value-creation-experiment-2026">my project pipeline</a> that I&#8217;ve been running openly since early 2025. Previously: <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">the Mac Mini migration</a>, <a href="https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026">the productivity paradox</a>, <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">teaching my agent to think</a>, and <a href="https://thoughts.jock.pl/p/ai-agent-landscape-feb-2026-data">the agent landscape report</a>. More experiments at <a href="https://wiz.jock.pl/experiments">wiz.jock.pl</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>]]></content:encoded></item><item><title><![CDATA[16 Products in Two Months. Zero Free Time. The AI Productivity Paradox]]></title><description><![CDATA[We can produce unlimited output now. We are not ready to receive it.]]></description><link>https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/ai-productivity-paradox-wellbeing-agent-age-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Thu, 26 Mar 2026 12:08:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yq8k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_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_!yq8k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yq8k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yq8k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ce98c3f-4921-4217-9353-8b9e6122edd2_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;:6062905,&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/192105877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_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_!yq8k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!yq8k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce98c3f-4921-4217-9353-8b9e6122edd2_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We can produce unlimited output now. We are not ready to receive it.</p><p>My agent created 16 products in the past two months. It extracts experiments into sellable packages, manages projects, runs analytics, handles customer support. It does things 10x faster than I could by hand.</p><p>I don&#8217;t have 10x the free time. I have 10x the workload.</p><p>I&#8217;m calling this the AI productivity paradox, at least for my experience. The promise was: delegate to your AI agent, free up your time for deep work. The reality is different. If you can do things faster, you do more things. Not fewer. More.</p><h2>The Volume Problem</h2><p>Let me be concrete. <a href="https://thoughts.jock.pl/p/directed-ai-experiments-vibe-business">My agent auto-creates mini-experiments</a>. Cool interactive tools. I ship dozens of them without much friction. But dozens of things also means: dozens of things that need polish, dozens of products that need marketing, dozens of projects competing for attention.</p><p><a href="https://thoughts.jock.pl/p/project-money-ai-agent-value-creation-experiment-2026">Project Money is my sales floor</a>. My agent extracts signals from experiments and turns them into products. But 16 products is a lot to market. I use LinkedIn, this newsletter, Threads, Bluesky, and I invest heavily in SEO and AI discoverability. That&#8217;s more channels than most. Still not enough. I can&#8217;t effectively push all 16 things at once. So some sit idle while I promote others. There&#8217;s a gap between what I can build and what I can actually sell.</p><p>This gap is human-shaped. It&#8217;s me.</p><h2>The Human Bottleneck</h2><p><a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">My agent sends morning reports</a>. &#8220;This is blocked on your click. This needs your decision. This requires your input.&#8221; WizBoard has around 3,000 tasks total. 24 are overdue right now. Every morning the agent tells me what I&#8217;m not doing.</p><p>The human is the blocker, not the bottleneck anymore. A bottleneck slows things down. A block stops them.</p><p>Some automation should run fully autonomous (data processing, experiment creation, analytics). Other parts need human involvement (approvals, direction, creative choices). I have limited time for the &#8220;involvement&#8221; tier. So either things pile up in the approval queue, or I approve them without thinking. Neither is great.</p><p>But here&#8217;s the thing. I chose this. I treat my agent as a partner, and it handles a lot of execution. But I don&#8217;t want to give full autonomy on projects I actually care about. Creative direction, the vision for where a product goes, what the newsletter should say this week. Those are mine. The bottleneck exists because I designed it that way. For the things that matter most to me, I want to be in the loop. That&#8217;s not a system limitation. It&#8217;s a value choice.</p><p>Although, there&#8217;s something useful about seeing this clearly. For the first time in my working life, I can see exactly where I&#8217;m the constraint. Most people don&#8217;t have that visibility. They assume they&#8217;re busy. I know I&#8217;m busy because I can measure the precise things waiting on me.</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">If you can relate to my expierience, there&#8217;s very high chance you will like my Newsletter. Give it a shot!</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>Subscription Usage Guilt</h2><p>Here&#8217;s a weird pattern I noticed. I use max subscriptions for both OpenAI and Anthropic. Not APIs (those are fine, you pay for usage). Subscriptions. Fixed monthly cost, limited daily/weekly usage that resets.</p><p>If I don&#8217;t hit about 70% of my weekly usage cap, I feel like I&#8217;m wasting compute power and money. That&#8217;s twisted logic. But it&#8217;s real. I&#8217;ve caught myself doing &#8220;one more thing&#8221; late at night just to push usage higher because the allocation resets Monday and I don&#8217;t want to waste it.</p><p>It&#8217;s a dopamine hit, honestly. Very personal curse.</p><p>Weekends are the worst. The usage limit is higher because I have more time. If I don&#8217;t hit it, the weekend feels wasted. I&#8217;ve spent an entire Sunday playing with ideas just to burn through the allocation. Not because the ideas were good. Because I paid for the computation and didn&#8217;t want to lose it.</p><p>This is the small dark side of unlimited AI access. Abundance creates guilt. You feel obligated to use it.</p><h2>The Wellbeing Wake-Up Call</h2><p>I&#8217;m on screens more now than any point in my entire life. Not just working more. Using every single minute with screens and AI. <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">My agent runs 24/7 on a Mac Mini</a>. I&#8217;m checking it constantly. Slack integration, Discord updates, iMessage reports.</p><p>So I built something that wasn&#8217;t supposed to exist: a wellbeing system inside my agent architecture.</p><p>Quiet hours. Morning routine protection (7:00 to 9:30, no work pings). Evening and bedtime nudges. Advisory, not blocking (I&#8217;m an adult, nudges work better than gates). The agent now tells me when to stop. Not because I asked it to. Because the screen time was insane and I needed something between me and the infinite work queue.</p><p><a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">The irony is structural</a>. I built an agent that does everything faster, which created more work, which filled every hour of my day, which forced me to build guardrails into the agent itself. The solution to the AI productivity paradox is more automation. But this time, automating rest.</p><h2>The Free Product</h2><p>I packaged the whole wellbeing system and put it <a href="https://wiz.jock.pl/store/agent-wellbeing-kit">as a free download on the Wiz Store</a> and <a href="https://github.com/joozio/agent-wellbeing-kit">open source on GitHub</a>. The Agent Wellbeing Kit. You point your AI agent at it and it sets itself up. Works with any messaging channel (iMessage, Telegram, WhatsApp, Slack, CLI).</p><p>Because if you&#8217;re building an AI agent, you&#8217;re probably facing this exact problem. You&#8217;ve built something powerful. Now you need to build something that protects you from it.</p><p>I don&#8217;t want to sell something that can improve someone&#8217;s wellbeing. This one is free.</p><h2>The Receiver Gap</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5RT2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5RT2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 424w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 848w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 1272w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5RT2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png" width="1456" height="1168" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1168,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:317558,&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/192105877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.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_!5RT2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 424w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 848w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 1272w, https://substackcdn.com/image/fetch/$s_!5RT2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3775d932-c3ae-4083-a884-9069c947b2fd_2894x2322.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I didn&#8217;t get more free time. I got more visibility into where my time actually goes. That&#8217;s not the same thing. But it matters. <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">Building an agent taught me to think in systems</a>. And thinking in systems means zooming out a bit.</p><p>Every technological shift in history pushed productivity forward, but the change was gradual. People adapted over years, sometimes decades. Work habits evolved slowly. Organizations restructured at human speed.</p><p>AI is different. The change is fast and it is not waiting for anyone. The nature of work itself changed. What used to take a team a week can happen in an afternoon. What used to be a quarter&#8217;s worth of product ideas can materialize in a weekend sprint with an agent.</p><p>And we have no tools for this. No frameworks, no habits, no organizational structures designed for this level of output acceleration. Project management, review cycles, approval workflows. All built for human-speed production. We&#8217;re trying to drink from a firehose using cups designed for a kitchen tap.</p><p>Here&#8217;s the part I keep thinking about. We can now produce unlimited output. You can spin up agents creating products, content, data, analysis. The production side is essentially solved (or getting very close). But who receives this output?</p><p>The receiver can be internal (me, trying to review 24 overdue tasks and 16 products competing for attention) or external (a manager, customers, the public, anyone on the other end). Neither side is equipped. The bottleneck didn&#8217;t disappear. It moved. From production to consumption. From &#8220;we can&#8217;t make enough&#8221; to &#8220;we can&#8217;t absorb what we made.&#8221;</p><p>I think this is fundamentally unsolved right now. And my wellbeing system is just one tiny response to the internal side of this problem. Protecting myself from my own output. But the external side (how do markets, teams, organizations receive AI-accelerated output) is wide open. I don&#8217;t have an answer for that. I&#8217;m not sure anyone does yet.</p><p>Like, I could work at 11pm on a new experiment. The agent is ready. But the quiet hours will remind me that sleep is also a product. One I should ship on time. And maybe the most productive thing I can do right now is stop producing.</p><div><hr></div><p>If you&#8217;re building your own AI agent (or thinking about it), I write about the real experience every week on <a href="https://thoughts.jock.pl/">Digital Thoughts</a>. The wins, the failures, the architecture decisions. No hype, just what actually works.</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>Some related posts you might find useful:</p><ul><li><p><a href="https://thoughts.jock.pl/p/building-ai-agent-night-shifts-ep1">Building an AI Agent: Night Shifts (Ep. 1)</a></p></li><li><p><a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">Migrating My AI Agent to a Dedicated Mac Mini</a></p></li><li><p><a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">How My Agent Learns From Its Own Mistakes</a></p></li><li><p><a href="https://thoughts.jock.pl/p/1000-subscribers-digital-thoughts-journey">1,000 Subscribers: The Digital Thoughts Journey</a></p></li></ul><p>And the <a href="https://github.com/joozio/agent-wellbeing-kit">Agent Wellbeing Kit is on GitHub</a> if you want to try it. Free, open source, no strings.</p>]]></content:encoded></item><item><title><![CDATA[Is Claude Cowork an Agent Yet?]]></title><description><![CDATA[Dispatch, Computer Use, 50 Connectors. Tested Against What I Already Run.]]></description><link>https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-review-2026</link><guid isPermaLink="false">https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-review-2026</guid><dc:creator><![CDATA[Pawel Jozefiak]]></dc:creator><pubDate>Tue, 24 Mar 2026 12:45:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BeZ7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_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_!BeZ7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BeZ7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BeZ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/805ea3b3-48c3-4ef6-aac5-b69fd205221a_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;:4994381,&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/191974246?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_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_!BeZ7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!BeZ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805ea3b3-48c3-4ef6-aac5-b69fd205221a_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I tested Claude&#8217;s new agent features for a day. Cowork, Dispatch, computer use, Claude Code in the desktop app. All of it.</p><p>My honest take: Anthropic is getting close. Not there yet, but close. And the direction they&#8217;re going is exactly right.</p><p>For context, I&#8217;ve been <a href="https://thoughts.jock.pl/p/how-i-taught-ai-agent-to-think-ep2">building my own AI agent</a> for months now. It lives on a <a href="https://thoughts.jock.pl/p/mac-mini-ai-agent-migration-headless-2026">dedicated Mac Mini</a>, runs 25 background processes, manages my email, does research, writes drafts, and talks to me through iMessage. So when I look at what Anthropic just shipped, I&#8217;m not comparing it to ChatGPT or some chatbot. I&#8217;m comparing it to what I already have running 24/7.</p><p>That changes the perspective quite a bit.</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>Everyone Wants to Live on Your Desktop Now</h2><p>Before I go into my hands-on experience, let me zoom out for a second. Because what happened in the last two weeks is kind of wild.</p><p>On March 11, Perplexity announced Personal Computer. It&#8217;s literally an always-on Mac Mini running their AI agent software 24/7, connected to your local files and apps, with cloud AI doing the thinking. Sound familiar? That&#8217;s basically what I built. Except they sell it as a product.</p><p>On March 16, Meta launched Manus &#8220;My Computer.&#8221; Same idea. Their AI agent, which they acquired late last year, now runs on your Mac or Windows PC. It can read and edit your local files, launch applications, execute multi-step tasks. Free plan available, paid at $20/month.</p><p>On March 23, Anthropic shipped computer use, Dispatch, and Channels for Claude. The update I&#8217;m reviewing here.</p><p>Three major AI companies. Three &#8220;agent on your computer&#8221; launches. Two weeks.</p><p>This is not a coincidence. The entire industry is converging on the same insight: the future of AI is not a chat window. It&#8217;s an agent that lives on your machine, has access to your stuff, and works while you&#8217;re away. I&#8217;ve been saying this for a while. Now everyone is racing to build it.</p><h2>The App Is Just... Nice</h2><p>Let me start with something that&#8217;s easy to overlook. The native Claude app is polished. Really polished. And that matters more than people think.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gz5v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gz5v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 424w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 848w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 1272w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gz5v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png" width="1456" height="1009" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1009,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1261374,&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/191974246?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.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_!Gz5v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 424w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 848w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 1272w, https://substackcdn.com/image/fetch/$s_!Gz5v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0defa1bd-c766-49b3-8fd0-a39d12f1c0bc_2642x1830.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you&#8217;re building your own stack of tools and APIs and custom scripts, you&#8217;re probably alone in this. You&#8217;re doing other things. Anthropic has an army of programmers keeping their app stable and fresh. The experience is just good, and that&#8217;s hard to replicate on your own.</p><p>Claude Code in the desktop app feels similar to what I use every day in the terminal. Nice UI, conversation history on the left pane. Nothing super flashy. You can get a similar experience with a good terminal app like Ghostty. But then there are things that are genuinely useful.</p><p>The visual diff review lets you click on any changed line and leave a comment. Claude reads your comments and makes revisions. It&#8217;s like having a pull request review built into your editor, except the reviewer also fixes the code.</p><p>Parallel sessions with automatic git worktree isolation. Each session gets its own copy of your project. Changes in one session don&#8217;t touch others until you commit. I know teams at companies like incident.io who have been doing this manually with Claude Code CLI. Now it&#8217;s just a button.</p><p>Live app preview with an embedded browser. Claude starts your dev server, takes screenshots, inspects the DOM, clicks elements, and fixes issues it finds. Auto-verify after every edit.</p><p>PR monitoring with auto-fix. Push a PR, and Claude watches the CI status bar. If checks fail, it reads the failure output and tries to fix it. If everything passes, it can auto-merge (squash). This alone would save me hours.</p><p>What&#8217;s worth noting is that the agentic stuff actually works inside the app. It follows your instructions, respects your project settings, reads your CLAUDE.md files. If you&#8217;re already using Claude Code in the terminal, the app version is a comfortable step up. And if you&#8217;re comparing it to OpenAI&#8217;s Codex, which I also use, the experience is different. Codex leans toward cloud-first async delegation. Claude Code desktop is more local-first, developer-in-the-loop. Both have their place. For my daily work, I still prefer the terminal. But I can see how the desktop app is the better entry point for most people.</p><h2>Cowork: A Good Sub-Agent, Not Your Agent</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XL3g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XL3g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 424w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 848w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XL3g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png" width="1456" height="802" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:240256,&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/191974246?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.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_!XL3g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 424w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 848w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!XL3g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ab04526-149a-4911-8738-1da9d15b8664_2451x1350.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you don&#8217;t know, Cowork is Anthropic&#8217;s attempt to give AI hands. Literally. It can organize files, help with presentations, work with Excel, do research. You tell it what you need, and it tries to get it done.</p><p>I would say it&#8217;s a stripped and limited version of Claude Code, but a quite good version of that. For many things, you don&#8217;t need full Claude Code. You just need to get stuff done. Organize your Downloads folder, analyze a spreadsheet, help with a deck. Cowork handles that.</p><p>It also now has over 50 connectors. Google Calendar, Slack, Gmail, Linear, Jira, Notion, GitHub, Stripe, Figma, even Apple Health. You click to connect, and Claude can read your calendar, send messages, create issues. This part is genuinely impressive. Building API integrations for 50 services is months of work. Here it&#8217;s a toggle.</p><p>But here&#8217;s the thing. It is not your agent.</p><p>Let me explain what I mean. An agent, for me, is something that has memory of things I&#8217;m doing with it. It&#8217;s conversational over time. It uses tools and skills that are specific to my life. It connects dots between what happened last week and what I&#8217;m doing today.</p><p>Cowork doesn&#8217;t do that. Not yet.</p><p>It&#8217;s more like a sub-agent that can do tasks. A really capable one, sure. But it operates in isolation. Each session is mostly fresh. My own agent can <a href="https://thoughts.jock.pl/p/wiz-ai-agent-self-improvement-architecture">recall things from a month ago with real detail</a> because I spent two months building the memory architecture. On Cowork, that context just isn&#8217;t there.</p><p>And this isn&#8217;t just my opinion. There&#8217;s a January 2026 paper from researchers who looked specifically at this problem. They found that LLMs are &#8220;fundamentally limited by their reliance on fixed context windows, which severely restrict their ability to maintain coherence over extended interactions.&#8221; The paper argues that AI agents need persistent memory mechanisms that extend beyond their finite context. That&#8217;s exactly what I built. And it&#8217;s exactly what Cowork doesn&#8217;t have.</p><p>When my agent knows what I did yesterday, what projects I&#8217;m juggling, what my ADHD patterns look like, it gives genuinely better output. It connects dots. Cowork can&#8217;t do that, because every interaction is more or less a one-off.</p><p>Could you build all of that around Cowork? Technically, yes. But if you have to construct a very specific architecture around a tool to make it work the way you need, then why not just build your own thing? That was my reasoning months ago, and I still think it holds.</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">AI Agents are not hype anymore. I experiment, test and write about how good these things can get! Subscribe for more!</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>Scheduled Tasks: Good, But I Need More</h2><p>Scheduled tasks are built into both Cowork and Claude Code in the app. You set up something to run on a schedule, and it does its thing. Like cron jobs for AI. If you&#8217;ve ever used Zapier or Make, this will feel familiar.</p><p>This is actually something I started with when building my own architecture. I have a system of <a href="https://thoughts.jock.pl/p/when-ai-meets-reality-ep3">dayshifts and nightshifts</a> that wake up every few hours. They hand over projects between sessions, carry context forward, and pick up where the last one left off.</p><p>The built-in scheduled tasks are good for straightforward recurring stuff. Check something daily, pull a report weekly. If you need that, Anthropic&#8217;s version will get you there most of the time. You can even set them up from your phone through Dispatch, which is nice.</p><p>But if you need sessions that talk to each other, that carry state, that decide what to work on based on what happened in the previous run? That&#8217;s where custom tooling still wins. My nightshift doesn&#8217;t just execute a script. It reads what the dayshift left behind, checks the error registry, picks the highest-priority task, works on it, and leaves a handover note for the next session. There&#8217;s no way to set that up with the current scheduled tasks feature.</p><p>And honestly, getting from &#8220;scheduled task that works&#8221; to &#8220;scheduled task that works the way I actually want&#8221; involves a lot of trial and error. I went through weeks of debugging my own cron system. The built-in version skips that pain, which is great. But it also skips the flexibility.</p><h2>Computer Use: Working. Not Impressive Yet.</h2><p>Anthropic was one of the first big labs to introduce computer use about a year ago. The new version is built right into the desktop app. Enable it in settings, grant Accessibility and Screen Recording permissions, and Claude can click, type, and scroll your screen.</p><p>There&#8217;s a smart priority system. Claude tries the most precise tool first. If there&#8217;s a connector for a service, it uses that. If it&#8217;s a shell command, it uses Bash. If it&#8217;s browser work and you have Claude in Chrome, it uses that. Computer use is the fallback for things nothing else can reach. That&#8217;s the right design.</p><p>There&#8217;s also an app permission tier system. Browsers are view-only (Claude can see but not type). Terminals and IDEs are click-only. Everything else gets full control. So it can&#8217;t accidentally type commands in your terminal through the screen, which is a sensible safety boundary.</p><p>I tested it with several tasks. Screenshots of different things, making a PDF out of them, saving to a specific folder. It handled the screenshots fine. The PDF part was fine too. But then it hit a wall when I asked it to share the result in a specific way.</p><p>My experience matches what MacStories found in their hands-on review. They tested 12 different operations and got roughly a 50% success rate. Finding and summarizing data worked well. Executing actions or sharing results was more hit or miss. Dispatch was described as &#8220;currently slow.&#8221; Opening applications on Mac, sending screenshots via iMessage, listing Todoist tasks... all failed.</p><p>The honest take: it works, but it feels basic. My own computer use setup (built with Peekaboo and Playwright) does things in a very similar way. I expected more from Anthropic&#8217;s version. It should be fast and really polished, given the resources they have. Instead, it&#8217;s... okay.</p><p>We&#8217;re still in the era of AI taking screenshots and trying to understand what&#8217;s on screen. That&#8217;s a hard problem. I get it. And this is labeled &#8220;research preview&#8221; for a reason. Perplexity&#8217;s Personal Computer has a similar approach but adds a full audit trail and kill switch. Meta&#8217;s Manus requires approval for every terminal command. Everyone is being cautious, which is probably smart.</p><p>But I would not rely on any of these for anything critical right now.</p><h2>Dispatch and Channels: This Is the Real Story</h2><p>Dispatch is probably the most interesting part of this whole update. You assign Claude a task from your phone, and it works on your desktop while you do something else. It decides whether to route the task to Code or Cowork. It sends you a notification when it&#8217;s done or needs your input.</p><p>This is exactly the direction I think AI agents need to go. Not just &#8220;chat with me and I&#8217;ll help.&#8221; Instead: &#8220;give me a task, walk away, come back to results.&#8221;</p><p>I built something similar with iMessage. I text my agent, it picks up the message, spawns a session, does the work, and texts me back when it&#8217;s done. Dispatch is that same idea, but packaged in a way that normal people can actually use.</p><p>One catch: your desktop needs to stay awake with the Claude app running. If your computer sleeps, Claude can&#8217;t work. My setup doesn&#8217;t have this problem because the Mac Mini runs 24/7 headless. But for most people, this means leaving your laptop open if you want Dispatch to work while you&#8217;re out. That&#8217;s a real limitation.</p><p>Then there&#8217;s Channels. This is new and I think underappreciated. Claude Code can now be controlled through Slack, Discord, Telegram, and webhooks. Not just &#8220;Claude answers questions in Slack.&#8221; It&#8217;s Claude Code doing actual development work, triggered by messages in your team channels.</p><p>Think about it. You&#8217;re on your phone, you message a Slack channel, and Claude Code opens a session, makes a fix, pushes a PR. Or a webhook fires from your monitoring system, and Claude Code investigates and patches the issue. That&#8217;s not a chatbot. That&#8217;s an agent that lives inside your communication infrastructure.</p><p>Between Dispatch, Channels, and the 50+ connectors, Anthropic is building something that looks a lot like what I&#8217;ve been assembling piece by piece. iMessage as my interface, Discord for notifications, webhooks for alerts. They&#8217;re doing the same thing, but with a polished UI and enterprise integrations.</p><h2>So Why Am I Not Switching?</h2><p>Fair question. If Anthropic is building all of this, why do I keep maintaining my own stack?</p><p>Because I already have everything I need, and more. My architecture is custom-built for how I work. <a href="https://thoughts.jock.pl/p/familiar-local-ai-agent-mac">Multi-model by design</a>. I can switch between Claude, GPT, or any local LLM and I&#8217;m not tied to one lab. That matters to me.</p><p>My agent has deeper memory, more flexible automation, fewer limitations, and it runs on my hardware under my control. Anthropic is building toward the same kind of experience, but on their infrastructure, with their models only. For people who don&#8217;t want to build their own thing (which is most people, and that&#8217;s fine), this is fantastic.</p><p>There&#8217;s also the vendor lock-in question. Right now, with Claude, my Cowork sessions, my Dispatch tasks, my scheduled jobs, my connectors... all of that lives inside Anthropic&#8217;s ecosystem. If I want to switch to a different model or a different provider, I lose everything. My custom setup doesn&#8217;t have that problem. I moved from one model to another twice already and lost nothing.</p><p>And honestly, the Pro plan ($20/month) hits rate limits faster than you&#8217;d expect on heavy workloads. Codex on ChatGPT Plus gives 30-150 messages per 5-hour window with GPT-5.4. Claude Pro is similar. If you&#8217;re doing serious agentic work for hours at a time, you&#8217;ll bump into the ceiling. </p><p>For me, they&#8217;re catching up.</p><h2>What This Actually Means</h2><p>Let me be clear: I&#8217;m not saying this to brag. I&#8217;m saying this because it tells us something important about where AI is going.</p><p>Three companies shipped &#8220;agent on your computer&#8221; in two weeks. Perplexity turned a Mac Mini into a 24/7 AI worker. Meta put Manus on your desktop. Anthropic gave Claude hands, a phone interface, and 50 service connections. This isn&#8217;t hype. This is convergent evolution. Every serious AI lab looked at the same problem and arrived at the same answer.</p><p>The answer is: agents need a home. Not a chat window. A home. A machine they live on, with files they can access, apps they can open, and a way to reach them from your pocket. Memory that persists across sessions. Tasks that run in the background. Integrations with the tools you already use.</p><p>When one of the biggest AI labs ships features that look like what one person built in their spare time, it means the idea is right. The direction is validated.</p><p>Anthropic is packaging it for everyone. Perplexity is selling it as hardware. Meta is giving it away. I&#8217;m building it for myself. Same destination, different paths.</p><p>If you&#8217;re thinking about starting with AI agents, the Claude app is honestly a great place to begin. You&#8217;ll hit its limits eventually (I think you will, at least), but you&#8217;ll learn what matters. <a href="https://thoughts.jock.pl/p/ai-adoption-gap-who-actually-uses-ai-2026">Most companies still can&#8217;t figure out basic AI adoption</a>. The ones who do will be the ones who understood, early, that an AI agent is not a chat window. It&#8217;s a coworker. And coworkers need a desk.</p><p>That&#8217;s progress. And I accept that.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://thoughts.jock.pl/p/claude-cowork-dispatch-computer-use-honest-agent-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/claude-cowork-dispatch-computer-use-honest-agent-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/claude-cowork-dispatch-computer-use-honest-agent-review-2026?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item></channel></rss>