<?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[Confident Commit: Loop Lab]]></title><description><![CDATA[Real experiments. Real code. Real results. Our thinking, experiments, and innovations on AI + CI/CD — grab what you need and start shipping.]]></description><link>https://www.confidentcommit.com/s/loop-lab</link><image><url>https://substackcdn.com/image/fetch/$s_!nIQR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfc0382e-96b7-4183-86b5-c2d29838b081_1024x1024.png</url><title>Confident Commit: Loop Lab</title><link>https://www.confidentcommit.com/s/loop-lab</link></image><generator>Substack</generator><lastBuildDate>Thu, 24 Sep 2026 04:56:22 GMT</lastBuildDate><atom:link href="https://www.confidentcommit.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[CircleCI]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[circleci@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[circleci@substack.com]]></itunes:email><itunes:name><![CDATA[Confident Commit]]></itunes:name></itunes:owner><itunes:author><![CDATA[Confident Commit]]></itunes:author><googleplay:owner><![CDATA[circleci@substack.com]]></googleplay:owner><googleplay:email><![CDATA[circleci@substack.com]]></googleplay:email><googleplay:author><![CDATA[Confident Commit]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Bake low Merge Efficiency Ratio (MER) into the agent loop]]></title><description><![CDATA[How engineering your agent loop for low MER (with inner-loop checks, a CI sneak peek, and a single push) cuts outer-loop CI credits by 5&#8211;6x without adding time or cost.]]></description><link>https://www.confidentcommit.com/p/bake-low-merge-efficiency-ratio-mer</link><guid isPermaLink="false">https://www.confidentcommit.com/p/bake-low-merge-efficiency-ratio-mer</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Tue, 22 Sep 2026 15:01:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b63ee9b1-852e-4892-a1da-d9a560c28bdf_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>CircleCI&#8217;s </span><a href="https://circleci.com/blog/five-takeaways-2026-q2-pulse/"><span>2026 State of Software Delivery Q2 Pulse Report</span></a><span> named the key performance metric we&#8217;re talking about here: </span><strong><span>Merge Efficiency Ratio (MER)</span></strong><span>. How many feature-branch validation cycles does it take to get a change onto main?</span></p><p><span>Median teams sit around </span><strong><span>3.9</span></strong><span>. The top 5% run about </span><strong><span>2.6</span></strong><span>. An elite cohort of twenty orgs is already near </span><strong><span>1.3</span></strong><span>.</span></p><p><span>Most of the industry is still grinding through several rounds of feature-branch rework before earning the right to merge to main. The leaders are closer to one.</span></p><p><span>When coding agents are the ones waiting on those rework cycles, MER is not a vanity metric. It is the clock and the bill. Extra loops mean more tokens burned, more CI credits spent, and more agent context rotting on a red light from CI.</span></p><p><span>The Q2 Pulse Report is blunt: </span><strong><span>lower MER is a DX win, an AX win, and a cost win.</span></strong></p><p><span>I ran a small AFK lab experiment that rhymes with that report. Not an org-level MER study. Same shape of problem, inside a single agent setup.</span></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.confidentcommit.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.confidentcommit.com/subscribe?"><span>Subscribe now</span></a></p><h2><span>Hypothesis</span></h2><p><span>If a green PR is already likely, pushing only once at the end should burn far fewer outer-loop CI credits than pushing after every task. And if deterministic checks live on the inner loop </span><strong><span>once</span></strong><span>, you stop paying time and money three times for the same linter.</span></p><p><span>Pushing once at the end is only safe once the agent can reliably go green.</span></p><h2><span>Setup</span></h2><p><span>In our core experiment to determine </span><a href="https://www.confidentcommit.com/p/cost-of-a-green-pr"><span>the cost of a green PR</span></a><span>, we found that if you give the agent a sneak peek at the CI setup, let it take notes before coding begins, and let it do a practice run on inner-loop checks before pushing to outer-loop CI, you can achieve 100% green PRs with zero rework.</span></p><p><span>The sneak peek is actually quite simple. Before task one, before a line of game code gets written, the agent receives a short inventory of the CI setup: which checks fire on the inner-loop practice run, which jobs fire on the outer-loop CI pipeline, and pointers to the scripts and configs that define them. This information is descriptive, but not an answer key. The agent writes its own notes from that inventory </span><code>preflight.md</code><span>) and can </span><code>@</code><span>-read those configs whenever it wants more. In our codebase, the inventory is a &#8220;CI validation manifest,&#8221; which tells the agent what will be graded and where the grading logic lives, before it starts guessing from vibes.</span></p><p><strong><span>Fix loops drop to zero. Green PRs go to 100%.</span></strong></p><p><span>This piece starts there. Same </span><a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about"><span>AFK Snake game build</span></a><span>. Same seven tasks. Same two cadences, now with the sneak peek on.</span></p><ul><li><p><strong><span>Per-task-push:</span></strong><span> a pipeline after every task. Seven tasks, seven trips.</span></p></li><li><p><strong><span>Single-push:</span></strong><span> finish the stack, clear practice run, push once at the end.</span></p></li></ul><p><span>How often you push is the lever under test. First you have to be equipped to push green.</span></p><p><span>A linter is a linter. Compute is compute, whether it runs on a laptop, in a </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span> microbuild, or in a cloud job financed with CI credits.</span></p><p><span>There is no real reason to run the same deterministic check on localhost, again on the sidecar, and again on the outer-loop CI pipeline, as if three identical stamps make the code more correct.</span></p><p><span>That stack is a relic of human by-hand engineering. A person in flow forgets to run the test suite, pushes red, and we paper over forgetfulness by re-running the universe on every layer. Coding agents do not forget the same way. You can (and should) instruct them to clear inner-loop checks </span><strong><span>before</span></strong><span> they spend a single outer-loop CI credit.</span></p><p><span>In this calibration we moved inner-loop checks fully onto the sidecar and left thick outer-loop CI as the honest final test. Slimming true duplicates on the outer-loop surface is later work. The principle does not wait though: </span><strong><span>do not triple-pay for the same answer.</span></strong></p><h2><span>Results</span></h2><p><span>Headline: once sneak peek made 100% green likely, a single end-of-run push cut estimated CI credits from </span><strong><span>~81 to ~14</span></strong><span>.</span></p><ul><li><p><strong><span>Per-task-push:</span></strong><span> </span><strong><span>7</span></strong><span> pipelines. </span><strong><span>~81.4</span></strong><span> estimated CI credits.</span></p></li><li><p><strong><span>Single-push:</span></strong><span> </span><strong><span>1</span></strong><span> pipeline. </span><strong><span>~14.0</span></strong><span> estimated credits.</span></p></li></ul><p><strong><span>About 5 to 6x fewer CI credits</span></strong><span> on the single-push run.</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HKy-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HKy-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 424w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 848w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 1272w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HKy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png" width="1456" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed489ada-703a-40d0-b076-9b12304c3384_1746x418.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94613,&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://www.confidentcommit.com/i/216368190?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.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_!HKy-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 424w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 848w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 1272w, https://substackcdn.com/image/fetch/$s_!HKy-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed489ada-703a-40d0-b076-9b12304c3384_1746x418.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>Wall-clock stayed in the </span><strong><span>50 to 60 minute</span></strong><span> band either way (55.5 vs 56.7). LLM dollars stayed in the </span><strong><span>$15 to $17</span></strong><span> band (17.15 vs 15.73). Tokens still track agent work. The CI credit collapse comes from the push cadence, not a cheaper model.</span></p><p><span>That bargain only holds when a sneak peek plus inner-loop checks make a 100% green PR likely. If you pile up unproven work and trigger the outer-loop pipeline once cold, you have not saved anything. You have postponed finding out you are red. When that one pipeline fails, you still pay the fix loop, and a retry can pick up new last-mile surprises.</span></p><p><strong><span>Earn one take. Then trigger outer-loop CI once.</span></strong></p><h2><span>TL;DR</span></h2><p><strong><span>Elite engineering teams do not win by loving rework. They win by needing less of it.</span></strong></p><p><span>Think of agent-era validation as a continuum. Inner loop to outer loop, hybrid on purpose. Each check earns its place.</span></p><ul><li><p><strong><span>Deterministic checks live inward:</span></strong><span> cheap, early, once.</span></p></li><li><p><strong><span>World-shaped risk lives outward:</span></strong><span> policy, last-mile, flaky integrations, the CVE that did not exist at 9am. You name it.</span></p></li></ul><p><span>Place each check where its information is unique. Everything else is just another duplicate cost for the same answer.</span></p><p><span>Outer-loop CI should still exist. It is where the world gets a vote. It should not be a museum of jobs you already passed in identical form on the previous two layers of validation.</span></p><p><span>At AFK scale, the inheritance path looks like this:</span></p><ol><li><p><strong><span>Make preventable reds disappear</span></strong><span> (</span><a href="https://www.confidentcommit.com/p/cost-of-a-green-pr"><span>push a /green PR in one take</span></a><span>).</span></p></li><li><p><strong><span>Keep remaining retries cheap</span></strong><span> (use the </span><code>--failure-report</code><span> flag).</span></p></li><li><p><strong><span>Put deterministic checks on the inner loop once.</span></strong><span> Push to outer-loop CI as often as your green rate deserves.</span></p></li></ol><p><span>Once 100% green is something you can count on, pushing only once at the end of the run is an obvious CI credit win.</span></p><p><span>Bake that into your agent setup. Low MER should not be a hero dashboard you inspect after the damage. It should be the default the agent loop was engineered to produce.</span></p><p><span>Rework should be reserved for unknown failures from the real world. Preventable failures should be totally eliminated.</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.confidentcommit.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[We built a new API for AI agents. None of them used it (directly). ]]></title><description><![CDATA[Agents make 97% of their calls against our new agent-friendly API. Not one agent found the API by reading the catalog, the llms.txt or the OpenAPI spec.]]></description><link>https://www.confidentcommit.com/p/we-built-a-new-api-for-ai-agents</link><guid isPermaLink="false">https://www.confidentcommit.com/p/we-built-a-new-api-for-ai-agents</guid><dc:creator><![CDATA[Dan Mullineux]]></dc:creator><pubDate>Tue, 15 Sep 2026 16:11:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bec5e621-0c78-48a5-8808-0aa400b2843f_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Every company with an API has been busy making it AI friendly, with the goal of improving how agents interact with their products. That is part of the advice that big model providers </span><a href="https://www.anthropic.com/engineering/writing-tools-for-agents"><span>suggest</span></a><span>.</span></p><p><span>Our current CircleCI APIs use version numbers in the URLs. V1, V1.1 and V2. They had accumulated four incompatible URL patterns, three ID formats and a different response shape per endpoint, effectively ten years of drift. The pitch for a new API V3 was explicitly about consistency for agents: one URL grammar, UUIDs everywhere, one response envelope, one error shape. An LLM should be able to predict </span><code>/api/v3/{entity}/:id</code><span> from the entity name alone instead of carrying the whole spec in its context.</span></p><p><span>We followed all the current advice on how to make the API discoverable by agents. We published the OpenAPI spec at a stable URL. We added </span><code>/.well-known/api-catalog per RFC 9727</code><span>, so a machine could discover the machine-readable descriptions. We generated an </span><code>llms.txt</code><span> and an </span><code>llms-full.txt</code><span>. We rendered the whole reference as markdown as well as HTML. We put the conventions - error shapes, idempotency, which operations are irreversible - into the spec description so they travel with every entity document, not just the index.</span></p><p><span>This post answers one question: did any of that work?</span></p><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c3Z5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c3Z5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 424w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 848w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 1272w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c3Z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png" width="1456" height="313" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:313,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c3Z5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 424w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 848w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 1272w, https://substackcdn.com/image/fetch/$s_!c3Z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1376e541-4709-4d04-9a8d-eb61f3b148d7_1956x420.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2><span>Hypothesis</span></h2><p><span>My assumption at the outset was that agents would </span><em><span>want to work with</span></em><span> a consistent API, and that they would be able to easily find it.</span></p><p><span>I expected consistency to be the hard part and discovery to be the easy win.</span></p><p><span>Specifically:</span></p><ol><li><p><span>Agents would find V3 on their own through the discovery surface - the catalog, the OpenAPI spec, </span><code>llms.txt</code><span>.</span></p></li><li><p><span>Once they found it, V3&#8217;s consistency would keep them there, because guessing a V3 URL is easier than looking one up in V2.</span></p></li><li><p><span>V2 usage by agents would decline as agents discovered the better option.</span></p></li></ol><p><span>The first and third were wrong in ways more interesting than being right.</span></p><h2><span>Setup</span></h2><p><span>I first proposed building a new consistent API 3 years ago. At the time, it would have been a massive time expenditure likely not worth the investment. But by the time I pitched it again earlier this year, the execution had changed; we could use a swarm of agents with good skills. Agentic workflow enabled us to decide that it was a low enough cost to take on an experiment previously considered to be very high cost, and impacting every team on the org. I got the green light.</span></p><p><span>I tend to be more pragmatic than scientific. I understand the scientific method, but can also plan ahead to mitigate the risks of just diving in and trying things. In the case of the API, although it&#8217;s fairly high risk in some ways, I knew that if we didn&#8217;t publicize it fully, we could always stop and roll back.</span></p><p><span>Every V3 route ingresses through one gateway service. That was a deliberate call made for enforcement reasons, and it is also what makes this measurable: one dataset holds every public API request with its route, method and user agent.</span></p><p><span>After agreeing on the consistent flexible API shape, we built skills internally for teams to use to guide their agents, and within a few months we had V3 APIs in place that could replace 90% of existing API traffic.</span></p><p><span>Measuring agent traffic hitting our API is an inexact science, relying on parsing the User-Agent in the inbound requests.</span></p><p><span>Real strings from production for requests coming in via our CLI:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;dcb7ceee-ffba-41da-ad37-761c3ac94319&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">circleci-cli (darwin/arm64; 1.0.48773; claude-code_2-1-246_agent)
circleci-cli (darwin/arm64; 1.0.48692; codex)
circleci-cli (darwin/arm64; 1.0.48773; opencode)
circleci mcp (755dd082f9ef571f74ac433160ab068e10c9ef25)</code></pre></div><p><span>That is self-reported identity, not inference from traffic shape. If you want to measure agent usage of your own API and you control a client, stamping the harness name into the user agent is the highest-value thing you can do. It costs one line and turns an unanswerable question into a query.</span></p><p><span>Two caveats to keep in mind if you try something similar: An agent that hand-rolls its own HTTP calls is invisible to this method. I checked the bare-HTTP-client population and found roughly 41,000 spans a day where an agent could hide indistinguishably from a shell script (the span counts come from a sampled tracing dataset: the agent-filtered queries returned unsampled, the whole-traffic ones at 1.7&#215; mean sample rate.)</span></p><h2><span>Results</span></h2><p><span>Interestingly, we realized the agents don&#8217;t care about the API directly. Instead, their focus is the MCP and CLI. Having a consistent API made it easier to build a good CLI. It&#8217;s only in this roundabout way that the agents are interested in using the API.</span></p><h3><span>Agents overwhelmingly use V3. But not by migrating.</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Src!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Src!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 424w, https://substackcdn.com/image/fetch/$s_!4Src!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 848w, https://substackcdn.com/image/fetch/$s_!4Src!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 1272w, https://substackcdn.com/image/fetch/$s_!4Src!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Src!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png" width="1276" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:1276,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50168,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.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_!4Src!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 424w, https://substackcdn.com/image/fetch/$s_!4Src!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 848w, https://substackcdn.com/image/fetch/$s_!4Src!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.png 1272w, https://substackcdn.com/image/fetch/$s_!4Src!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae26c2b-2ab2-47ea-b098-375b8fdabe55_1276x378.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Hypothesis 2 confirmed, emphatically. Now the same measurement seven weeks earlier:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zi3D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zi3D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 424w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 848w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 1272w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zi3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png" width="1274" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e380025c-9cb7-4940-84dd-feedd404b589_1274x374.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48797,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.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_!zi3D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 424w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 848w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.png 1272w, https://substackcdn.com/image/fetch/$s_!zi3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe380025c-9cb7-4940-84dd-feedd404b589_1274x374.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>In those seven weeks, agent V3 share went from 57% to 97%. But look at the V2 column: 17,641 to 22,375. V2 agent traffic did not decline. It grew slightly. V3 did not win by converting anyone. It won by absorbing 760,000 calls of agent traffic that did not exist seven weeks earlier.</span></p><p><span>Hypothesis 3 was wrong: the migration story I expected to tell was actually a growth story.</span></p><p><span>For contrast, across all clients including browsers and scripts over that same recent week, V2 still outweighs V3 - 24,067,618 calls against 16,978,477. Humans and legacy integrations have not moved. Agents are a separate population behaving differently.</span></p><h3><span>No agents found the V3 API on its own</span></h3><p><span>Here is the entire discovery surface over thirty days. Every file we published for machines to find:</span></p><p><strong><span>Discovery endpoints &#183; All clients &#183; 30 days to 28 Aug 2026</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eB_K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eB_K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 424w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 848w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 1272w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eB_K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png" width="1276" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1276,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110039,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.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_!eB_K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 424w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 848w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.png 1272w, https://substackcdn.com/image/fetch/$s_!eB_K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c6f1aa-7bef-4fa7-94c3-c1530d45dc88_1276x864.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Agents made 807,209 API calls in a </span><em><span>week</span></em><span>. The entire discovery surface got 6,776 hits in a </span><em><span>month</span></em><span>.</span></p><p><span>Then I broke those 6,776 hits down by user agent, expecting a long tail of coding agents. There are three populations in there, and none of them is the one I was looking for.</span></p><h3><span>Population one: nobody in particular</span></h3><p><span>Crawlers, scanners, and humans</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Amus!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Amus!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 424w, https://substackcdn.com/image/fetch/$s_!Amus!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 848w, https://substackcdn.com/image/fetch/$s_!Amus!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!Amus!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Amus!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png" width="1278" height="1074" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1074,&quot;width&quot;:1278,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162504,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.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_!Amus!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 424w, https://substackcdn.com/image/fetch/$s_!Amus!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 848w, https://substackcdn.com/image/fetch/$s_!Amus!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!Amus!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94b79a3f-0df7-4a74-9baa-c3a2efa07ca2_1278x1074.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>The largest single consumer of </span><code>/.well-known/api-catalog</code><span> is a bot that exists to grade whether your API is agent-ready. We are being audited for agent-readiness by a crawler while the agents themselves never look.</span></p><h3><span>Population two: agents, but only when a human points at them</span></h3><p><span>These are visible and separable, because a directed fetch carries a different user agent than an agent doing its own work:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;49fb25e0-8245-4a5b-9f36-2c1f9e42c8a6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Claude-User (claude-code/2.1.220; +https://support.anthropic.com/)</code></pre></div><p><span>That is Claude Code&#8217;s web fetch, which fires when a person says &#8220;go read this URL&#8221;. Across the whole discovery surface in thirty days it accounts for 23 requests - 6 on the static OpenAPI HTML, 5 on </span><code>/docs/api/v3</code><span>, 4 on </span><code>/fullopenapi.json</code><span>, 4 on </span><code>/.well-known/api-catalog</code><span>, and single hits elsewhere. Two more came from </span><code>Claude-User/1.0</code><span>, the claude.ai equivalent.</span></p><p><span>So the honest version of the finding is not &#8220;no agent has ever read it&#8221;:</span></p><blockquote><p><strong><span>Zero agents read the discovery surface unless a human explicitly directed them to it. Twenty-three times in thirty days, someone did.</span></strong></p></blockquote><p><span>Every one of those 23 was a person (probably one of us) saying &#8220;fetch the catalog&#8221;. Not one was an agent concluding on its own that a catalog might exist and going to look.</span></p><h3><span>Population three: the training and search pipelines</span></h3><p><span>This is the part that gives me some hope. Around 203 of the 6,776 hits are corpus builders and search crawlers:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F2TI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F2TI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 424w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 848w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 1272w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F2TI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png" width="1274" height="642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20655366-5637-496e-8624-3282ff75dcc4_1274x642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77000,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.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_!F2TI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 424w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 848w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.png 1272w, https://substackcdn.com/image/fetch/$s_!F2TI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20655366-5637-496e-8624-3282ff75dcc4_1274x642.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>They are all reading </span><code>/openapi.json</code><span>. The spec </span><em><span>is</span></em><span> being ingested, but just not into a working agent&#8217;s context. It is going into the next generation of training data and the search indexes agents fall back to. The discovery surface is on a much slower clock than I assumed.</span></p><p><span>Which means the optimistic reading of this whole post is available, but it is not the one I would have guessed. It is tempting to hope that the next round of models will start consulting catalogs and </span><code>llms.txt</code><span> properly, the way the standards intend. I do not think that is what will happen. What will happen is that </span><code>GPTBot</code><span> and </span><code>ClaudeBot</code><span> read our </span><code>openapi.json</code><span>, V3 ends up in the weights, and the next generation answers V3 from memory&#8230; exactly the way this generation answers V2 from memory.</span></p><p><span>The fix for stale training data is more training data. The catalog&#8217;s delivery vehicle is the corpus, and the crawler is the courier.</span></p><p><span>So the discovery surface does pay off. Just not as discovery. And the loop it runs on is a model generation long, which is not something you can shorten by publishing harder. The only lever you control on that timescale is still the client.</span></p><h3><span>Why agents don&#8217;t discover: two layers of stale</span></h3><p><span>Watching agents work with our API, the failure has two stages and neither involves discovery.</span></p><h4><span>STAGE 1: Training data answers first</span></h4><p><span>Ask an agent about the CircleCI API and it answers immediately and confidently with V2 shapes - </span><code>/api/v2/project/{project-slug}/pipeline</code><span>, slugs in paths, the old status enum. It is not looking anything up. V2 has been in the corpus for years; V3 has existed for months.</span></p><h4><span>STAGE 2: The search index agrees with the training data</span></h4><p><span>Agents will often announce they are searching the web when they are reaching into training data. When they do genuinely search, the indexes rank a decade of V2 documentation, V2 Stack Overflow answers and V2 blog posts far above anything we published this year. Two independent mechanisms, same wrong answer.</span></p><p><span>And here is the twist that makes discovery standards nearly useless in this shape: by the time an agent finally reaches a spec or a catalog, it already believes it is looking for V2. It arrives with a target. We updated the spec descriptions to say prominently that a newer V3 API exists, and an agent that has decided it needs the V2 pipeline endpoint reads past that to go looking for the V2 pipeline endpoint.</span></p><p><span>An in-context hint only helps a reader who has not yet decided what they are looking for. An agent has always already decided.</span></p><h3><span>What actually moved the traffic</span></h3><p><span>We updated the CLI to use V3, and pointed the built-in MCP server at the same code.</span></p><p><span>My colleague Pete has written up the rebuild this came out of  (</span><a href="https://www.linkedin.com/pulse/rebuilding-circleci-cli-from-scratch-pete-steyert-woods-damje"><span>Rebuilding the CircleCI CLI from scratch</span></a><span>) and it is worth reading alongside this one, because his half of the story is the half that actually moved the numbers below.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_FhB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_FhB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 424w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 848w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 1272w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_FhB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png" width="1274" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65391,&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://www.confidentcommit.com/i/215846886?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.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_!_FhB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 424w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 848w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.png 1272w, https://substackcdn.com/image/fetch/$s_!_FhB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb627bf-49ff-45ba-a30a-b39aff8563ba_1274x414.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Roughly 57% of all CLI traffic to the public API now carries an agent harness stamp. Every one of the 807,209 agent calls arrived through the CLI or the MCP server. None arrived from an agent constructing its own HTTP request.</span></p><p><span>Agents do not discover APIs. They use the tools already in front of them. The CLI is already installed, already authenticated, already on the agent&#8217;s </span><code>PATH</code><span>, and </span><code>--help</code><span> is right there. The MCP server appears in the tool list. Neither requires discovery, a search, or a spec.</span></p><p><strong><span>The lever was never the discovery standard. The lever was the client.</span></strong></p><h2><span>TL;DR</span></h2><p><span>No agent reads your discovery surface unless a human points at it. The catalog, </span><code>llms.txt</code><span> and the OpenAPI spec drew 6,776 hits in a month. Agent reads: 23, every one a directed fetch. Self-directed: zero.</span></p><p><span>Publish it anyway, but price it as a training-data bet. 203 of those hits were GPTBot, ClaudeBot, OAI-SearchBot, PerplexityBot and MistralAI-User. The spec is being ingested, just not into a working agent&#8217;s context.</span></p><p><span>Expect the fix to arrive through the weights, not the standard. The next model generation won&#8217;t consult your catalog. It&#8217;ll just already know your API. That&#8217;s a model-generation-long loop you can&#8217;t shorten by publishing harder.</span></p><p><span>In-context hints only help a reader who hasn&#8217;t decided yet. We put &#8220;there is a newer V3&#8221; in the spec description. An agent that has already concluded it needs a V2 endpoint reads straight past it.</span></p><p><span>Ship the client and the MCP server. 100% of measured agent traffic arrived through a wrapper that was already installed and already authenticated. None of it was hand-rolled HTTP. If you want agents on your new API, update the tools they already have.</span></p>]]></content:encoded></item><item><title><![CDATA[Your CLI docs are too long. Claude stopped reading them. ]]></title><description><![CDATA[The CircleCI CLI had good help text. Claude was only reading the first 40 lines of it.]]></description><link>https://www.confidentcommit.com/p/your-cli-docs-are-too-long-claude</link><guid isPermaLink="false">https://www.confidentcommit.com/p/your-cli-docs-are-too-long-claude</guid><dc:creator><![CDATA[Pete Steyert-Woods]]></dc:creator><pubDate>Tue, 15 Sep 2026 15:46:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/56211d8a-e4b4-43c9-850d-9381db9d08b9_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>I found this in a terminal transcript, not a bug report:</span></p><p><code>$ circleci run trigger --help | head -40</code></p><p><span>I hadn&#8217;t asked for </span><code>head -40</code><span>. Claude added it, and it does that constantly; help output is untrusted input of unknown size, and pulling an unbounded page into a context window is a bad trade. Forty lines </span><em><span>is</span></em><span> the interface. Below line 40 was the part that tells you how to use the command.</span></p><h2><span>Hypothesis</span></h2><p><span>As I </span><a href="https://circleci.com/blog/rebuilding-the-circleci-cli-from-scratch/"><span>shared in a previous blog post</span></a><span>, when I started rewriting the CLI, I already understood we were writing for agents; that was the premise of the rewrite. Every data-returning command has </span><code>--json</code><span> with its fields enumerated, and the command tree generates an MCP server, so each command&#8217;s description </span><em><span>is</span></em><span> a tool description.</span></p><p><span>Two things we didn&#8217;t know:</span></p><ol><li><p><strong><span>We didn&#8217;t know there was a length limit</span></strong><span>, so we never measured against one (&#8221;written for agents&#8221; was a set of content decisions, and none of them had a size).</span></p></li><li><p><strong><span>We didn&#8217;t know</span></strong><span> </span><strong><span>that we were saying everything three times</span></strong><span>: the accepted values for </span><code>--event-preset</code><span>, the default for </span><code>--provider</code><span>, all of it in the examples, in the flag table, and again in the prose. Each section had been written to stand on its own, and nobody diffs a paragraph against a table.</span></p></li></ol><p><span>So the fix wasn&#8217;t &#8220;write less&#8221;. If the length was repetition, most of it would come out mechanically; and if prose went </span><em><span>last</span></em><span>, truncation would cut the cheapest content rather than the most expensive.</span></p><h2><span>Setup</span></h2><p><span>I measured before editing anything, because &#8220;is this help text too long?&#8221; is otherwise a taste argument nobody wins. Walk the command tree, render every page the way a real invocation would, and count. Not total lines, but whether each section </span><em><span>finishes</span></em><span> inside the first 40. A flag table that starts on line 38 isn&#8217;t visible; it&#8217;s a teaser.</span></p><p><span>Across 169 command pages, the mean was 49 lines, the worst 91, and only 15% got their examples inside the window (the section an agent actually copies from).</span></p><p><span>Three passes. </span><strong><span>Boilerplate out:</span></strong><span> the banner, the per-page table re-printing the same four global flags, the repeated &#8220;Learn More&#8221; links. Seventeen lines a page, no prose rewritten. </span><strong><span>Reorder:</span></strong><span> Short &#8594; Usage &#8594; Arguments &#8594; Flags &#8594; Examples &#8594; Details, so truncation eats prose first. </span><strong><span>Trim the duplication</span></strong><span>, never dropping a flag row or an example to make space. </span><code>project trigger create</code><span> went from 91 lines to 42.</span></p><p><span>Then keep it fixed. Order and boilerplate are properties of the help template now; length is a test that asserts every page fits 40 lines, with individual caps for the twenty-five commands that genuinely can&#8217;t, and those caps only ratchet down. And since these commands are largely written by an agent working from guidelines in the repo, the rule went there too.</span></p><p><span>The PR: </span><a href="https://github.com/CircleCI-Public/circleci-cli/pull/1667"><span>https://github.com/CircleCI-Public/circleci-cli/pull/1667</span></a><span>. 449 files, about 2,600 net lines of help text deleted.</span></p><h2><span>Results</span></h2><p><span>The three passes cut both the mean and the worst case, but what really matters is whether the sections an agent actually uses (flag table and the examples) finish rendering before truncation. A page that runs to 70 lines but front-loads its flags is a better interface than a 45-line page that buries them. The reorder pass was designed around this: put the cheap content last, so if something gets cut, it isn&#8217;t the part Claude copies from.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B8lv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B8lv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 424w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 848w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 1272w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B8lv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png" width="1270" height="454" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:454,&quot;width&quot;:1270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60506,&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://www.confidentcommit.com/i/215845162?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.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_!B8lv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 424w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 848w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.png 1272w, https://substackcdn.com/image/fetch/$s_!B8lv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dafbc3-23bc-417f-8b77-50ae00a86085_1270x454.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>No task-success delta, because I don&#8217;t have one. What changed is the interface: every command&#8217;s complete flag list now sits inside the window an agent reads, and three in four get their examples there too, against one in seven before. The old failure mode was silent, which is why it lasted. Claude wasn&#8217;t erroring; it was succeeding at a degraded version of the task on whatever fragment of the flag list it had seen. Worse than a stack trace, because nothing tells you to go and look.</span></p><h2><span>TL;DR</span></h2><p><strong><span>&#8220;Designed for agents&#8221; is a budget, not a style.</span></strong><span> We had the content decisions right and still shipped help that couldn&#8217;t be read, because we never asked how much of it arrives.</span></p><p><strong><span>Pick one canonical place for each fact.</span></strong><span> The duplication wasn&#8217;t sloppiness; it was three self-sufficient sections maintained separately. The flag table is canonical now, and prose restating it is a defect.</span></p><p><strong><span>Make it a test.</span></strong><span> A style guide asking for 40 lines would have lasted a month; the next person adding a command, human or otherwise, has no reason to know the number exists.</span></p><p><span>The pages are better for humans now, which I didn&#8217;t expect; not because agents and people want the same thing, but because neither mistake was agent-specific. Nobody benefits from reading a flag&#8217;s values three times, and nobody was reading line 70 either.</span></p>]]></content:encoded></item><item><title><![CDATA[I ran 10,000+ configs through the compiler in 4 Minutes]]></title><description><![CDATA[How a fleet of 100 Chunk sidecars turned a 10-hour sequential validation job into a 4-minute answer for a customer facing a breaking change.]]></description><link>https://www.confidentcommit.com/p/10000-configs-validated-in-4-minutes</link><guid isPermaLink="false">https://www.confidentcommit.com/p/10000-configs-validated-in-4-minutes</guid><dc:creator><![CDATA[Makoto Mizukami]]></dc:creator><pubDate>Fri, 11 Sep 2026 20:55:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d3900428-e1a6-4dbc-85c2-6ba0e72cc1ca_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>As part of a larger initiative to build next-generation config tooling, </span><a href="https://discuss.circleci.com/t/breaking-changes-config-compilation-updates-september-21-2026/54719"><span>a breaking change was shipped to the config compiler</span></a><span>. The purpose? Stricter and more predictable validation gives us the reliable foundation needed to support more flexible config in the future. The problem? A customer had more than 10,000 config.yml files across their organization, and needed to know how many would break </span><em><span>before</span></em><span> the change went live, not after.</span></p><p><span>At roughly the same time, I&#8217;d been spending time considering how I might be able to use Chunk sidecars for related tasks outside of testing. I wondered: Do sidecars have the potential for a wider application?</span></p><p><span>I&#8217;d say that&#8217;s representative of my style as a whole: When conducting experiments, I don&#8217;t just think about the results, I try to think about new ways of conducting the experiment that can be applied to other experiments in the future to create additional efficiencies.</span></p><p><span>In the case of this specific experiment, I was fairly certain that the problem would be easily divided and conquered by using multiple computational resources. Without that approach, the experiment would be costly and cumbersome. Chunk sidecars provided the best route forward, and resulted in a method that I (and any other CircleCI customer) can replicate within future experiments too.</span></p><h2><span>Hypothesis</span></h2><p><span>Config validation is embarrassingly parallel. Each file is independent. There&#8217;s no shared state, no ordering requirement, no reason one file&#8217;s result should wait on another&#8217;s. If we could distribute validation across a fleet of Chunk sidecars, the wall-clock time should drop to roughly: (time to validate one file) / (number of sidecars running in parallel).</span></p><p><span>The biggest question was how to keep this cost effective from a time expenditure perspective, given that sidecars take about 30 seconds each to spin up. If each sidecar only validated a handful of files before its setup overhead dominated, the fleet wouldn&#8217;t be faster than sequential. It would just be more expensive.</span></p><h2><span>Setup</span></h2><p><span>Chunk sidecars are lightweight remote microVMs that run microbuilds alongside a developer&#8217;s work session. Each one is a full Linux environment: it can run the compiler, execute arbitrary code, and report results back.</span></p><blockquote><p><span>It was important to me to conduct this work in a way the customer could reproduce. Don&#8217;t just trust me &#8211; try the same validation on your end as well to prove that the pipeline won&#8217;t be broken when the change is introduced.</span></p><p><strong>Makoto Mizukami, Senior Field Engineer JAPAC, CircleCI</strong></p></blockquote><p><span>Knowing that the customer wouldn&#8217;t have access to our database (making the experiment potentially costly for them to run themselves) I made sure to use resources that would be available to them as well &#8211; the CircleCI API and CLI.</span></p><p><span>For this experiment, I partitioned the customer&#8217;s 10,000+ configs into batches and assigned each batch to a sidecar. Each sidecar:</span></p><ol><li><p><span>Spun up</span></p></li><li><p><span>Received its batch of projects</span></p></li><li><p><span>Walked through each project to fetch its config through CircleCI API and run it through </span><code>circleci config validate--next</code></p></li><li><p><span>Reported pass/fail results, and failure reasons if any</span></p></li></ol><p><span>The fleet size was 100 sidecars in parallel at maximum. Task orchestration, command dispatches, and result aggregations were all done by a single Claude Code agent session, allowing me to save tokens (unlike Claude subagents, which hungrily consume tokens). The work was instrumented with Honeycomb throughout: 32,359 spans across the full run.</span></p><h2><span>Results</span></h2><p><span>The fleet economics held up. Setup overhead for the 100 sidecars was 2 minutes in total &#8212; small enough that the parallelism paid off at this batch size.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NlrG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NlrG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 424w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 848w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 1272w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NlrG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png" width="1274" height="508" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:1274,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62973,&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://www.confidentcommit.com/i/215282952?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.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_!NlrG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 424w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 848w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.png 1272w, https://substackcdn.com/image/fetch/$s_!NlrG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F157df8f7-105e-4543-b08e-ef48e1853fa4_1274x508.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>One finding worth noting: We also observed some specific patterns in validation failures. For example, certain series of strings tended to raise a validation error. By analyzing the result of the large-scale process further, we were also able to identify some &#8220;template&#8221; projects, from which most of the 120 configs derived.</span></p><p><span>The reason that the setup was reasonably easy was that Chunk sidecars provide snapshots. I could install a basic toolset in the sidecar, take a snapshot and apply the snapshot to the sidecars. Without that, this experiment would be impossible to conduct efficiently.</span></p><h2><span>TL;DR</span></h2><p><span>Embarrassingly parallel tasks don&#8217;t need clever algorithms. They need an environment that can run many agents at once. The compiler logic didn&#8217;t change. The validation logic didn&#8217;t change. What changed was the execution model: instead of one process working through a queue, a fleet of processes each worked through a slice.</span></p><p><span>Running them sequentially would have taken hours. A Chunk sidecar fleet did it in 4 minutes.</span></p><p><span>The thing to check before you do this: Make sure each agent knows exactly what its job is. Per-agent setup costs compound. If your task is trivial and your setup is heavy, the fleet won&#8217;t help. In this case, validation was fast enough and setup was cheap enough that the math worked. Instrument it first and check.</span></p><p><span>The customer got their answer before the breaking change shipped. It was an answer we could never have gotten in a timely manner without the massive parallelism Chunk sidecars offered. It proved my hypothesis that Chunk sidecars have multiple uses, and aren&#8217;t just limited to testing. As it turns out, sidecars are well implemented so that agents can easily leverage and consume the data, making them a perfect vehicle for experiments like this one.</span></p><p><span>We complain a lot about AI agent output. But we need to be thinking more about how we&#8217;re setting our agents up for success, and whether we&#8217;re providing them with sufficient power to do their job. Sidecars are one of the best ways to prepare agents to do great work.</span></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[Pencils down: The cost of a green PR]]></title><description><![CDATA[Giving a coding agent a pre-run inventory of exactly what CI will check eliminated fix loops, driving green commit rates to 100% and rework cost to $0 on all predictable failures.]]></description><link>https://www.confidentcommit.com/p/cost-of-a-green-pr</link><guid isPermaLink="false">https://www.confidentcommit.com/p/cost-of-a-green-pr</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Fri, 11 Sep 2026 20:36:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d9a141e1-c2e8-4787-b2ab-8b6347a68619_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Imagine a student who must score </span><strong><span>100%</span></strong><span> on a final exam to pass a course. Not an A-. That would fail them. They can retake the exam as many times as they want, and every attempt comes back with painfully detailed feedback.</span></p><p><span>Then suppose that same student could peek at the test in advance and take notes.</span></p><p><span>One catch. The sneak peek does not include any of the last-minute trick questions that might show up on the real exam without warning. Those get written by &#8220;</span><strong><span>the world&#8221;</span></strong><span> the moment the exam starts.</span></p><p><span>Nobody on the teaching staff knows the trick questions in advance, and new ones can show up on a retry.</span></p><p><strong><span>Pencils down.</span></strong></p><p><span>That is coding agents and CI. Merge-ready green is the only passing grade. Outer-loop CI is the real final exam. A </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span> is the timed practice run. Every red&#8594;green fix loop (diagnose, patch, push again) charges a little tuition: LLM dollars, CI credits, wall-clock.</span></p><p><span>I wanted to know what a green PR actually costs on a fully-automated AI coding agent run. Time. Tokens. Credits. The whole bill.</span></p><p><span>We moved the needle a bit on time and tokens. Fine. Not the story.</span></p><p><span>The story is rework going to </span><strong><span>zero</span></strong><span> on the stuff we can predict. Deliver the PR in </span><strong><span>one take</span></strong><span>. Ace it at </span><strong><span>100%</span></strong><span>. The only red you should tolerate is the unknowable.</span></p><h2><span>Hypothesis</span></h2><p><span>If you show the agent what CI will check </span><strong><span>before it writes product code</span></strong><span>, give it a page of notes, and make it pass a real practice run on a sidecar, preventable outer-loop failures should stop showing up. Fix loops should not be necessary. Green commits should hit 100%.</span></p><p><span>Not &#8220;prompt harder.&#8221; Setup for success. Ace it at 100%. One take.</span></p><h2><span>Setup</span></h2><p><span>In this lab, an A- is still red. Local lint that smiled while outer-loop CI frowned still fails. A green sidecar run that dies on the real pipeline still fails.</span></p><p><span>Two cadences. Same bar: </span><strong><span>every commit you push to outer-loop CI is green.</span></strong></p><ul><li><p><strong><span>Per-task-push:</span></strong><span> after each task clears practice run, push. Seven tasks, seven trips. Ace every one.</span></p></li><li><p><strong><span>Single-push:</span></strong><span> finish the stack, clear practice run, push once at the end. Ace that one.</span></p></li></ul><p><span>How often you push is a later lever. First you have to be equipped to push green.</span></p><h3><span>Without the sneak peek</span></h3><p><span>Three calibrations on the same AFK classic </span><a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about"><span>Snake</span></a><span> game build. Seven tasks. Hands off the keyboard.</span></p><p><span>No inventory of checks up front. No notes. Inner-loop checks existed, but they were split between the localhost and a sidecar.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ECcB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ECcB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 424w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 848w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 1272w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ECcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png" width="1456" height="448" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:448,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:112566,&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://www.confidentcommit.com/i/215272612?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.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_!ECcB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 424w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 848w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.png 1272w, https://substackcdn.com/image/fetch/$s_!ECcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2253dc7f-6d05-4ad4-b566-344f1ef80338_1762x542.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>They finished, but rework kept piling up. When we feed agents endless retries and mountains of feedback, we&#8217;re just repeating the same habits we once drilled into human developers, now adopted by their AI counterparts.</span></p><p><strong><span>*NOTE:</span></strong><span> We can make retries cheaper with a structured CI pipeline </span><code>--failure-report</code><span>, but that is </span><a href="https://www.confidentcommit.com/p/we-cut-25-of-tokens-fixing-ci"><span>its own write-up</span></a><span>. Spoiler: even if you cheapen input tokens on each retry, you still have to pay time and money to retry.</span></p><h3><span>Then we showed it the test</span></h3><p><span>Before task one, before a line of game code, the agent got a short inventory: which checks fire on the practice run, which jobs fire on the thick outer pipeline, and pointers to the scripts and configs that define them. Descriptive. Not an answer key.</span></p><p><span>It took notes (</span><code>preflight.md</code><span>). It could @-read those configs when it needed more.</span></p><p><span>In our codebase that inventory is a &#8220;CI validation manifest&#8221;, which basically tells the agent what will be graded, and where the grading logic lives, </span><strong><span>before</span></strong><span> it starts guessing from vibes.</span></p><p><span>Inner-loop checks moved fully onto the sidecar, and we stopped running the same exact lint and test loops on the localhost. Outer-loop CI stayed the honest final exam, including whatever the world still wanted to throw at it.</span></p><h2><span>Results</span></h2><p><span>Headline: </span><strong><span>0 CI fix loops</span></strong><span> on both sneak-peek arms.</span></p><ul><li><p><span>Per-task-push: </span><strong><span>7/7</span></strong><span> pushed commits green.</span></p></li><li><p><span>Single-push: the one end-of-run push went green on first contact.</span></p></li></ul><p><strong><span>Zero</span></strong><span> outer-loop CI failures on either arm.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!15ib!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!15ib!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 424w, https://substackcdn.com/image/fetch/$s_!15ib!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 848w, https://substackcdn.com/image/fetch/$s_!15ib!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 1272w, https://substackcdn.com/image/fetch/$s_!15ib!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!15ib!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png" width="1456" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160292,&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://www.confidentcommit.com/i/215272612?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.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_!15ib!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 424w, https://substackcdn.com/image/fetch/$s_!15ib!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 848w, https://substackcdn.com/image/fetch/$s_!15ib!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.png 1272w, https://substackcdn.com/image/fetch/$s_!15ib!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3961a3ef-dc72-49ec-ae2e-e7a94676d2b5_1752x758.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Diagnosis tokens on the rework line: </span><strong><span>$0</span></strong><span>. That budget can fund first-pass product code generation instead of burning LLM dollars and CI credits on red -&gt; green archaeology.</span></p><p><span>Wall-clock did not collapse. Still about </span><strong><span>50 to 60 minutes</span></strong><span>. Coding time dominated. LLM dollars landed about </span><strong><span>$15 to $17</span></strong><span>, in line with earlier attempts. The key difference: </span><strong><span>rework nearly disappeared.</span></strong></p><p><span>Quiet rework is the same muscle </span><strong><span>Merge Efficiency Ratio</span></strong><span> names in CircleCI&#8217;s </span><a href="https://circleci.com/blog/five-takeaways-2026-q2-pulse/"><span>State of Software Delivery Q2 Pulse</span></a><span> report: how many validation cycles before a change is actually done. This lab is that problem inside one agent setup. Once green is likely, push cadence and where you place the checks are how you bake low MER into the loop.</span></p><h2><span>TL;DR</span></h2><p><strong><span>A coding agent can only prevent what we can predict. Say that out loud.</span></strong></p><p><span>Linters. Unit tests. Typechecks. Formatters. Lockfile rules. Contract tests you already wrote. The deterministic stuff with a known answer. If it is on the syllabus, the agent can study it, practice it, and clear it before you spend an outer-loop credit.</span></p><p><strong><span>It cannot prevent what the world invents after the peek is printed.</span></strong></p><p><span>Late-breaking CVEs mid-run. A registry serving a different tarball than the one you resolved an hour ago. A base image that rotated overnight. An org policy that fails a dependency you did not touch. A flaky third-party API. A secrets scanner lighting up on a fixture. A new advisory. A mirror outage. A quota. Runner drift. &#8220;Works on my machine&#8221; that is really the cloud&#8217;s clock, certs, or DNS.</span></p><p><span>Platform engineers, harness authors, and coding agents cannot predict this. It arrives when the CI pipeline is already running.</span></p><p><span>Design for what the agent can own. Leave outer-loop CI in place for the rest. Ideally one take. At most two, once the world gets a vote.</span></p><p><span>Build the agent setup so it can ship the application end-to-end with </span><strong><span>zero CI failures from known deterministic sources</span></strong><span>.</span></p><p><span>Inventory of checks. Notes. A practice surface that is real (sidecar, not theater). Then push.</span></p><p><span>Do not &#8220;prompt harder&#8221; and hope the fix loop works overtime.</span></p><p><strong><span>One take. Let&#8217;s go.</span></strong></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[We cut 25% of tokens fixing CI. Here’s how]]></title><description><![CDATA[It used to be that an agent, when handed a failed CI run, spent many turns just figuring out what broke. Here&#8217;s how we changed that.]]></description><link>https://www.confidentcommit.com/p/we-cut-25-of-tokens-fixing-ci</link><guid isPermaLink="false">https://www.confidentcommit.com/p/we-cut-25-of-tokens-fixing-ci</guid><dc:creator><![CDATA[Joaquin Sandoval]]></dc:creator><pubDate>Mon, 31 Aug 2026 21:13:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/de0d1e5d-8650-49a2-9f7d-d2b9d0834641_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>When I joined CircleCI in December of 2025, Chunk was already in GA. At the time, we were testing its ability to offer PRs to fix broken builds. But we had 2 big problems: people weren&#8217;t using it, and the people who were, weren&#8217;t really merging the fixes that Chunk provided for their broken pipelines.</span></p><p><span>We wanted to understand: How effective was Chunk? Was there something we could do to improve the fixes given to the users? And perhaps most importantly, was there a way to improve the accessibility of the failure data to agents?</span></p><p><span>We tested the effectiveness in a controlled eval benchmark to measure the actual impact. The same dataset, the same model (claude-sonnet-5), against three different setups: no CLI, CLI with free use, and CLI with </span><code>--failure-report</code><span>. Here is what we found.</span></p><h2><span>The context</span></h2><p><span>Our first experiments were designed to mimic how Chunk works: giving it a file, then a generic prompt written by the team (for example &#8220;you are a coding agent, you need to solve this error&#8221; etc). Essentially at the beginning, we were trying to change the prompt to see if the fixes improved, and if giving certain instructions, steps, or validations would move the needle. The reality? The prompt didn&#8217;t seem to matter much.</span></p><p><span>Our team was constantly reading blog posts from other AI or CI/CD companies about what they were doing to solve this problem, and eventually we came across a </span><a href="https://arxiv.org/abs/2506.03691"><span>paper by Bytedance</span></a><span>. The paper shared that when cleaning log output, most of it is useless so the best thing to do is focus on the part of the log that contains the error.</span></p><p><span>We began to wonder: How do we remove the unnecessary characters and do a diff between the good and bad logs? That was the first successful experiment that gave us good results. It followed the way Chunk works. Because of that, we released the API of step output condensed. You fetch the output of a failed step and process to clean it, so you give better context to the agent.</span></p><p><span>From there, our focus eventually moved away from Chunk and toward the inner loop. We redesigned the experiment to mimic the usual developer flow.</span></p><blockquote><p><span>&#8220;I thought: &#8216;</span><em><span>If I was a dev working on a project and my pipeline failed, how would I fix it with an agent? Probably by copying the pipeline URL and giving it to an agent to fix. I saw that it had to follow a lot of steps to get to the pipeline output. The agent has context to the pull request, but it doesn&#8217;t necessarily have sufficient context.</span></em><span>&#8217;&#8221;</span></p><p><strong><span>Joaquin Sandoval Miramontes, Senior Software Engineer, CircleCI</span></strong></p></blockquote><h2><span>Hypothesis</span></h2><p><span>The hypothesis we arrived at was this: CI failure data is structured for humans reading a dashboard: status icons, log streams, nested UI. An agent working from that raw output burns context on navigation before it can start fixing. Therefore, restructuring the same data for agent consumption should reduce diagnostic turns and get the agent to fix faster.</span></p><h2><span>Setup</span></h2><p><span>I always try to do experiments in a structured fashion. I want to make sure that I have a way to repeat my own results over and over, and I&#8217;m particular about designing experiments with a hypothesis, expected results, and conclusions &#8211; I try to follow the scientific process wherever possible.</span></p><p><span>So here&#8217;s what we tried.</span></p><p><strong><span>New flag:</span></strong><span> </span><code>circleci run get [run_id] &#8211;failure-report</code></p><p><strong><span>Output format:</span></strong><span> condensed, organized [workflow &#8594; job &#8594; step], showing only what failed. Built for piping directly into an agent&#8217;s context window.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;90728749-9581-4595-a89b-4a48c72ddc87&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">circleci run get [run_id] --failure-report | claude "fix the failing workflow"</code></pre></div><p><span>We compared three conditions on the same real failed pipelines from production:</span></p><ul><li><p><span>An agent given authenticated access to the CircleCI API</span></p></li><li><p><span>An agent given free use of the CircleCI CLI</span></p></li><li><p><span>An agent given access to the CircleCI CLI instructed to use --failure-report command</span></p></li></ul><h2><span>Results</span></h2><p><span>Efficiency</span></p><p><span>The flag delivers real efficiency gains:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1a8F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1a8F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 424w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 848w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 1272w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1a8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png" width="1294" height="574" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:574,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90540,&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://www.confidentcommit.com/i/213612700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.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_!1a8F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 424w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 848w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.png 1272w, https://substackcdn.com/image/fetch/$s_!1a8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c7fb8c6-22f5-4378-be5f-e017406d49a8_1294x574.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Agents using --failure-report spent fewer turns overall and finished faster. The CLI-only variant used the most turns and tokens due to agents navigating the CLI tool chain to resolve which job failed.</span></p><h4><span>Fix Quality</span></h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JuOA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JuOA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 424w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 848w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 1272w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JuOA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png" width="1308" height="244" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:244,&quot;width&quot;:1308,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35061,&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://www.confidentcommit.com/i/213612700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.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_!JuOA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 424w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 848w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 1272w, https://substackcdn.com/image/fetch/$s_!JuOA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F471f5d23-c4e6-40a8-8803-ba1d970c450f_1308x244.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>Fix quality is flat across all variants. Fix rate difference is within the regular variation across agentic runs.</span></p><h2><span>TL;DR</span></h2><p><span>It used to be that an agent, when handed a failed CI run, spent many turns just figuring out what broke. The problem: the failure data was there, it just wasn&#8217;t accessible by an agent. The new command </span><code>circleci run get [run_id] &#8211;failure-report</code><span> changes that.</span></p><p><span>Previously, the agent was taking too many steps to get to the error itself, so we summarized it into one line. More context for the agent means better fixes, and spending less.</span></p><blockquote><p><span>&#8220;If you have repeated tasks for your agent, give them tools to get it done faster. Don&#8217;t make your agent do 3-4 things before it gets started.&#8221; <br></span><strong><span>Joaquin Sandoval Miramontes, Senior Software Engineer, CircleCI</span></strong></p></blockquote><p><span>The same failure data, restructured for agent consumption, changes how efficiently the agent works. The agent still needs to gather context from the source files, understand the failure and write the fix. What it no longer needs to do is spend 4-5 turns navigating a log hierarchy to find the failing step.</span></p><p><span>The practical conclusion: </span><strong><span>agents using </span></strong><code>--failure-report</code><strong><span> reach the same fixes in about &#8531; less time and &#188; fewer tokens. At scale, given thousands of CI fixes per day, that efficiency difference is real.</span></strong></p><p><em><span>Has your team run any similar experiments? What have you learned about restructuring failure data for agent consumption? We&#8217;d love to hear from you in the comments below.</span></em></p><div><hr></div><p><em><span>Data: 84 real CI failures from CircleCI. Model: claude-sonnet-5. Quality Judge Model: Claude-opus-4.6.</span></em></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[I asked Grok 4.6 and Sonnet 5 to fix failed CI pipelines. CircleCI was the judge.]]></title><description><![CDATA[Grok 4.6 went 6 for 6 fixing broken CI pipelines at $0.22 a fix; Claude Sonnet 5 at max effort went 3 for 6 at $1.11 &#8212; and the expensive model's supposed terminal advantage never materialized.]]></description><link>https://www.confidentcommit.com/p/grok-4-vs-claude-sonnet-5-fix-failed-ci-pipelines</link><guid isPermaLink="false">https://www.confidentcommit.com/p/grok-4-vs-claude-sonnet-5-fix-failed-ci-pipelines</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Wed, 26 Aug 2026 23:06:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ee1ccebf-c02c-4c54-95f5-8391ec483ca6_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Your pipeline goes red. You hand it to an agent. It reads the logs, writes you a confident paragraph about what broke, edits the config, triggers a rerun. You pay for every token of that loop whether CI comes back green or not.</span></p><p><span>That loop runs on my machine most days. I wanted a cheaper version of it, and I had a specific idea about where the savings were hiding.</span></p><p><span>So I broke six CircleCI pipelines on purpose. Then I saved one specific failed run of each, so every model would stare at the exact same wreck. Three AI coding setups, one instruction: fix this.</span></p><p><span>Grok 4.6 fixed all six. Twenty-two cents a fix.</span></p><p><span>Claude Sonnet 5, turned all the way up, fixed three. Every fix it did land cost about $1.11.</span></p><p><span>I walked in looking for the opposite result. The chatter said Grok would be the one to stumble on the terminal work.</span></p><h2><span>What I was actually hunting</span></h2><p><span>A routing rule, which is a boring thing with a boring name: a policy for which model gets which wreck. Teams already do this with humans. The YAML typo goes to whoever&#8217;s on rotation. The bash failure that&#8217;s been red since Tuesday goes to the one person who can actually read a wait loop. I wanted that same escalation in software, with a price tag on it. Hard shell problems to the expensive model, broken config and missing test results to the cheap one. Same quality of fix, smaller bill at the end of the month.</span></p><p><span>The stake is your inner loop. Every time an agent picks up a red pipeline, reads the logs, edits the config, triggers a run, and reads that too, somebody is getting billed. Running all of it on the expensive model, all week, is a line item.</span></p><p><strong><span>That split never showed up.</span></strong></p><p><span>What did show up is a way to measure this stuff without fooling myself. I connected </span><a href="https://cli.circleci.com/"><span>CircleCI&#8217;s command line tools</span></a><span> to both Claude Code and Cursor. I saved a red run, so nobody could grade a different pipeline than the one I picked. Then I refused to grade the model&#8217;s essay for a proposed fix. By &#8220;essay&#8221; I mean the model&#8217;s written diagnosis of what broke and what it would change, which is a completely different thing from whether CircleCI actually went green.</span></p><p><span>Agents are already good at the essay. </span><strong><span>The actual pipeline rerun is the score.</span></strong></p><p><span>The essay is the menu. Green CI is the meal. I came to eat.</span></p><h2><span>Hypothesis</span></h2><p><span>I expected Grok 4.6 to struggle on the bash-flavored failures and hold its own everywhere else.</span></p><p><span>That was the prediction. I went in with a bias: if any model was going to struggle on shell, it would be Grok 4.6 once it had to drive a terminal. Type a command, read what came back, adjust, type the next one. Shell breakage is exactly that, over and over, so that&#8217;s where I thought a gap would show.</span></p><p><span>If the reputation held, the plan was already written. Sonnet 5 at </span><code>effort: low</code><span> takes the bash cases, Grok takes the rest, and I pay less without shipping worse fixes.</span></p><p><span>Second question, cheaper to ask and just as useful: does paying for Sonnet 5 at </span><code>effort: high</code><span> buy enough extra passes to justify the receipt?</span></p><h2><span>Setup: six puzzles, three setups, one judge</span></h2><p><span>The puzzles came from the </span><a href="https://github.com/felixshiftellecon/CircleCI-Training-Koans"><span>CircleCI Training Koans</span></a><span>, a public set of short exercises that break a pipeline on purpose so you can practice un-breaking it. I used six on a throwaway project, two per flavor of broken.</span></p><p><span>Three flavors went in. Broken config, where the pipeline file itself is wrong. Tests that don&#8217;t report, where the tests genuinely run and pass but CircleCI never receives the results, so the job looks fine and tells you nothing. And shell problems: bash logic, wait loops, cache commands, container images, services.</span></p><p><span>Then I froze them: one saved failed run per puzzle, so &#8220;whatever failed most recently&#8221; couldn&#8217;t sneak in and change the question halfway through.</span></p><p><span>Three setups, same prompt every time.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EHuI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EHuI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 424w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 848w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 1272w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EHuI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png" width="1296" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1296,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95956,&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://www.confidentcommit.com/i/212915417?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.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_!EHuI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 424w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 848w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.png 1272w, https://substackcdn.com/image/fetch/$s_!EHuI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c01035b-504d-4957-a7a4-d7fbcdda8475_1296x582.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Those dollar figures are sticker rates for tokens, not the cost of a run. What each trial actually spent shows up in Results.</span></p><p><strong><span>Changed:</span></strong><span> the setup. </span><strong><span>Held constant:</span></strong><span> the saved failed run, the prompt, the isolation, the spend ceiling.</span></p><p><span>Every trial started in a fresh clone. No resumed sessions. Sonnet never got to peek at what Grok had already worked out, and the two Sonnet effort settings didn&#8217;t share a session either. Each agent had to check its config change, then trigger a brand new CircleCI run on its own throwaway branch. Never </span><code>main</code><span>. Never the saved branch.</span></p><p><strong><span>Now the grade, which is the part that maps to your actual day.</span></strong><span> Nobody merges the model&#8217;s write-up. You merge green CI. So a trial passes only if the pipeline that agent triggered finished green. On the tests-that-don&#8217;t-report puzzles, a green job with an empty test results panel (CircleCI&#8217;s Test Summary) is still a fail, because tests that pass without reporting anything back aren&#8217;t a fix. Afterward I re-checked every run against CircleCI&#8217;s own record, so the numbers below come from CircleCI and not from an agent&#8217;s summary of its own brilliance.</span></p><p><span>I capped spending too. I watched the expensive setup burn money during calibration, took its 95th percentile, and set the ceiling at </span><strong><span>$1.25</span></strong><span> so a trial could go long without going stupid. Claude Code can hard-stop at that number. Cursor writes it down and keeps going.</span></p><p><span>Claude dollars are whatever Claude Code billed for the whole session, including the Haiku 4.5 helper that sometimes rides along. Grok dollars are tokens in and out times the published rate, not an invoice from Cursor.</span></p><p><span>One honest wrinkle: model and host are welded together here. Sonnet only runs on Claude Code, Grok 4.6 only on Cursor CLI. I can&#8217;t pull those apart, and I&#8217;d rather say it out loud than bury it in a footnote.</span></p><p><span>Eighteen isolated trials. Then a repeat round on the same six puzzles, then one genuinely messy red Playwright job. Three separate scoreboards, and averaging them would only make the numbers look tidier than the evidence is.</span></p><h2><span>Results</span></h2><p><span>The pilot, scored the day it ran.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yctk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yctk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 424w, https://substackcdn.com/image/fetch/$s_!yctk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 848w, https://substackcdn.com/image/fetch/$s_!yctk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 1272w, https://substackcdn.com/image/fetch/$s_!yctk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yctk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png" width="1278" height="602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1278,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78785,&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://www.confidentcommit.com/i/212915417?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.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_!yctk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 424w, https://substackcdn.com/image/fetch/$s_!yctk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 848w, https://substackcdn.com/image/fetch/$s_!yctk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.png 1272w, https://substackcdn.com/image/fetch/$s_!yctk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0888c543-1b5b-4871-b4b6-6a5f8d4c8db0_1278x602.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>All three greened both </span><strong><span>shell</span></strong><span> puzzles. The terminal gap I came hunting for never showed.</span></p><p><span>One puzzle was a config file so mangled that CircleCI rejected it before any job started. That&#8217;s why the original run was red: nothing ran at all. Fixing it meant repairing the file, triggering a new pipeline, and getting that new pipeline green. Only Grok&#8217;s new run went green. Sonnet at </span><code>effort: low</code><span> spent the entire $1.25 cap on that one puzzle and got cut off. Sonnet at </span><code>effort: high</code><span> failed it too.</span></p><p><span>Separately, Sonnet at high effort missed both puzzles where the tests ran but CircleCI never received the results. Zero for two.</span></p><p><span>I ran the same six puzzles a second time. Fresh start, no memory of the first try. Grok fixed all six again. Add both tries together and Grok is 12 for 12, Sonnet at low effort is 9 for 12, Sonnet at high effort is 7 for 12. Same homework twice. I wanted to know if Grok just got lucky on Monday. It didn&#8217;t.</span></p><p><span>Then the follow-up. I cloned a Playwright job that had been going red over and over, again a throwaway, not production. The bug was a locator: </span><code>getByText</code><span> matched both a heading and a button, so the test found two things where it wanted one and refused to guess.</span></p><p><span>All three models got that one pipeline green. One try each. Nobody deleted tests. Nobody touched </span><code>.circleci/config.yml</code><span>. Every one of them edited the Playwright test and switched to </span><code>getByRole(&#8221;heading&#8221;, ...)</code><span>. Inside each green job, CircleCI&#8217;s test results panel listed six Playwright tests, and all six passed.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1H3b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1H3b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 424w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 848w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 1272w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1H3b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png" width="1284" height="402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:402,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53625,&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://www.confidentcommit.com/i/212915417?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.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_!1H3b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 424w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 848w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.png 1272w, https://substackcdn.com/image/fetch/$s_!1H3b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb19b493a-91bc-45bb-a333-0b8aab45af56_1284x402.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Grok was the cheapest and the slowest. High effort and low effort wrote the same fix. One case, three trials, which makes it an anecdote, and I&#8217;m labeling it one.</span></p><h2><span>TL;DR</span></h2><p><span>I didn&#8217;t get a routing policy. Two puzzles per flavor of broken is nowhere near enough to write a company rule about where your model budget goes. Grok held the shell cases, too. And paying for </span><code>effort: high</code><span> didn&#8217;t buy extra passes. On these puzzles it bought fewer.</span></p><p><span>What I did get is a test that refuses to lie to me. </span><strong><span>Most evals grade what the model wrote. This one waits for CircleCI to finish, then takes the verdict from the run itself.</span></strong><span> Execution-graded, meaning CircleCI&#8217;s pass or fail is the grade, not a rubric and not the model&#8217;s own confidence.</span></p><p><span>If you&#8217;re wiring agents into CI, that distinction is the entire ballgame.</span></p><p><strong><span>Cheap can win when execution is the judge.</span></strong><span> Twenty-two cents a successful fix against $1.11 isn&#8217;t a brand story. It&#8217;s a 5x token bill, on this lab set, every time an agent tries to get a red pipeline green. I&#8217;m not going to invent your volume. A team of ten, five of those loops a week, is about $45 extra to pay for high effort instead of Grok. That&#8217;s the unit. Not a finance-team emergency. Still a 5x.</span></p><p><span>I evaluate models for a living. Then I have to evaluate the eval.</span></p><p><span>Scoring a write-up is asking somebody how they feel. Scoring a CI pipeline rerun is taking their actual blood pressure.</span></p><p><a href="https://www.confidentcommit.com/p/we-let-an-ai-agent-say-i-passed-was"><span>RalphCI already showed that green on your laptop isn&#8217;t green in CI</span></a><span>. This one asks the ruder follow-up: hand an agent the logs, the </span><a href="https://cli.circleci.com/"><span>CircleCI tools</span></a><span>, and one saved red run, and can it actually fix the pipeline? On this lab set, yes. Often. The expensive knob wasn&#8217;t the reason.</span></p><p><span>I&#8217;m not saying always use Grok instead of Sonnet. Hosts behave differently, Cursor can&#8217;t enforce a dollar cap, and these were clean training puzzles plus one Playwright locator.</span></p><p><span>I&#8217;m saying this: </span><strong><span>if your agent loop can&#8217;t trigger a rerun and read the test results panel, you&#8217;re grading the menu instead of the meal.</span></strong></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[What snake games have taught us about shipping with AI agents]]></title><description><![CDATA[Five months of Loop Lab Snake builds trace a path from AFK Ralph loops to 100% green PRs and 3x faster CI feedback. Same benchmark, four breakthroughs.]]></description><link>https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about</link><guid isPermaLink="false">https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Wed, 10 Jun 2026 21:39:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43bc3749-17a2-4672-856e-5ff7eff0b2fc_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Back in January, I wired up a </span><a href="https://ghuntley.com/loop/"><span>Ralph loop</span></a><span> to build Snake games and started dabbling in AFK development, with appropriate levels of human supervision, as needed.</span></p><p><span>Five months later, I am still coding the same game of Snake. Now 100% AFK, with much more confidence than when I started. Zero human supervision.</span></p><p><span>The first half of 2026 has been fun, but not in the arcade sense. It has been fun in the </span><strong><span>&#8220;I haven&#8217;t touched my keyboard in twenty minutes, and every check on the branch is green&#8221;</span></strong><span> sense. We kept building the same Snake game. Same 20x20 grid. Same arrow keys. Same TDD spec. Same retro aesthetic.</span></p><p><strong><span>The game has barely changed, but the delivery loop has changed everything.</span></strong></p><p><span>If you have been watching the AI agent hype cycle from a safe distance, here is the compressed version of what we learned by staying stubbornly on one benchmark: </span><strong><span>you can go AFK with rising confidence, greener pull requests, and faster feedback than we have ever measured. Not by trusting the agent more. By giving it better and quicker back-pressure at each layer of validation.</span></strong></p><h2><span>The benchmark nobody asked for (but everybody needed)</span></h2><p><span>Snake is a toy. That is the point.</span></p><p><span>A toy spec is small enough to run ten times in a week. Small enough to isolate one variable at a time. Small enough that when something breaks, you can actually read the diff instead of drowning in a monorepo.</span></p><p><span>We gave agents the same task repeatedly: build a playable Snake game from scratch using test-driven development (TDD). Seven tasks. Canvas rendering. Collision detection. Score tracking. Push commits. Open a PR. Walk away.</span></p><p><span>Every run finished locally. Every agent said the tests passed. Every game worked on the laptop and was pretty fun to play.</span></p><h2><span>January: everything is a Ralph loop</span></h2><p><span>In January, Geoffrey Huntley published </span><a href="https://ghuntley.com/loop/"><span>everything is a ralph loop</span></a><span>. The mindset shift is not &#8220;use AI to type faster.&#8221; It is &#8220;program the loop.&#8221;</span></p><p><span>Allocate a goal. Run the loop. Watch the failures. Fix the failure domain so it never happens again. Repeat until done or until you hit CTRL+C and take the wheel back.</span></p><p><span>Basic Ralph loops can build software and generate PRs AFK. That part worked decently well (with some light human supervision).</span></p><p><strong><span>The PR at the end might be green. It might be red. The agent does not inherently know which until something external tells it.</span></strong></p><p><span>We were building Snake games in loops before we had a name for what we were doing.</span></p><p><span>The lesson from January: </span><strong><span>autonomy without validation is just faster guessing.</span></strong></p><h2><span>February: does the pipeline agree with local tests?</span></h2><p><span>By February we had data, not vibes, on whether the pipeline agreed.</span></p><p><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>Our first study</span></a><span> ran ten controlled Snake builds. Same spec. Same model scaffolding. One variable: five runs wired to CircleCI through </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span>, five runs without.</span></p><p><span>All ten agents completed every task. All ten passed local tests. All ten declared victory.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ntek!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ntek!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 424w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 848w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 1272w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ntek!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png" width="1292" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1292,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40760,&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://www.confidentcommit.com/i/212608969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.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_!Ntek!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 424w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 848w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.png 1272w, https://substackcdn.com/image/fetch/$s_!Ntek!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa53aec79-ecb9-4d0d-adec-ad1fc6283b30_1292x344.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Eighty percent of the no-CI runs shipped code the pipeline rejected. The failure was mundane: single quotes where ESLint wanted double quotes. Local tests do not check lint rules. CI does. The gap between &#8220;works on my machine&#8221; and &#8220;works in your pipeline&#8221; is where agents lie with confidence.</span></p><p><span>RalphCI fixed that by injecting real pipeline status into the agent loop after push. When CI failed, a CI Doctor agent read the logs, applied fixes, and pushed again. Twelve failures across five runs. Twelve autonomous fixes. Zero human triage.</span></p><p><span>The breakthrough in February: </span><strong><span>agentic loops with CI back-pressure can land green PRs AFK.</span></strong><span> The final PR passes CI. Commits inside that PR might still fail along the way. Red commits on the branch. Green at the end. Progress, not perfection.</span></p><h2><span>Early May: every commit has to be green</span></h2><p><span>Three months later we hit the next failure domain.</span></p><p><span>Local pnpm test:run kept passing on my Mac. </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecars</span></a><span> kept failing on Linux. Missing LEGAL_DISCLAIMER.md. Missing SNAKE.md experiment marker. A TypeScript compile error the Snake workspace&#8217;s local tests never exercised but a full pnpm build caught.</span></p><p><span>Same pattern, five runs in a row. Local green. Sidecar red. CI Doctor lands a </span><code>fix(ci-sidecar):</code><span> commit. Sidecar green. Push allowed. </span></p><p><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>Our early May study</span></a><span> wired Chunk sidecars into RalphCI&#8217;s Review Gate. A sidecar is a lightweight remote microVM: your workspace syncs there, Chunk runs a microbuild that mirrors your pipeline intent, and you get CI-shaped feedback before the branch leaves your laptop.</span></p><p><strong><span>Five Snake builds. Five 100% green PRs. Every commit green. Not just the last one.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vnzw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vnzw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 424w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 848w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 1272w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vnzw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png" width="1304" height="474" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:474,&quot;width&quot;:1304,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62245,&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://www.confidentcommit.com/i/212608969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.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_!vnzw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 424w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 848w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.png 1272w, https://substackcdn.com/image/fetch/$s_!vnzw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffed4a882-9898-4a8a-aef2-35a59e7f972a_1304x474.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>I had not touched the keyboard in twenty minutes. The final PR (and every commit on it) was green anyway.</span></p><p><strong><span>This screenshot is what HIGH CONFIDENCE looks like.</span></strong></p><p><span>The May breakthrough: </span><strong><span>three validation layers (local, sidecar, pipeline) produce PRs where humans review green branches only.</span></strong><span> Sidecars catch CI-shaped failures while the agent still has context. CircleCI remains the authority at merge time. </span><strong><span>Sidecars extend CI into the inner loop. They do not replace it.</span></strong></p><h2><span>Late May: deliver the same green outcome, faster</span></h2><p><span>100% Green PRs answered &#8220;can we merge with confidence?&#8221; A follow-up experiment asked &#8220;how fast can we merge with confidence?&#8221;</span></p><p><a href="https://loop.circleci.com/the-sidecar-race-22-seconds-vs-69-seconds-inside-the-agent-loop"><span>Our late May study</span></a><span> ran the same ten Go tasks two ways on </span><code>chunk-cli:</code><span> sidecar validation per iteration versus commit-push-poll CircleCI per iteration. Same agent. Same model. Same gate jobs </span><code>lint</code><span> and </span><code>test</code><span>). Different machinery.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XYxh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XYxh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 424w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 848w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 1272w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XYxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png" width="1292" height="328" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:328,&quot;width&quot;:1292,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46259,&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://www.confidentcommit.com/i/212608969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.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_!XYxh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 424w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 848w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.png 1272w, https://substackcdn.com/image/fetch/$s_!XYxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0183c3-7fe3-4dd3-b150-c6ab5d06504a_1292x328.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Sixty-nine seconds. Every iteration. Five replicates in a row. That is not random noise in our harness. That is the queue tax on push-per-task CI.</span></p><p><span>Twenty-two seconds on a warmed sidecar snapshot. Same question: are lint and test happy right now? Same answer. Different delivery speed.</span></p><p><span>Token spend was flat because in this particular experiment tokens tracked fixes, not wait. The CI arm burned more clock time, not more intelligence, so sidecars did not shrink the LLM bill here. They shrunk idle time. On a ten-task run that is roughly eight minutes of gate-waiting saved before the final pipeline epilogue.</span></p><p><span>The May speed breakthrough: </span><strong><span>you still want an outer loop.</span></strong><span> Sidecar runs finished with a full ci workflow epilogue after one push. Fast inner loop on each task, authoritative pipeline confirmation at the end. Not sidecar-only cowboy coding. Not push-and-pray either.</span></p><h2><span>Four layers, one arc</span></h2><p><span>Strip away the Snake skin and the arc looks like this:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!szuq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!szuq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 424w, https://substackcdn.com/image/fetch/$s_!szuq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 848w, https://substackcdn.com/image/fetch/$s_!szuq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 1272w, https://substackcdn.com/image/fetch/$s_!szuq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!szuq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png" width="1284" height="636" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75991a28-536e-4f63-92f1-79661f53e883_1284x636.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:636,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123775,&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://www.confidentcommit.com/i/212608969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.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_!szuq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 424w, https://substackcdn.com/image/fetch/$s_!szuq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 848w, https://substackcdn.com/image/fetch/$s_!szuq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.png 1272w, https://substackcdn.com/image/fetch/$s_!szuq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75991a28-536e-4f63-92f1-79661f53e883_1284x636.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>We are not gaining more AFK confidence because we trust agents more (although the models have improved since January). We are gaining more AFK confidence because each failure domain we hit got engineered out of the loop. And we&#8217;ve even unleashed some speed gains along the way.</span></p><p><strong><span>Watch the loop.</span></strong><span> That is </span><a href="https://ghuntley.com/loop/"><span>Huntley&#8217;s line</span></a><span> and it is the whole game.</span></p><ul><li><p><a href="https://ghuntley.com/loop/"><span>January</span></a><span> taught us to program the AFK agent loop.</span></p></li><li><p><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February</span></a><span> taught us the agent&#8217;s &#8220;I passed&#8221; is local theater without CI.</span></p></li><li><p><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>Early May</span></a><span> taught us that 100% green PRs are possible, given sidecar validation before commit and push.</span></p></li><li><p><a href="https://loop.circleci.com/the-sidecar-race-22-seconds-vs-69-seconds-inside-the-agent-loop"><span>Late May</span></a><span> taught us that 100% green PRs are still the prize, and sidecars get us there faster than push-per-task CI.</span></p></li></ul><p><span>Snake games did not teach us that AI writes good code. They taught us </span><strong><span>where validation has to live</span></strong><span> when the coder is an agent loop and the reviewer is still a human with a merge button.</span></p><h2><span>What I am actually doing with this</span></h2><p><span>I am obviously not shipping Snake to production. (Unless you&#8217;ve been craving retro gaming experiences. </span><a href="https://www.linkedin.com/in/ryanehamilton/"><span>DM me.</span></a><span>)</span></p><p><span>I am shipping the stack: </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span> orchestration, Review Gate with local checks plus Chunk sidecar validation, CI Doctor for autonomous repair, CircleCI as the outer loop authority. Same pattern we pressure-tested on a toy game because toys fail fast and teach faster.</span></p><p><span>Four layers, one arc. Program the loop. Wire in CI back-pressure. Validate on sidecars before push. Maintain CI pipeline authority at the end.</span></p><p><span>Each layer kills a failure domain the last one missed. Confidence climbs. PRs go greener. Feedback gets faster. The human at the merge button only reviews green.</span></p><p><span>That is what five months of the same Snake game bought us.</span></p><p><strong><span>Green CI is still priceless. Everything else is noise.</span></strong></p><h2><span>Where to read the lab reports</span></h2><ul><li><p><a href="https://ghuntley.com/loop/"><span>everything is a ralph loop</span></a><span> (Geoffrey Huntley, Jan 2026)</span></p></li><li><p><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>We Let an AI Agent Say &#8220;I Passed.&#8221; Was It Actually Good?</span></a><span> (Feb 2026)</span></p></li><li><p><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>AFK Builds with 100% Green PRs</span></a><span> (May 2026)</span></p></li><li><p><a href="https://loop.circleci.com/the-sidecar-race-22-seconds-vs-69-seconds-inside-the-agent-loop"><span>The Sidecar Race: 22 Seconds vs 69 Seconds</span></a><span> (May 2026)</span></p></li></ul><p><span>More Snake runs coming. Heavier repos. Flakier tests. Parallel agents. Improved CLI. Better agent-facing APIs. You name it.</span></p><p><strong><span>The benchmark stays small on purpose, and we intend to scale the lessons as we go.</span></strong></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[The sidecar race: 22 seconds vs 69 seconds inside the agent loop]]></title><description><![CDATA[A controlled A/B in chunk-cli: same lint+test gates, sidecar remote validate vs push-per-task CI. Median time to signal 3.1x faster on sidecar; LLM costs relatively flat.]]></description><link>https://www.confidentcommit.com/p/the-sidecar-race-22-seconds-vs-69</link><guid isPermaLink="false">https://www.confidentcommit.com/p/the-sidecar-race-22-seconds-vs-69</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Thu, 28 May 2026 21:38:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f0e18f88-a5df-4c61-8ef3-ba21a7e423d2_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><span>Sixty-nine seconds.</span></strong> That is how long the agent waited, again, for CircleCI to answer a question it had already asked nine times that run: did <code>lint</code> and <code>test</code> pass?</p><p><strong><span>Twenty-two seconds</span></strong><span> is what the other arm averaged for the same question on a </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span>.</span></p><p><span>Same repo. Same ten Go tasks. Same Claude Agent SDK edits. Same gate jobs. Different loop.</span></p><p><span>Three weeks ago I published </span><a href="https://www.confidentcommit.com/p/afk-builds-with-100-green-prs-chunk"><span>AFK Builds with 100% Green PRs</span></a><span>. Five Snake games. </span><a href="https://loop.circleci.com/hardening-ralphci-loops-for-open-source-after-the-february-2026-study"><span>RalphCI</span></a><span> orchestration. Sidecars in the Review Gate so agents stopped feeding red commits to GitHub. </span><strong><span>Green PRs were the win.</span></strong></p><p><span>This follow-up is narrower and, I think, more revealing for anyone running agents today: </span><strong><span>not whether sidecars help you merge green, but how fast the agent gets CI-shaped feedback while the file is still open.</span></strong></p><p><span>I kicked the tires on sidecars again.</span></p><p><strong><span>They are fast.</span></strong></p><p><span>Not a much cheaper agent. A less idle one. Token spend was flat in this particular experiment (more on that later).</span></p><p><strong><span>The win was clock time.</span></strong></p><h2><span>Hypothesis</span></h2><p><span>If each agent task is validated with </span><code>chunk sidecar sync</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span><span>plus </span><code>chunk validate --remote</code><span> </span><code>lint</code><span> and </span><code>test-changed</code><span>) instead of </span><strong><span>commit &#8594; push &#8594; poll CircleCI</span></strong><span> for the same </span><code>lint</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span><span>and </span><code>test</code><span> jobs, then:</span></p><ol><li><p><strong><span>Median time to signal (TTS)</span></strong><span> per iteration will be materially lower on the sidecar arm.</span></p></li><li><p><strong><span>LLM cost</span></strong><span> will be similar (same agent, same ten prompts, same model fixing the same mistakes).</span></p></li><li><p><strong><span>CircleCI still matters</span></strong><span> for pipeline-level confirmation (sidecar runs end with a full </span><code>ci</code><span> workflow epilogue after one final push).</span></p></li></ol><p><span>I expected push-per-task CI to pay a queue tax every iteration. However, I did not expect the median to land on </span><strong><span>69 seconds five replicates in a row</span></strong><span>.</span></p><h2><span>Setup</span></h2><p><strong><span>Repo:</span></strong></p><ul><li><p><a href="https://github.com/CircleCI-Public/chunk-cli"><span>CircleCI-Public/chunk-cli</span></a></p></li><li><p><a href="https://github.com/CircleCI-Public/chunk-cli/pull/370"><span>Experiment PR #370</span></a></p></li></ul><p><strong><span>Tasks:</span></strong><span> Ten cumulative edits on a small Go fixture </span><code>internal/racefixture/</code><span> on experimental run branches).</span></p><p><strong><span>Replicates:</span></strong><span> Five labels </span><code>001&#8211;005</code><span>) per arm. </span><strong><span>10 recorded runs total.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xocf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xocf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 424w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 848w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 1272w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xocf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png" width="1294" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89884,&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://www.confidentcommit.com/i/212614385?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.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_!Xocf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 424w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 848w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.png 1272w, https://substackcdn.com/image/fetch/$s_!Xocf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7922abaf-06d7-486a-a570-52da64e589f8_1294x540.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>Metric:</span></strong><span> </span><strong><span>TTS</span></strong><span> = wall-clock seconds from iteration start until both gates report pass/fail (logged in </span><code>results.csv</code>`<span>).</span></p><p><span>CircleCI CTO </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Rob Zuber</span></a><span> frames this as </span><strong><span>rebalancing inner and outer loop validation</span></strong><span>. My </span><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>May post</span></a><span> showed the outcome layer (green PRs). This post measures the </span><strong><span>wait layer</span></strong><span>.</span></p><h2><span>Results</span></h2><h3><span>Headline: median time to signal</span></h3><p><span>Aggregate: </span><strong><span>median of per-run medians</span></strong><span> across five replicates.</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!44NO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!44NO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 424w, https://substackcdn.com/image/fetch/$s_!44NO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 848w, https://substackcdn.com/image/fetch/$s_!44NO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 1272w, https://substackcdn.com/image/fetch/$s_!44NO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!44NO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png" width="1286" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:1286,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40253,&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://www.confidentcommit.com/i/212614385?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.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_!44NO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 424w, https://substackcdn.com/image/fetch/$s_!44NO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 848w, https://substackcdn.com/image/fetch/$s_!44NO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 1272w, https://substackcdn.com/image/fetch/$s_!44NO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F827048fb-b286-404e-8cdf-4b0b8b823726_1286x306.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Five replicates at a glance</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HogY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HogY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 424w, https://substackcdn.com/image/fetch/$s_!HogY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 848w, https://substackcdn.com/image/fetch/$s_!HogY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 1272w, https://substackcdn.com/image/fetch/$s_!HogY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HogY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png" width="1294" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52852,&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://www.confidentcommit.com/i/212614385?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.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_!HogY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 424w, https://substackcdn.com/image/fetch/$s_!HogY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 848w, https://substackcdn.com/image/fetch/$s_!HogY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.png 1272w, https://substackcdn.com/image/fetch/$s_!HogY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c0a0a62-6ac0-4469-946d-d3c8e636b7c9_1294x468.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Sidecar clustered </span><strong><span>20&#8211;22s</span></strong><span>. CI sat on </span><strong><span>69s</span></strong><span> every time. That stability is either a real push-and-queue signature in our harness or a coincidence at lab scale. I am reporting it, not universalizing it.</span></p><p><strong><span>p95 TTS:</span></strong><span> sidecar ~23&#8211;25s; CI ~72&#8211;99s (tails worse on push-per-task).</span></p><h3><span>LLM cost comparison explained</span></h3><p><span>The speed table is not the only controlled comparison in this harness. Token spend is measured the same way: same model </span><code>claude-sonnet-4-20250514</code><span>), same ten tasks, same agent, same fix-and-retry pattern. </span><strong><span>We changed the validation path, not the work.</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!diOQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!diOQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 424w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 848w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 1272w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!diOQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png" width="1292" height="272" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:272,&quot;width&quot;:1292,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32682,&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://www.confidentcommit.com/i/212614385?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.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_!diOQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 424w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 848w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 1272w, https://substackcdn.com/image/fetch/$s_!diOQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F464ad48b-301e-4e6a-86ad-7e7c39c1fe96_1292x272.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>Both arms hit the </span><strong><span>same lint and test failures</span></strong><span> and applied the </span><strong><span>same corrections</span></strong><span>. Sidecar surfaced them via </span><code>chunk validate --remote</code><span> on the warmed snapshot (~22s median). The CI arm surfaced them after push to GitHub and a </span><strong><span>~3&#215; longer</span></strong><span> wait for the same gate jobs (~69s median). Same signal, different delivery speed.</span></p><p><span>That is why token spend landed flat. </span><strong><span>Tokens track fixes, not wait.</span></strong><span> The CI arm cost more clock time, not more tokens. Sidecars did not shrink the LLM bill here because there was nothing to shrink: identical failure set, identical agent work on both arms. On a messier repo, especially if remote CI surfaces failures the sidecar doesn&#8217;t mirror, token spend might diverge. This harness didn&#8217;t test that.</span></p><p><span>So treat </span><strong><span>~$0.90 per run</span></strong><span> as what this harness actually cost for this specific experiment, not a budget for production agent loops. Whether faster feedback trims token burn on messier work and CI failure modes (i.e. given fewer stale-context retries, less thrash, and less environment drift) is a follow-on question for a future study (coming soon). This race did not answer it.</span></p><p><strong><span>This experiment answers a narrow question cleanly: when the agent does the same fixes either way, faster feedback does not change token spend. It changes how long the agent sits idle.</span></strong></p><h3><span>Same gate jobs. Different machinery.</span></h3><p><span>We timed the same </span><strong><span>question</span></strong><span> on both arms: did </span><code>lint</code><span> and </span><code>test</code><span> pass? We did </span><strong><span>not</span></strong><span> run identical validation. Sidecar answers via </span><code>chunk validate --remote</code><span> on a warmed-up Linux snapshot. CI answers via real CircleCI jobs after you push.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MGSu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MGSu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 424w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 848w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 1272w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MGSu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png" width="1286" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1286,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:145190,&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://www.confidentcommit.com/i/212614385?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.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_!MGSu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 424w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 848w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.png 1272w, https://substackcdn.com/image/fetch/$s_!MGSu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5298c8af-80b5-47e9-84cb-68a3851551a2_1286x744.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Early iterations on both arms still saw </span><strong><span>lint failures</span></strong><span> while the agent fixed mistakes (about two failing lint iters per run in the rollup). The race is not &#8220;sidecar never fails.&#8221; It is </span><strong><span>how long you wait to learn</span></strong><span>.</span></p><p><span>Illustrative lab math only: ten tasks &#215; ~47s saved &#8776; </span><strong><span>~8 minutes less gate-waiting per replicate</span></strong><span> before the sidecar epilogue. Your mileage will vary.</span></p><h2><span>Takeaway</span></h2><p><strong><span>Green PRs are the outcome. Time to signal is the throttle.</span></strong></p><p><span>The </span><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>May experiment</span></a><span> showed sidecars help agents </span><strong><span>stop polluting branches</span></strong><span> with commits CI would reject. This one shows why that matters in wall clock terms: </span><strong><span>the coding agent is not stuck in queue while context goes cold.</span></strong></p><p><span>What held across ten runs in </span><a href="https://github.com/CircleCI-Public/chunk-cli"><span>chunk-cli</span></a><span>:</span></p><ol><li><p><strong><span>Sidecars save feedback latency</span></strong><span> on mirrored gate jobs (~3.1&#215; median TTS here).</span></p></li><li><p><strong><span>LLM spend was flat</span></strong><span> (~$4.64 sidecar vs ~$4.73 CI) in the same apples-to-apples comparison: same failures, same fixes, CI just took ~3&#215; longer to surface them. Tokens track fixes, not wait.</span></p></li><li><p><strong><span>Push-per-task CI is a predictable wait</span></strong><span> in this harness (69s median, every replicate).</span></p></li><li><p><strong><span>You still want an outer loop.</span></strong><span> Sidecar runs finished with a </span><strong><span>full ci workflow</span></strong><span> epilogue. Fast inner loop on each task, plus an authoritative pipeline confirmation at the end. Not sidecar-only cowboy coding.</span></p></li></ol><p><strong><span>Please re-read #4 above: I am not at all suggesting you delete your CI pipelines.</span></strong><span> Quite the opposite: I am saying that if your agent loop is </span><strong><span>push &#8594; wait &#8594; fix &#8594; push again</span></strong><span>, you are paying for that wait </span><strong><span>every iteration</span></strong><span>.</span></p><p><span>Sidecars moved the same exact question to a local, warmed-up Linux snapshot...</span></p><p><strong><span>QUESTION:</span></strong><span> </span><em><span>Are lint and test happy on this repo right now?</span></em></p><p><span>...and the same answers came with a much tighter feedback loop. </span><strong><span>3.1&#215; faster.</span></strong></p><h2><span>What&#8217;s Next</span></h2><ul><li><p><span>Combine this harness with </span><a href="https://loop.circleci.com/hardening-ralphci-loops-for-open-source-after-the-february-2026-study"><span>RalphCI</span></a><span> orchestration (</span><a href="https://loop.circleci.com/afk-builds-with-100-green-prs-chunk-sidecars-inside-the-agent-loop"><span>Snake outcome study</span></a><span> + TTS race in one stack).</span></p></li><li><p><span>Heavier repos, flaky tests, parallel agents. Find where Chunk sidecars and snapshot sync stops winning.</span></p></li><li><p><strong><span>Agent economics at scale</span></strong><span>: cost per green iteration (LLM + validation path), not just TTS. A proper cohort study on heavier repos, not extrapolated from this ten-run table alone.</span></p></li><li><p><span>Demo recordings on various Chunk sidecar and snapshot sync setups. </span><a href="https://www.youtube.com/watch?v=P99Bk8bQRsA&amp;list=PL9GgS3TcDh8xdRpucbu7Y7dq6lTlx7Pju"><span>Stay tuned!</span></a></p></li></ul><p><strong><span>Artifacts:</span></strong></p><ul><li><p><a href="https://github.com/CircleCI-Public/chunk-cli/blob/sidecar-race-05-27-2026/experiments/sidecar-race/FINDINGS.md"><span>FINDINGS.md</span></a></p></li><li><p><a href="https://github.com/CircleCI-Public/chunk-cli/pull/370"><span>Experiment PR #370</span></a></p></li></ul><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[AFK builds with 100% green PRs (Chunk Sidecars inside the agent loop)]]></title><description><![CDATA[Five RalphCI Snake game builds with Chunk sidecars in the Review Gate: AFK agent loops, pre-push CI parity, and 100% green pull requests end-to-end.]]></description><link>https://www.confidentcommit.com/p/afk-builds-with-100-green-prs-chunk</link><guid isPermaLink="false">https://www.confidentcommit.com/p/afk-builds-with-100-green-prs-chunk</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Tue, 19 May 2026 21:27:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3a5c2264-5668-42fb-adf2-f56ce84adb0b_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><span>I had not touched the keyboard in twenty minutes. CI pipeline #1205 was green anyway.</span></strong><span> An agent had built </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>another Snake game</span></a><span> from our standard Loop Lab benchmark while I stayed out of the way. My local Review Gate failed three times first, each time on a </span><strong><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a></strong><span> check, not merely on my local lint-and-test run. All before a single push to GitHub.</span></p><p><strong><span>If sidecars are new to you, a </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span> is a lightweight remote microVM that sits in your inner loop.</span></strong><span> Your workspace syncs there, Chunk runs a </span><strong><span>microbuild</span></strong><span> (lint, tests, build, and the repo policy hooks you configured), and you get CI-shaped feedback on Linux before your branch leaves the laptop.</span></p><p><span>CircleCI CTO </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Rob Zuber</span></a><span> describes the goal as </span><strong><span>rebalancing inner and outer loop validation</span></strong><span> so agents are not learning about failures only after push.</span></p><p><span>Our three early sidecar failures were unrelated. First, a missing </span><code>LEGAL_DISCLAIMER.md</code><span> at the repo root (legal policy gate). Second, a missing </span><code>SNAKE.md</code><span> marker file in the experiment workspace (documentation policy gate). Third, a TypeScript compile error the Snake workspace&#8217;s local tests never exercised but the sidecar&#8217;s full </span><code>pnpm build</code><span> caught.</span></p><p><span>All three times, the lint-and-test run on my Mac localhost said green, but the red Chunk sidecar said &#8220;fix this stuff.&#8221; CI Doctor landed one </span><code>fix(ci-sidecar)</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">:</span><span> commit per issue. Only then did my local Review Gate allow a push to GitHub.</span></p><p><strong><span>That is a small lab story. We think it is a bigger CI story.</span></strong></p><p><strong><span>We humbly believe we are building toward the future of continuous integration in the agent era: validation woven through the whole loop, ending on a 100% green pull request you can merge with confidence.</span></strong></p><p><span>Local lint and tests first. A </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span> microbuild that partially mirrors your pipeline while the agent still has context. Then CircleCI on the branch, doing what CI has always done, checking integration before a human approves merge.</span></p><p><strong><span>AFK application builds that land as 100% green PRs</span></strong><span> are what we can demo today. The thesis underneath: </span><strong><span>CI validation that keeps up with the pace of your local coding agents.</span></strong></p><p><span>We ran five Snake game builds to pressure-test that future. What follows is the lab report.</span></p><h2><span>Hypothesis</span></h2><p><span>If RalphCI runs </span><a href="https://circleci.com/blog/chunk-sidecars/"><span>Chunk sidecar</span></a><span> validation </span><code>chunk validate --remote</code><span>) after local </span><code>lint:fix</code><span> and </span><code>test:run</code><span>, then:</span></p><ol><li><p><span>A coding agent can run </span><strong><span>mostly unattended</span></strong><span> through build and fix cycles (while a CI Doctor agent handles sidecar and pipeline failures locally).</span></p></li><li><p><strong><span>Commits that pass the local Review Gate and push to GitHub</span></strong><span> show up on the branch as a </span><strong><span>100% green PR</span></strong><span>: with every mirrored CI pipeline passing on the branch.</span></p></li><li><p><strong><span>CircleCI remains the authority at merge time.</span></strong><span> Sidecars extend CI into the inner loop; they do not replace it.</span></p></li></ol><p><span>Our </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February 10 study</span></a><span> already showed CI-aware RalphCI can get to </span><strong><span>green pipelines</span></strong><span> on this Snake benchmark when the agent answers to CircleCI after push. This experiment adds </span><strong><span>pre-push CI parity</span></strong><span> via sidecars so the PR itself is green top to bottom, and not just at the end of the PR.</span></p><h2><span>Setup</span></h2><p><strong><span>Benchmark:</span></strong><span> Five independent runs in </span><code>ralph-ci/experiments/w_chunk-sidecars/iteration-{1..5}/</code><span>. Same Snake spec as </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>prior Loop Lab RalphCI work</span></a><span>: 7 tasks, Vitest TDD, canvas game.</span></p><p><strong><span>The stack (from top to bottom):</span></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PseB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PseB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 424w, https://substackcdn.com/image/fetch/$s_!PseB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 848w, https://substackcdn.com/image/fetch/$s_!PseB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 1272w, https://substackcdn.com/image/fetch/$s_!PseB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PseB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png" width="1294" height="684" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:684,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122574,&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://www.confidentcommit.com/i/212613134?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.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_!PseB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 424w, https://substackcdn.com/image/fetch/$s_!PseB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 848w, https://substackcdn.com/image/fetch/$s_!PseB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.png 1272w, https://substackcdn.com/image/fetch/$s_!PseB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6340503-58ae-4145-bbae-94a61d1d3547_1294x684.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>Chunk mirrors CI:</span></strong><span> </span><code>.chunk/config.json</code><span> runs policy gates </span><code>--gate-legal</code>,<span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span><code>--gate-snake</code><span>) plus remote pnpm lint, </span><code>pnpm test:run</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">, </span><code>pnpm build</code><span>, matching CircleCI jobs on the branch.</span></p><p><strong><span>Sample size:</span></strong><span> 5 runs. Lab notebook scale.</span></p><h2><span>Results</span></h2><h3><span>Five runs at a glance</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vbRv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vbRv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 424w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 848w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 1272w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vbRv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png" width="1280" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95097,&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://www.confidentcommit.com/i/212613134?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.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_!vbRv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 424w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 848w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.png 1272w, https://substackcdn.com/image/fetch/$s_!vbRv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb11718a0-7833-41ea-a82c-b06daa24828c_1280x710.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>Totals:</span></strong><span> 57 RalphCI iterations, </span><strong><span>16 sidecar repair loops</span></strong><span>, </span><strong><span>5/5</span></strong><span> runs ended with all tasks complete and </span><strong><span>green CircleCI on the branch</span></strong><span>.</span></p><p><span>Source: </span><code>iteration-*/metrics.json</code><span> and </span><code>activity.md</code><span>.</span></p><h3><span>Local green is not PR green</span></h3><p><strong><span>Every run, early iterations:</span></strong><span> Review Gate fails on </span><strong><span>Chunk sidecar</span></strong><span>, not local lint-and-test run. On all runs, the first three sidecar fixes were: restore </span><code>LEGAL_DISCLAIMER.md</code><span> (legal gate), add the </span><code>SNAKE.md</code><span> experiment marker file (documentation gate), then fix a </span><code>tsc</code><span> error in </span><code>run-ci.ts</code><span> surfaced by the monorepo build step.</span></p><p><span>Same pattern across runs: failures local tests never see. CI Doctor agent fixes them without a human in the loop. Only then does the local Review Gate allow a push to GitHub.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eqGd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eqGd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 424w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 848w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 1272w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eqGd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png" width="1284" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56590,&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://www.confidentcommit.com/i/212613134?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.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_!eqGd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 424w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 848w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.png 1272w, https://substackcdn.com/image/fetch/$s_!eqGd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F376faeb2-04d1-4ce7-b011-af3e5a34c75d_1284x356.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>After the sidecar gate cleared, pushes stayed green on CircleCI. All CircleCI pipelines passed upon push to remote. No surprise reds on mirrored work.</span></strong></p><h3><span>Compared to our February baseline</span></h3><p><span>On </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>the same Snake benchmark without sidecars in the Review Gate</span></a><span>, agents often finished locally while the branch still failed CircleCI.</span></p><p><span>With sidecars before push plus CI on the branch, </span><strong><span>five for five</span></strong><span> ended as </span><strong><span>100% green PRs</span></strong><span> in our runs: build, lint, policy gates, and test jobs all passing on the merge target after push to GitHub.</span></p><p><span>The continuous integration breakthrough is </span><strong><span>three layers</span></strong><span>: </span><strong><span>local, sidecar, pipeline</span></strong><span>. AFK works when failure shows up in layer two, so layer three confirms instead of contradicts.</span></p><h2><span>Takeaway</span></h2><p><a href="https://circleci.com/blog/chunk-sidecars/"><span>Rob Zuber</span></a><span> framed inner-loop validation for agents. RalphCI plus Chunk sidecars are one way to </span><strong><span>wire that into an orchestration loop</span></strong><span> so AFK does not mean &#8220;ship and pray.&#8221;</span></p><p><span>What held across five Snake game builds:</span></p><ol><li><p><strong><span>Sidecars catch CI-shaped failures</span></strong><span> while the agent still has context.</span></p></li><li><p><strong><span>A 100% green PR needs three layers:</span></strong><span> local, sidecar, pipeline. Skip one, get surprised downstream.</span></p></li><li><p><strong><span>Humans review green branches ONLY.</span></strong><span> They rarely see red, not even on a single commit.</span></p></li></ol><p><strong><span>Green CI is still priceless.</span></strong><span> Chunk sidecars are how you earn a 100% green PR before you even ask a human to look, and a green PR instills more confidence in the agent&#8217;s work than a red one.</span></p><h2><span>The artifact: a 100% green PR ready for review</span></h2><p><span>This is the outcome we care about. A </span><strong><span>pull request</span></strong><span> an agent built while I was AFK, with </span><strong><span>every last CircleCI check green</span></strong><span> on the branch after push to GitHub.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o-eJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o-eJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 424w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 848w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 1272w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o-eJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png" width="1002" height="1278" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1278,&quot;width&quot;:1002,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:391834,&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://www.confidentcommit.com/i/212613134?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.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_!o-eJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 424w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 848w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.png 1272w, https://substackcdn.com/image/fetch/$s_!o-eJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386eed52-166c-45c4-b348-1643740e9b82_1002x1278.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Twelve commits on the branch. Task work, three fix(ci-sidecar): repairs, finalize, metrics. At the bottom of the page: </span><strong><span>All checks have passed</span></strong><span>. Five green jobs:</span></p><ul><li><p><code>ci/circleci: build</code></p></li><li><p><code>ci/circleci: lint</code></p></li><li><p><code>ci/circleci: require-legal-disclaimer-md</code></p></li><li><p><code>ci/circleci: require-snake-md</code></p></li><li><p><code>ci/circleci: test</code></p></li></ul><p><span>No conflicts with base. </span><strong><span>Merge pull request</span></strong><span> is the honest end state.</span></p><p><span>That screenshot is what we mean by </span><strong><span>AFK builds and 100% green PRs</span></strong><span>: every CircleCI check green before a human opens the branch, because validation ran local, then on a Chunk sidecar, then on the pipeline, and the agent fixed failures in between.</span></p><p><span>Five Snake game builds proved the workflow. In future runs, we may expand the repo complexity and scope, and the review gates along with it, to see how far we can push this thesis.</span></p><p><span>But we will keep the overall stack, because we humbly think that this is where continuous integration is going.</span></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[Team onboarding buddy: Claude code skills vs the Wiki maze]]></title><description><![CDATA[We packaged team onboarding as Claude Code plugin skills with MCP-backed checks. The finding is simple: routing plus verification beats another stack of wiki pages.]]></description><link>https://www.confidentcommit.com/p/team-onboarding-buddy-claude-code</link><guid isPermaLink="false">https://www.confidentcommit.com/p/team-onboarding-buddy-claude-code</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Tue, 12 May 2026 21:16:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/859b98cd-3185-40eb-aae0-29577e81db3d_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Some teams live on a </span><strong><span>hot plate</span></strong><span>: </span><strong><span>customer support</span></strong><span>, </span><strong><span>payments and billing ops</span></strong><span>, </span><strong><span>engineering</span></strong><span> when incidents are part of the job, </span><strong><span>product and design</span></strong><span> when every launch touches a shared surface, </span><strong><span>legal and compliance</span></strong><span> when &#8220;ship it&#8221; is not a binary. Different domains, same onboarding shape. The work is high stakes and high interruption, so week one has to be right, not just busy.</span></p><p><span>Onboarding for those teams is never &#8220;read the README and go.&#8221; It is access to the right systems, a path through tooling that matches how work really flows, habits that stay safe under pressure, and knowing who to ping when something breaks.</span></p><p><span>We stopped treating that ramp like a scavenger hunt through stale wikis and shipped it as something you can </span><strong><span>run</span></strong><span>: a </span><strong><span>team-scoped Claude Code plugin</span></strong><span> made of </span><strong><span>skills</span></strong><span>, small playbooks the agent follows, with </span><strong><span>MCP checks</span></strong><span> so &#8220;connected&#8221; means verified, not hoped for.</span></p><h2><span>Hypothesis</span></h2><p><span>A </span><strong><span>Team Onboarding Buddy</span></strong><span> should beat the default experience: read twelve pages, miss the thirteenth, ping three people, discover your MCP tokens are wrong, and lose a week proving you are not incompetent, you are just new.</span></p><p><span>If onboarding is </span><strong><span>small, invocable skills</span></strong><span> with explicit triggers, and those skills include </span><strong><span>MCP health checks plus a real access checklist</span></strong><span>, a new hire should get to first useful work with less thrash. The skills do not replace humans. They replace the worst part of onboarding: </span><strong><span>reconstructing tribal knowledge from stale breadcrumbs</span></strong><span>.</span></p><h2><span>Setup</span></h2><p><strong><span>What we built.</span></strong><span> A </span><strong><span>team-scoped plugin</span></strong><span>: four skills in one bundle, installable the same way you would ship any other Claude Code plugin to a group that should share one playbook.</span></p><p><strong><span>Our first internal cut targeted one engineering sub-team&#8217;s playbook before we framed this as a pattern anyone could clone.</span></strong></p><p><strong><span>Repo shape (quick and dirty).</span></strong><span> In a Claude Code </span><strong><span>plugin marketplace</span></strong><span> repo you usually get one folder per plugin: a small manifest under </span><code>.claude-plugin/</code><span> and a </span><code>skills/</code><span> directory full of </span><code>SKILL.md</code><span> playbooks. The folder name should match the plugin id in </span><code>plugin.json</code><span> (that becomes the </span><code>/namespace:skill</code><span> prefix in Claude Code). Rename </span><code>team-name</code><span> to whatever id you pick in </span><code>plugin.json</code><span>.</span></p><p><span>Examples of </span><strong><span>folder / namespace</span></strong><span> names (illustrative only): </span><code>engineering</code>, <code>marketing</code>, <code>product</code>, <code>design</code>, <code>legal</code>, <code>finance</code>, <code>people-ops</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_!s6os!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s6os!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 424w, https://substackcdn.com/image/fetch/$s_!s6os!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 848w, https://substackcdn.com/image/fetch/$s_!s6os!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 1272w, https://substackcdn.com/image/fetch/$s_!s6os!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s6os!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png" width="1302" height="586" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:586,&quot;width&quot;:1302,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106264,&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://www.confidentcommit.com/i/212611811?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.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_!s6os!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 424w, https://substackcdn.com/image/fetch/$s_!s6os!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 848w, https://substackcdn.com/image/fetch/$s_!s6os!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.png 1272w, https://substackcdn.com/image/fetch/$s_!s6os!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8aaa9de-0409-49c5-b1e1-7b25f4ae2dcf_1302x586.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>Why this shape.</span></strong><span> The skills are modular on purpose. Nobody wants a forty-page monolith. A new hire can pick sections like a menu instead of pretending they will read the whole handbook on day one.</span></p><p><strong><span>The MCP angle.</span></strong><span> The </span><code>access</code><span> skill does something wikis are bad at. It tells the agent to </span><strong><span>verify</span></strong><span> integrations with real reads through connected tools, not to assume OAuth worked because nothing exploded yet.</span></p><p><strong><span>The human angle.</span></strong><span> Long-form runbooks still live wherever your company keeps them. Escalation still names real humans. The goal is not autonomous HR. The goal is fewer round trips for questions the team has already answered a hundred times.</span></p><h2><span>Results</span></h2><p><strong><span>What we shipped.</span></strong></p><ul><li><p><span>A </span><strong><span>versioned, team-scoped bundle</span></strong><span> so one group can adopt the buddy without forking the whole company agent config.</span></p></li><li><p><strong><span>Hundreds of lines</span></strong><span> of structured guidance across the four skills: MCP verification steps, access and tooling checks, and a clear path from &#8220;green integrations&#8221; toward first safe change.</span></p></li></ul><p><strong><span>What we learned in practice (qualitative).</span></strong></p><ul><li><p><span>The </span><strong><span>entry skill</span></strong><span> actually gets used. People do not have to remember the &#8220;right&#8221; order. The plugin encodes it.</span></p></li><li><p><strong><span>MCP verification</span></strong><span> turns a vague &#8220;I think I am set up&#8221; into a pass or fail list. When something is wrong, the output is actionable instead of confidently wrong.</span></p></li><li><p><span>The </span><strong><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">team</span><span> skill</span></strong><span> fills a gap most organizations leave empty: who shows up from outside the group, for what reasons, and where the sharp edges are. That is context people often learn only after they step on a rake.</span></p></li></ul><p><strong><span>How to sanity-check your own build (five minutes).</span></strong></p><ul><li><p><span>Invoke the entry skill and confirm it routes into access, local-dev, and team flows in a sensible order.</span></p></li><li><p><span>Run the MCP verification path and confirm failures </span><strong><span>degrade gracefully</span></strong><span>: they say what is broken and what to check next, instead of inventing green checks.</span></p></li></ul><p><strong><span>On metrics.</span></strong><span> We have strong internal signal on usability and fewer &#8220;false start&#8221; access threads. A </span><strong><span>controlled before/after</span></strong><span> (time to first local run, time to green MCP matrix, week-one ticket volume, short confidence survey) is the right next step if we want a chart in a sequel post. This write-up is the pattern and the ship story, not that chart yet.</span></p><h2><span>Takeaway</span></h2><p><span>Onboarding is not an information problem. It is a </span><strong><span>routing</span></strong><span> problem. You do not need more wiki pages. You need a default path that is hard to screw up, plus checks that fail loud when your tooling is not actually connected.</span></p><p><span>Packaging that path as Claude Code skills is a bet on where engineers already live </span><strong><span>(NOTE: It could be Cowork, in the case of a non-engineering team.)</span></strong><span>.</span></p><p><span>Whether Claude Code or Cowork, the buddy belongs in the editor session, not on page seventeen of a PDF nobody opened.</span></p><p><span>The bundle bakes in habits that matter whenever </span><strong><span>financial correctness, access control, or customer-visible production behavior</span></strong><span> is on the line: </span><strong><span>look before you change anything</span></strong><span> (read-only checks first), </span><strong><span>exercise mutations in a safe mode</span></strong><span> (dry-run or sandbox before you touch live state), and </span><strong><span>do not solo your first production-adjacent change</span></strong><span> (pair with someone who has muscle memory).</span></p><p><span>That is not moralizing. It is how you avoid the expensive failure mode where a small onboarding shortcut becomes a customer-visible incident or a long support recovery.</span></p><h2><span>Credits</span></h2><p><strong><span>Team Onboarding Buddy</span></strong><span> was a collaboration. Thanks to the team of engineers who built, reviewed, and tried it in real onboarding flows:</span></p><ul><li><p><strong><a href="https://www.linkedin.com/in/amoratodixon/"><span>Andrea Morato Dixon</span></a></strong></p></li><li><p><strong><a href="https://www.linkedin.com/in/fernlima/"><span>Fernando Lima</span></a></strong></p></li><li><p><strong><a href="https://www.linkedin.com/in/ryanehamilton/"><span>Ryan Hamilton</span></a></strong><span> (yours truly)</span></p></li></ul><p><span>If this pattern helps your org, please let us know!</span></p><h2><span>What&#8217;s Next</span></h2><ol><li><p><strong>Run a small cohort study</strong> with agreed metrics so we can publish numbers, not just vibes.</p></li><li><p><strong>Reuse the skeleton</strong> across the org, for other teams: same four-skill shape <code>onboarding</code>, <code>access</code>, <code>local-dev</code>, <code>team</code>), different playbooks for both engineering and non-engineering teams.</p></li><li><p><strong>Treat rosters and paths as perishable data.</strong> Point people at live chat and authoritative docs, refresh the skills when reality drifts.</p></li></ol><h2><span>Bottom line for anyone pitching this upstairs</span></h2><p><span>This is not &#8220;AI replaces onboarding.&#8221; It is </span><strong><span>AI holds the checklist and verifies the wiring</span></strong><span> so humans spend time on judgment, not detective work.</span></p><p></p><h4></h4>]]></content:encoded></item><item><title><![CDATA[Hardening RalphCI loops for open source after the February 2026 study]]></title><description><![CDATA[The self-healing CI-aware AI coding loop that fixes CI failures.]]></description><link>https://www.confidentcommit.com/p/hardening-ralphci-loops-for-open</link><guid isPermaLink="false">https://www.confidentcommit.com/p/hardening-ralphci-loops-for-open</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Thu, 09 Apr 2026 21:01:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a348c9d5-3d8e-4d9f-9dea-8884ea7ad18d_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><span>The Self-Healing CI-Aware AI Coding Loop That Automatically Fixes CI Failures.</span></strong><span> That is what </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span> is: a CLI-orchestrated loop that keeps the model tied to </span><strong><span>real CI pipeline state</span></strong><span>, swaps in a </span><strong><span>CI Doctor</span></strong><span> to perform code surgery when the pipeline is bleeding red, runs a deterministic </span><strong><span>Review Gate</span></strong><span> before push, and refuses to treat the run as finished until the </span><strong><span>remote</span></strong><span> build is green, not only local tests.</span></p><p><span>If you are landing here cold: when we say </span><strong><span>&#8220;the agent&#8217;s work is done&#8221;</span></strong><span>, we mean </span><strong><span>&#8220;the CI pipeline is green&#8221;</span></strong><span>, not only </span><strong><span>&#8220;the local tests pass on your laptop&#8221;</span></strong><span>.</span></p><p><span>Here&#8217;s how it all fits together, step by step. The </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> already showed the problem: local tests might pass, but without CI in the loop, pipelines often fail; when CI is part of the loop, results reliably match what ships. This experiment is about putting that hardened, CI-driven loop into the wild under an MIT license: tightening rough edges and preserving the multi-agent structure that keeps each role clear.</span></p><p><strong><span>Code is on </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>GitHub</span></a><span>. Video walkthrough: </span><a href="https://youtu.be/OxClXfV7pMA"><span>Loop Lab demo on YouTube</span></a><span>.</span></strong></p><h2><span>Hypothesis</span></h2><p><span>I expected we could keep the behavior we measured in the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span>, address issues that only show up under long runs, and ship </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span> as a small CLI that other people can run without a custom one-off setup.</span></p><p><span>Stated as an if-then: </span><strong><span>if</span></strong><span> CI status check stays at the start of each task iteration, CI failures stay ahead of new feature work, and a deterministic review gate still runs before push, </span><strong><span>then</span></strong><span> tightening up the loop by open sourcing the project does not weaken the rule that completion waits on the real CI pipeline green state. In fact, it should make it stronger.</span></p><p><strong><span>This is an engineering follow-up, not another n=10 Snake batch. The </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> supplies the quantitative baseline.</span></strong></p><p><strong><span>This piece is what we changed to make that baseline shippable.</span></strong></p><h2><span>Setup</span></h2><h3><span>How </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span> fits together (plain language)</span></h3><p><span>Think of the </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>ralphci</span></a><span> CLI as a </span><strong><span>team of coding and review agents</span></strong><span> that sits between your repo, version control, and your CI pipeline. The model still edits files and runs tests on your machine. The CLI decides </span><strong><span>what kind of help the coding agent gets next</span></strong><span> and </span><strong><span>when commits actually get pushed to version control</span></strong><span>, so your CI bill and your definition of &#8220;green&#8221; stay connected to reality.</span></p><p><strong><span>Iterations.</span></strong><span> One task </span><strong><span>iteration</span></strong><span> is one pass:</span></p><ol><li><p><span>Check pipeline status</span></p></li><li><p><span>Run the agent on the current task</span></p></li><li><p><span>Run local checks</span></p></li><li><p><span>Commit if appropriate</span></p></li><li><p><span>Repeat until your task list is complete and, when CI is enabled, the remote pipeline is in a passing state.</span></p></li></ol><p><strong><span>CI status early each iteration.</span></strong><span> At the start of an iteration, the tool asks CircleCI how the latest work on your branch is doing (</span><strong><span>pass</span></strong><span>, </span><strong><span>fail</span></strong><span>, or </span><strong><span>still running</span></strong><span>). Results can be </span><strong><span>cached</span></strong><span> so the CLI is not calling the API when nothing new was pushed. That is how the agent gets a factual snapshot of the server-side build instead of guessing.</span></p><p><strong><span>Build Agent versus CI Doctor.</span></strong><span> These are not two separate products. They are </span><strong><span>two modes</span></strong><span> the orchestrator selects:</span></p><ul><li><p><strong><span>Build Agent</span></strong><span> handles normal forward progress when you are not blocked on a red pipeline (or CI is not in play). The prompt stays lighter and focused on the task list.</span></p></li><li><p><strong><span>CI Doctor</span></strong><span> turns on when the pipeline failed. The model receives </span><strong><span>full failure context</span></strong><span> (including logs) and is steered to fix what broke in CI </span><strong><span>before</span></strong><span> piling on new features. Same model; different job description. That is the &#8220;multi-agent&#8221; shape: split responsibilities instead of one blob of instructions.</span></p></li></ul><p><strong><span>Review Gate.</span></strong><span> Before a </span><strong><span>git push</span></strong><span>, the CLI runs your repo&#8217;s </span><strong><span>lint</span></strong><span> and </span><strong><span>test</span></strong><span> commands as ordinary shell steps, with a timeout so nothing hangs forever. </span><strong><span>No LLM in that step.</span></strong><span> If lint or tests fail, the push does not go out. The point is to catch formatting and unit-test issues locally before they become another failing pipeline run.</span></p><p><strong><span>Smart Push.</span></strong><span> This label means the tool </span><strong><span>does not push on every save or every commit by default</span></strong><span>. It pushes when local checks (including the Review Gate) succeed, so you are less likely to burn CircleCI credits and time on work that already failed lint or tests on your machine. Push triggers CI; Smart Push aims to commit and push to version control only when the branch already survived those local checks.</span></p><p><strong><span>When is the run &#8220;done&#8221;?</span></strong><span> With CI integration enabled, finishing your tasks is not enough if the pipeline is still red. The loop keeps going until </span><strong><span>the real CircleCI pipeline</span></strong><span> is green (per your config), not only until local tests pass. That mismatch between local and remote is exactly what the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> measured in numbers.</span></p><p><span>Everything above is the default </span><strong><span>CI-on</span></strong><span> story. You can tune behavior in </span><code>ralphci.json</code><span> and CLI flags without changing that core: for example </span><strong><span>branch strategy</span></strong><span> (feature branch vs pushing straight to main), </span><strong><span>draft vs ready PRs</span></strong><span>, </span><strong><span>whether the loop auto-pushes</span></strong><span> or waits for you, </span><strong><span>approval gates</span></strong><span> before you call a run complete, and </span><code>ralphci run --no-ci</code><span> when you want local-only iteration with no CircleCI token. See the repo </span><strong><a href="https://github.com/CircleCI-Research/ralph-ci/blob/main/README.md"><span>README</span></a></strong><span> and </span><strong><a href="https://github.com/CircleCI-Research/ralph-ci/blob/main/AGENTS.md"><span>AGENTS.md</span></a></strong><span> for the full matrix. Those options are packaging; the loop in this section is the part that stays constant when CI is enabled.</span></p><h3><span>Where the baseline came from</span></h3><p><span>The </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> holds the detail: same Snake spec, same tasks, same model family, five runs with CI off and five with CI on. One headline from it: </span><strong><span>100% of CI-enabled runs ended green on CI; 20% of local-only runs did</span></strong><span>, with local tests passing in both groups. If you only read one piece from this line of work, that article is the quantitative backbone.</span></p><h3><span>What we changed after that baseline</span></h3><p><span>Work between the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> snapshot and the public repo focused on reliability, clarity, and running on someone else&#8217;s machine, not on a new product story.</span></p><ul><li><p><strong><span>The core loop (Build Agent, CI Doctor, Review Gate, Smart Push, and requiring CI to pass before you call the run complete) stayed the same.</span></strong><span> The main engineering effort focused on improving how each part handles tricky situations and exceptions. For example, we fixed cases where the CI Doctor would keep running even if a fix had already been applied locally. Pipeline status checks are now limited to just the current branch, preventing confusion with unrelated CI runs. When the pipeline is still running, the tool now polls periodically instead of waiting indefinitely. We also resolved issues with duplicate commits and inaccurate activity metrics, making the logs more reliable and easier to interpret.</span></p></li></ul><ul><li><p><strong><span>We removed non-essential paths.</span></strong><span> Experimental review-agent code came out. The CLI stays centered on this CI-aware, multi-agent-shaped loop.</span></p></li></ul><ul><li><p><strong><span>We made the tool easy to run from source.</span></strong><span> The </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>ralphci</span></a><span> binary runs TypeScript through </span><a href="https://github.com/terser/tsx"><span>tsx</span></a><span>, without a separate build step before you iterate.</span></p></li></ul><ul><li><p><strong><span>We licensed it for reuse.</span></strong><span> MIT. </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>github.com/CircleCI-Research/ralph-ci</span></a></p></li></ul><ul><li><p><strong><span>We recorded a demo.</span></strong><span> The </span><a href="https://youtu.be/OxClXfV7pMA"><span>YouTube recording</span></a><span> walks through setup, a run, and CI feedback in the activity log.</span></p></li></ul><h3><span>Variables</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lidr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lidr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 424w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 848w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 1272w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lidr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png" width="1304" height="834" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:834,&quot;width&quot;:1304,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165069,&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://www.confidentcommit.com/i/212610124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.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_!Lidr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 424w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 848w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.png 1272w, https://substackcdn.com/image/fetch/$s_!Lidr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f835e20-e245-4178-baea-51ed240ebe78_1304x834.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Results</span></h2><h3><span>Quantitative bar (from the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span>)</span></h3><p><span>You do not need the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> to use the tool, but it is where these </span><strong><span>before/after</span></strong><span> numbers come from. From the same article:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zOHo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zOHo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 424w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 848w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 1272w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zOHo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png" width="1300" height="334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:334,&quot;width&quot;:1300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45729,&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://www.confidentcommit.com/i/212610124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.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_!zOHo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 424w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 848w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.png 1272w, https://substackcdn.com/image/fetch/$s_!zOHo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4130b288-5111-4ffe-ae05-20dc5e2c3d71_1300x334.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>This open-source release assumes that gap still matters. We did not run another ten Snake iterations for this document.</span></p><p><strong><span>What follows is shipping and engineering evidence, not a second controlled trial.</span></strong></p><h3><span>Hardening phase (this release)</span></h3><ul><li><p><strong><span>Repository:</span></strong><span> </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>github.com/CircleCI-Research/ralph-ci</span></a><span> under MIT.</span></p></li><li><p><strong><span>CI Doctor and Review Gate:</span></strong><span> Fixes for cases such as doctor spinning and branch-scoped checks, covered by tests in the repo.</span></p></li><li><p><strong><span>Contributor flow:</span></strong><span> </span><code>tsx entry</code><span>, documented </span><code>pnpm lint:fix &amp;&amp; pnpm format:fix &amp;&amp; pnpm test:run</code><span> gate, conventional commit helpers for orchestration.</span></p></li><li><p><strong><span>Demo:</span></strong><span> </span><a href="https://youtu.be/OxClXfV7pMA"><span>Loop Lab recording on YouTube</span></a><span>.</span></p></li></ul><h3><span>ESLint and environment drift</span></h3><p><span>The </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> often surfaced ESLint quote style drift. That is representative of what CI is for when agent defaults do not match project config. Hardening does not remove linting; it reduces thrash while the agent aligns with the rules.</span></p><h2><span>Takeaway</span></h2><p><span>The </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> asked whether CI feedback changes outcomes when other factors are held constant. This phase asked whether we could publish the mechanism behind those outcomes while keeping the same accountability: green CI pipeline state matters for completion, not only local tests, and </span><strong><span>Smart Push</span></strong><span> (see above) still limits unnecessary CircleCI runs.</span></p><p><span>The design worth naming explicitly is </span><strong><span>specialization over one generic agent.</span></strong><span> CI debugging and feature work pull different context and different prompts. The Review Gate keeps a slice of quality checks out of the model entirely and makes them more deterministic. That separation is what we hardened for open source, not a bigger single prompt.</span></p><p><span>In the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span>, we reference </span><strong><span>breadth-first agent work</span></strong><span>. That is the idea of trying </span><strong><span>several variants</span></strong><span> (more than one agent run or branch on the same spec) instead of one endless depth-first pass. It only makes sense if each variant can </span><strong><span>ship</span></strong><span>, meaning CI passes. The study&#8217;s main table is what happens when that is not true: same agent, same tasks, locals green, pipeline often still red. Open-sourcing </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI</span></a><span> is about keeping that bar honest when you explore in parallel.</span></p><h2><span>What&#8217;s Next</span></h2><ul><li><p><strong><span>Larger codebases than the Snake exercise.</span></strong><span> Real services, flaky tests, multi-job pipelines.</span></p></li><li><p><strong><span>More models and runners.</span></strong><span> Same contract, different agents; compare cost and failure handling.</span></p></li><li><p><strong><span>Community usage.</span></strong><span> Feedback from people wiring their own CircleCI projects.</span></p></li><li><p><strong><span>Tighter feedback loops.</span></strong><span> A game that can build itself in 20 to 30 minutes, 100% AFK, is great. Ten minutes would be better. We are tinkering with faster, smaller validation cycles using </span><strong><span>sandboxes</span></strong><span> the local agent can drive directly, so not every check has to wait on a full commit, push, and remote pipeline round trip. The same thread shows up in CircleCI&#8217;s </span><a href="https://circleci.com/blog/what-is-autonomous-validation/"><span>autonomous validation</span></a><span> framing: delivery that keeps pace with AI-era churn, including </span><strong><span>selective testing</span></strong><span> (run tests tied to what changed instead of the full suite on every pass) so you get quicker signal without abandoning coverage discipline.</span></p></li><li><p><strong><span>Failure-pattern intelligence.</span></strong><span> Today the loop is built to clear the red build in front of you. The next layer is memory across incidents: jobs that keep flaking, lint rules that trip the same way, fixes that do not stick. That is different from reacting to the latest log line. </span><a href="https://github.com/CircleCI-Public/chunk-cli"><span>Chunk CLI</span></a><span> sits near that problem: it mines GitHub PR review comments into markdown prompts for agents, wires validation into coding-agent hooks, and can run checks in cloud sandboxes before push. It is not wired into RalphCI, but it is a plausible place to experiment when we want CI assistance to learn from repetition, not only from the current failure.</span></p></li><li><p><strong><span>Live voice narration.</span></strong><span> We are also experimenting with voice-led tooling in the spirit of </span><a href="https://loop.circleci.com/i-gave-claude-seven-personalities-and-pointed-them-at-the-sdlc"><span>Claude LiveCaster: seven personalities across the SDLC</span></a><span>, YAML-driven personas and </span><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">/loop</span><span>-style narration on top of real local agent and CI pipeline activity.</span></p></li><li><p><strong><span>New controlled runs when the question warrants a fresh n=10 design.</span></strong><span> This write-up connects the numbers from the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span> to the current codebase; it does not replace new statistics.</span></p></li></ul><p><span>For the original comparison tables, see the </span><a href="https://loop.circleci.com/we-let-an-ai-agent-say-i-passed-was-it-actually-good"><span>February study</span></a><span>. For a walkthrough, use the </span><a href="https://youtu.be/OxClXfV7pMA"><span>YouTube demo</span></a><span>. To build or fork, start from </span><a href="https://github.com/CircleCI-Research/ralph-ci"><span>RalphCI on GitHub</span></a><span>.</span></p>]]></content:encoded></item><item><title><![CDATA[I gave Claude 7 personalities and pointed them at the SDLC]]></title><description><![CDATA[Claude LiveCaster shipped with one announcer persona. I added six more, covering the full software development lifecycle, and discovered that YAML-driven personas are the real primitive.]]></description><link>https://www.confidentcommit.com/p/i-gave-claude-seven-personalities</link><guid isPermaLink="false">https://www.confidentcommit.com/p/i-gave-claude-seven-personalities</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Thu, 02 Apr 2026 19:32:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9bde3945-aab4-4745-9f1f-133e0f2eab96_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>The </span><a href="https://loop.circleci.com/loop-gave-claude-a-heartbeat-i-gave-it-a-microphone"><span>first LiveCaster experiment</span></a><span> proved that Claude Code&#8217;s /loop command works as a cron-style backbone for live voice narration. One scenario. One persona. One voice. Ken Squier calling an AI model race.</span></p><p><span>That worked. So I did what any reasonable person would do: I gave it six more personalities and told each one to narrate a different phase of the software development lifecycle.</span></p><p><span>A rodeo announcer for code reviews. A mission control operator for production deploys. A war room coordinator for incident response. A pair programmer narrating a solo app build. And a two-person broadcast booth for CI pipeline races, complete with a technical anchor and an excitable field correspondent speaking through different TTS voices.</span></p><p><a href="https://youtu.be/P99Bk8bQRsA"><span>Watch the demo on YouTube.</span></a></p><h2><span>Hypothesis</span></h2><p><span>I expected a YAML-driven configuration layer to make the stateless-cron architecture generalize. Swap the YAML, swap the entire narration experience, without changing the core announcer slash command.</span></p><p><span>The variable I was really testing: does the LLM actually follow persona instructions well enough to produce distinct commentary across wildly different scenarios? Or does everything flatten into generic &#8220;sports announcer narrates a process&#8221; regardless of what the persona field says?</span></p><h2><span>Setup</span></h2><h3><span>The Stack</span></h3><ul><li><p><strong><a href="https://github.com/CircleCI-Research/claude-livecaster"><span>Claude LiveCaster</span></a></strong><span>: the open-source slash command toolkit from the </span><a href="https://loop.circleci.com/loop-gave-claude-a-heartbeat-i-gave-it-a-microphone"><span>first experiment</span></a></p></li><li><p><strong><span>Cursor</span></strong><span>: wrote the simulation engine and all 7 YAML scenario configs</span></p></li><li><p><strong><a href="https://github.com/nazdridoy/kokoro-tts"><span>Kokoro TTS</span></a></strong><span>: local text-to-speech, 8 voices across 7 scenarios</span></p></li><li><p><strong><span>Python 3.9+</span></strong><span>: data-driven simulation script </span><code>scripts/simulate.py</code><span>)</span></p></li></ul><h3><span>What Changed</span></h3><p><span>The core announcer command </span><code>/livecaster-announce</code><span>) reads </span><code>livecaster.yaml</code><span> from the project root each iteration. The first experiment hardcoded everything. This time I made the config do the heavy lifting.</span></p><p><span>Each scenario YAML file defines:</span></p><ul><li><p><strong><span>Contestants</span></strong><span> (who or what is competing, or solo subject)</span></p></li><li><p><strong><span>Tasks</span></strong><span> (the work items being processed, with scenario-appropriate names)</span></p></li><li><p><strong><span>Persona</span></strong><span> (multi-sentence prompt describing the announcer&#8217;s character and style)</span></p></li><li><p><strong><span>Voice</span></strong><span> (which Kokoro TTS voice to use, and at what speed)</span></p></li><li><p><strong><span>Error messages</span></strong><span> (scenario-specific failures like &#8220;MERGE CONFLICT: 4 files conflict with main&#8221; or &#8220;ROLLBACK CONSIDERED: anomaly detected in checkout flow&#8221;)</span></p></li></ul><p><span>The simulation script </span><code>simulate.py</code><span>) got a </span><code>--scenario flag</code><span>. Pass it a YAML path and it generates log output using that scenario&#8217;s contestants, tasks, timing, and error profiles. Backward compatible. No flag means original defaults.</span></p><h3><span>The Seven Scenarios</span></h3><p><strong><span>Races</span></strong><span> (multi-contestant):</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Ae2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Ae2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 424w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 848w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 1272w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Ae2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png" width="1282" height="638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:638,&quot;width&quot;:1282,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:112213,&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://www.confidentcommit.com/i/212599157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.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_!1Ae2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 424w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 848w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.png 1272w, https://substackcdn.com/image/fetch/$s_!1Ae2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ab15d5-b404-4b90-bc8b-45de4fe10594_1282x638.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>Solo narrations</span></strong><span> (single process):</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CvSl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CvSl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 424w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 848w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 1272w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CvSl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png" width="1298" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1298,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94929,&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://www.confidentcommit.com/i/212599157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.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_!CvSl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 424w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 848w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.png 1272w, https://substackcdn.com/image/fetch/$s_!CvSl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6fe1d14-0265-41f9-b584-1a6965f6d0e6_1298x572.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Dual-Voice Mode</span></h3><p><span>Pipeline Wars introduced a second TTS voice. Instead of a single </span><code>voice</code><span> key in the YAML, it uses a </span><code>voices</code><span> list:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fv-Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fv-Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 424w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 848w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 1272w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fv-Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png" width="1278" height="368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:368,&quot;width&quot;:1278,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44117,&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://www.confidentcommit.com/i/212599157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.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_!fv-Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 424w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 848w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.png 1272w, https://substackcdn.com/image/fetch/$s_!fv-Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38add46e-68c1-4a13-9dcc-16d5b3d4b1d9_1278x368.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>The announcer detects this list, generates labeled commentary </span><code>[ANCHOR] </code><span>/ </span><code>[CORRESPONDENT]</code><span>), and speaks each section with the assigned voice. The anchor delivers measured factual updates. The correspondent reacts emotionally to failures and celebrates green builds.</span></p><h3><span>Variables</span></h3><ul><li><p><strong><span>Changed</span></strong><span>: The simulation scenario YAML (persona, contestants, tasks, voice, errors)</span></p></li><li><p><strong><span>Controlled</span></strong><span>: Core slash commands, TTS pipeline, </span><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">/loop</span><span> scheduling, filesystem-backed state pattern</span></p></li></ul><h2>Results</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YaDp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YaDp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 424w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 848w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 1272w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YaDp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png" width="1298" height="684" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:684,&quot;width&quot;:1298,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119313,&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://www.confidentcommit.com/i/212599157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.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_!YaDp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 424w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 848w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.png 1272w, https://substackcdn.com/image/fetch/$s_!YaDp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff2cf86b-3da5-42d7-bc96-47a8dd92dd5d_1298x684.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>Persona Fidelity Was the Surprise</span></h3><p><span>I honestly expected the persona instructions to be a suggestion the LLM would half-follow. The opposite happened.</span></p><p><span>The rodeo announcer for Code Review Roundup actually used rodeo metaphors. &#8220;feat/auth-overhaul is trying to hang on through a nasty merge conflict&#8221; is exactly the kind of thing a rodeo commentator would say about a bronc ride. The war room coordinator for Incident Response stayed procedural and urgent without tipping into panic. &#8220;Root cause confirmed. Connection leak in the ORM layer. Hotfix is in staging now. Lets see if this holds.&#8221; That reads like a real incident channel update.</span></p><p><span>The mission control persona for Deploy Day was my favorite. Treated canary percentage increases like orbital stage separations. &#8220;Canary at 25 percent. All systems nominal. Proceeding to 50.&#8221; You could close your eyes and picture Houston.</span></p><h3><span>Dual-Voice Actually Worked</span></h3><p><span>I expected the labeled output to be brittle. It wasn&#8217;t. The announcer consistently generated </span><code>[ANCHOR]</code><span> and </span><code>[CORRESPONDENT]</code><span> labels, and the text extraction held across every run I tested. The anchor stayed measured. The correspondent stayed excitable. The contrast made Pipeline Wars the most entertaining scenario of the seven.</span></p><p><span>Having two distinct TTS voices alternate added something I didn&#8217;t anticipate: rhythm. The switch between bf_emma&#8217;s BBC-anchor delivery and af_bella&#8217;s animated correspondent created a cadence that single-voice scenarios don&#8217;t have.</span></p><h3><span>Solo Narrations Needed Different Thinking</span></h3><p><span>Races have a built-in narrative: who&#8217;s ahead, who&#8217;s falling behind, lead changes. Solo narrations have none of that. There&#8217;s one contestant progressing through tasks sequentially.</span></p><p><span>The personas handled this by shifting from competition to progression. The pair programmer in App Build Journey tracked milestones: &#8220;Auth is in place, the dashboard is looking great. Now we are wiring up Stripe.&#8221; The mission control operator in Deploy Day built tension through the canary ramp. The war room coordinator in Incident Response tracked investigation phases: triage, diagnosis, mitigation, recovery.</span></p><p><span>The leaderboard command in the YAML adapts too. Races count completed tasks per contestant. Solo narrations show the last 8 completed steps instead. Same command template, different shell pipeline.</span></p><h2><span>Takeaway</span></h2><p><span>The persona YAML field is the real primitive. Not the voice. Not the simulation engine. Not the cron scheduling.</span></p><p><span>In the first experiment, I found that /loop with filesystem-backed state is a reliable architecture for Claude Code automations. This experiment found something built on top of that: </span><strong><span>a short natural-language persona prompt, embedded in YAML and read fresh each /loop iteration, is enough to produce genuinely distinct narration styles from the same code path.</span></strong></p><p><span>That&#8217;s the pattern worth paying attention to. You can ship a single announcer command and make it sound like seven completely different tools by swapping a config file. The architecture doesn&#8217;t care whether it&#8217;s narrating a CI pipeline race, a production deploy, or a P1 incident. It reads the persona, it reads the log, it speaks.</span></p><p><span>This maps to something bigger than voice announcing. Any recurring Claude Code automation that needs contextual awareness (code review bots, monitoring narrators, build commentators) can use the same trick: define the persona in config, let the slash command read it each iteration, and the LLM adapts.</span></p><h2><span>What&#8217;s Next</span></h2><p><span>The seven scenarios cover a lot of SDLC ground, but they&#8217;re all running on synthetic log data generated by the simulation script. Every task completes. Every error is scripted. The narration is convincing, but it&#8217;s narrating a simulation.</span></p><p><span>Things I want to test:</span></p><ul><li><p><strong><span>Real CI pipeline narration</span></strong><span>: Point LiveCaster at an actual CircleCI pipeline log instead of synthetic data. Does the commentary hold up when the data is messy and unpredictable?</span></p></li><li><p><strong><span>Custom scenario authoring</span></strong><span>: How fast can someone who&#8217;s never seen LiveCaster create their own scenario YAML? The format is simple, but I haven&#8217;t tested it with anyone else.</span></p></li><li><p><strong><span>Longer dual-voice runs</span></strong><span>: Pipeline Wars worked in short simulations. What happens with a 30-minute dual-voice broadcast? Does the LLM maintain persona separation, or do the voices start to bleed together?</span></p></li><li><p><strong><span>Three-voice mode</span></strong><span>: The architecture supports N voices in the voices list. An anchor, a color commentator, and a sideline reporter? This might be absurd. I want to try it anyway.</span></p></li></ul><p><span>The </span><a href="https://github.com/CircleCI-Research/claude-livecaster"><span>open-source repo is here</span></a><span>. Clone it, run /livecaster-simulate with-announcer, and pick a scenario. The whole thing runs locally, no API keys beyond Claude Code itself.</span></p><p><span>Ship it. &#127897;&#65039;</span></p><div><hr></div><p><em><span>This experiment was conducted as part of the Loop Lab program at CircleCI. It is a follow-up to </span><a href="https://www.confidentcommit.com/p/loop-gave-claude-a-heartbeat-i-gave"><span>/loop Gave Claude a Heartbeat. I Gave It a Microphone</span></a><span>. The code lives at </span><a href="https://github.com/CircleCI-Research/claude-livecaster"><span>CircleCI-Research/claude-livecaster</span></a><span>. Full demo: </span><a href="https://youtu.be/P99Bk8bQRsA"><span>YouTube</span></a><span>. PR: </span><a href="https://github.com/CircleCI-Research/claude-livecaster/pull/2"><span>#2</span></a><span>.</span></em></p>]]></content:encoded></item><item><title><![CDATA[/loop Gave Claude a heartbeat. I gave it a microphone.]]></title><description><![CDATA[I used Claude Code's /loop command to build a live voice announcer that narrates AI model eval races in real time. 16 commits, one overnight session, and a stellar Ken Squier impression.]]></description><link>https://www.confidentcommit.com/p/loop-gave-claude-a-heartbeat-i-gave</link><guid isPermaLink="false">https://www.confidentcommit.com/p/loop-gave-claude-a-heartbeat-i-gave</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Thu, 19 Mar 2026 19:21:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2fd1cd68-6054-4950-ba77-1563b24473e7_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>I wanted to see if Claude Code&#8217;s </span><code>/loop command</code><span> could do something it probably wasn&#8217;t designed for: run a live play-by-play announcer for AI model eval races, speaking commentary out loud through my laptop speakers every few minutes for the duration of a 45-minute race.</span></p><p><span>Sixteen commits later, it works. Six AI models racing head-to-head on eval tasks, and Claude is calling the action in real time like a motorsport broadcaster with a Southern drawl and opinions about latency.</span></p><p><a href="https://youtu.be/CW0kyaeQ4Gg?si=uyTVNHxpFXQrPCdY"><span>Watch the full demo on YouTube.</span></a></p><h2><span>Hypothesis</span></h2><p><span>I expected Claude Code&#8217;s </span><code>/loop</code><span> command to be stable enough to serve as a cron-style backbone for a recurring, stateful task. Specifically: read live log data every N minutes, generate contextual commentary based on what changed since last check, synthesize it to speech, and auto-cancel the cron when the race finishes.</span></p><p><span>My reasoning: slash commands already work for one-shot jobs. The </span><code>/loop</code><span> extension schedules them on an interval. If the execution stays in the main session (where permissions are already granted), it should hold together. But I&#8217;d never run anything on </span><code>/loop</code><span> for 30+ minutes straight, so I genuinely didn&#8217;t know.</span></p><h2><span>Setup</span></h2><h3><span>The Stack</span></h3><ul><li><p><strong><span>Claude Code</span></strong><span> with </span><code>/loop</code><span> slash command support</span></p></li><li><p><strong><a href="https://github.com/ryan-circleci/MindTrial"><span>MindTrial</span></a></strong><span>: an open-source </span><a href="https://github.com/petmal/MindTrial"><span>AI model eval framework I forked</span></a><span> from a colleague, </span><a href="https://github.com/petmal"><span>Petr Malik</span></a><span>, on the CircleCI AI Team. Runs tasks against multiple LLM providers (OpenAI, Google, Anthropic, DeepSeek, Mistral, xAI) simultaneously and scores the results.</span></p></li><li><p><strong><a href="https://github.com/nazdridoy/kokoro-tts"><span>Kokoro TTS</span></a></strong><span>: open-source text-to-speech running locally. No API calls, no latency. Sounds surprisingly good.</span></p></li><li><p><strong><span>Custom slash commands</span></strong><span> I built for the experiment:</span></p><ul><li><p><code>/run-model-comparison</code><span> builds MindTrial, launches the eval, initializes a commentary transcript</span></p></li><li><p><code>/simulate-model-comparison</code><span> generates fake log output in the same format, so I could test end-to-end without burning API tokens</span></p></li><li><p><code>/announce-model-comparison</code><span> is the single announcer iteration, designed to be called by </span><code>/loop</code></p></li><li><p><code>/stop-model-comparison</code><span> kills the eval, finalizes the transcript, shows the leaderboard</span></p></li></ul></li></ul><h3><span>How It Works</span></h3><p><span>You kick off an eval race. Six model configs start processing tasks in parallel (I patched MindTrial&#8217;s Go code so </span><code>runTasks</code><span> launches each config in its own goroutine instead of running sequentially within a provider). Then you start the announcer:</span></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WiS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WiS_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 424w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 848w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 1272w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WiS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png" width="1284" height="174" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:174,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18909,&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://www.confidentcommit.com/i/212596546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.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_!WiS_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 424w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 848w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 1272w, https://substackcdn.com/image/fetch/$s_!WiS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30c23-b5bf-4c57-bd22-9721966b07e8_1284x174.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><span>Every 5 minutes, Claude wakes up, tails the eval log, parses the current leaderboard, figures out what changed since last time (lead changes, new completions, errors, scoring gaps), writes </span><a href="https://en.wikipedia.org/wiki/Ken_Squier"><span>Ken Squier</span></a><span>-style race commentary, speaks it out loud via Kokoro, and appends to a running transcript.</span></p><p><span>When the race finishes, the announcer detects it from the log, delivers a final wrap-up with standings and notable moments, and auto-cancels its own cron job via </span><code>CronList</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span>+<span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span><code>CronDelete</code><span>. Zero human intervention after you start it.</span></p><h3><span>The Variable</span></h3><p><span>I started by trying to run the announcer as a background Task agent. That&#8217;s the variable I was really testing at first. But Task agents lose Bash permissions mid-run. I discovered this the hard way when the announcer went silent 12 minutes in. So I pivoted to </span><code>/loop</code><span>, which runs in the main Claude Code session where permissions persist.</span></p><p><span>That pivot turned out to be the more interesting architecture anyway.</span></p><h3><span>Results</span></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VRTj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VRTj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 424w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 848w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 1272w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VRTj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png" width="1294" height="610" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94634,&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://www.confidentcommit.com/i/212596546?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.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_!VRTj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 424w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 848w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.png 1272w, https://substackcdn.com/image/fetch/$s_!VRTj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7e3169-aeb3-4d02-8485-e4cb6a733e5d_1294x610.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>The Background Task Discovery</span></h3><p><span>The first architecture I tried was launching the announcer as a background Task agent. Makes sense in theory: background agent watches the race, main session stays free. In practice, Task agents lose Bash permissions after about 10-15 minutes. The agent can still think, but it can&#8217;t execute shell commands, which means it can&#8217;t tail the log, can&#8217;t run TTS, can&#8217;t do anything useful.</span></p><p><span>This isn&#8217;t documented anywhere I could find. I discovered it when the commentary just... stopped. Checked the Task agent output and found it apologizing for being unable to execute commands.</span></p><h3>The /loop Fix</h3><p><code>/loop</code><span> runs in the main session. Permissions persist because they were already granted when you started the session. Each iteration gets a fresh context call, but the slash command reads from the same log file and transcript, so state is maintained through the filesystem rather than through agent memory.</span></p><p><span>This is a better pattern. The announcer doesn&#8217;t need to hold state in memory between calls. It reads the log, diffs against the transcript, generates commentary, writes it back. Stateless iterations with filesystem-backed state. Feels like a cron job because it is one.</span></p><h3><span>TTS Quirks</span></h3><p><span>One thing I didn&#8217;t anticipate: model version numbers. Kokoro TTS reads &#8220;4.6&#8221; as &#8220;four six&#8221; instead of &#8220;four point six.&#8221; I had to add a decimal-to-word conversion step in the announcer pipeline. Small thing, but it matters when you&#8217;re narrating &#8220;Claude 3 point 5 Sonnet pulls ahead of GPT 4 point 1&#8221; every few minutes.</span></p><p><span>Also had to tune the dynamic </span><code>tail</code><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> </span><span>sizing. The announcer reads N lines from the end of the log each iteration. If your </span><code>/loop</code><span> interval is 1 minute, you need fewer lines than if it&#8217;s 10 minutes. I settled on a </span><code>LOG_LINES_PER_MINUTE=50</code><span> constant, clamped between 60 and 500 lines, scaled by the interval. Gets the right amount of context without drowning in log noise.</span></p><h3><span>The Session</span></h3><p><span>16 commits. 1,056 lines added. Started at 1:17 AM, merged at 3:35 PM. The commit history tells the story: initial build, rename and refactor, simulation mode for testing, UX improvements, the Task-agent-to-loop pivot, opt-in announcer with interactive prompts, interval selection, and docs.</span></p><p><span>Built the whole thing with Claude Code writing the code while I directed architecture decisions. Ate its own dog food: Claude Code building a Claude Code automation.</span></p><h2><span>Takeaway</span></h2><p><code>/loop</code><span> is the more interesting primitive here, not the voice announcer itself. The announcer is fun (genuinely fun, the </span><a href="https://en.wikipedia.org/wiki/Ken_Squier"><span>Ken Squier</span></a><span> voice calling lead changes between Gemini and Claude is something I didn&#8217;t know I needed). But the pattern underneath is the finding.</span></p><p><strong><span>Stateless cron iterations with filesystem-backed state is a reliable architecture for Claude Code automations.</span></strong><span> You don&#8217;t need the agent to remember anything between calls. Write state to disk. Read it back next iteration. Let </span><code>/loop</code><span> handle the scheduling. Let the slash command handle the logic. The agent stays in the main session where permissions work, and each iteration is a clean execution.</span></p><p><span>This pattern applies to way more than race announcing. Monitoring dashboards. Periodic code review sweeps. Build status narration. Anything you&#8217;d write a cron job for, you can now write as a slash command and schedule with </span><code>/loop</code><span>.</span></p><p><span>The constraint that makes it work is the same constraint that makes cron jobs work: each invocation is independent. Don&#8217;t rely on agent memory. Rely on the filesystem.</span></p><h2><span>What&#8217;s Next</span></h2><p><span>I extracted the announcer into a standalone open-source project: </span><a href="https://github.com/CircleCI-Research/claude-livecaster"><span>claude-livecaster</span></a><span>. It&#8217;s the slash commands, the TTS pipeline, and the simulation harness, decoupled from MindTrial so anyone can wire it into their own long-running processes.</span></p><p><span>Things I want to test next:</span></p><ul><li><p><code>/loop</code><strong><span> at scale</span></strong><span>: What happens when you run it for 4+ hours? Or days? Does it stay stable? Are there memory or context limits I haven&#8217;t hit yet?</span></p></li><li><p><strong><span>Multiple </span></strong><code>/loop</code><strong><span> jobs simultaneously</span></strong><span>: Can you run two different slash commands on different intervals in the same session?</span></p></li><li><p><strong><span>CI pipeline narration</span></strong><span>: Same architecture, but the announcer watches a CircleCI pipeline instead of an eval race. Every few minutes, Claude narrates what&#8217;s happening in your build. I have a feeling this is a better status dashboard than any dashboard.</span></p></li><li><p><strong><span>Other TTS voices</span></strong><span>: Kokoro is good but limited. Want to try ElevenLabs for higher fidelity and see if the latency trade-off (API call vs. local) matters at 5-minute intervals.</span></p></li></ul><p><span>If Background Task agents ever get persistent Bash permissions, I&#8217;d revisit that architecture too. Running the announcer in the main session works, but it does block you from using that session for other things while the race is running.</span></p><p><span>Sixteen commits before lunch. Ship it. &#129302;&#127897;&#65039; &#128640;</span></p><div><hr></div><p><em><span>This experiment was conducted as part of the Loop Lab program at CircleCI. The original implementation lives in </span><a href="https://github.com/ryan-circleci/MindTrial/pull/2"><span>MindTrial PR #2</span></a><span>. The extracted open-source project is </span><a href="https://github.com/CircleCI-Research/claude-livecaster"><span>claude-livecaster</span></a><span>. Full demo: </span><a href="https://youtu.be/CW0kyaeQ4Gg?si=uyTVNHxpFXQrPCdY"><span>YouTube</span></a><span>.</span></em></p>]]></content:encoded></item><item><title><![CDATA[We let an AI agent say "I passed." Was it actually good?]]></title><description><![CDATA[10 controlled experiments reveal that 80% of AI agent code fails CI pipelines when there's no feedback loop.]]></description><link>https://www.confidentcommit.com/p/we-let-an-ai-agent-say-i-passed-was</link><guid isPermaLink="false">https://www.confidentcommit.com/p/we-let-an-ai-agent-say-i-passed-was</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:57:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3ceb3444-13bd-4361-a206-cc9d4415877d_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>We ran 10 controlled experiments to answer a question nobody seems to be asking: When an AI agent says the tests pass, does that mean the code is actually ready to ship?</span></p><p><span>There&#8217;s a lot of noise right now about AI agents writing code. Faster commits. More output. Ship it yesterday.</span></p><p><span>But here&#8217;s a question we haven&#8217;t seen anyone answer with data: When the agent says &#8220;all tests pass,&#8221; is the code actually good?</span></p><p><span>We ran the experiment. Here&#8217;s what we found.</span></p><h2><span>The Setup</span></h2><p><span>We gave an AI agent the same task 10 times: build a Snake game from scratch using TDD. Same spec. Same model. Same prompt scaffolding. 20x20 grid, arrow key controls, collision detection, score tracking, retro aesthetic. The whole thing.</span></p><p><span>The only variable: 5 runs had CI pipeline integration. 5 didn&#8217;t.</span></p><p><span>Both groups followed test-driven development. Both wrote comprehensive test suites. Both committed and pushed code. The CI-enabled group got one additional thing: real-time feedback from a CircleCI pipeline after every push. In our experiment, we created a RalphCI loop (i.e. a CI-enabled </span><a href="https://ghuntley.com/loop/"><span>Ralph loop</span></a><span>) that pre-fetches pipeline status and injects it into the agent&#8217;s prompt context, so the agent can see and act on CI results as part of its development cycle.</span></p><p><span>That&#8217;s it. One variable.</span></p><h2><span>What Happened</span></h2><p><span>All 10 runs finished. All 10 completed every task. All 10 produced a playable Snake game with full test coverage. All 10 passed local tests.</span></p><p><span>Every single agent said &#8220;passed.&#8221;</span></p><p><span>Then we checked the CI pipeline.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kqd8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kqd8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 424w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 848w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kqd8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png" width="1312" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54803,&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://www.confidentcommit.com/i/212592324?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.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_!Kqd8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 424w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 848w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqd8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d819461-7818-4dc1-a27c-f3dd43769882_1312x410.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 buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><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 icon-noB79L"><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><span>80% of the runs without CI integration shipped code that fails the pipeline. The agent ran the tests on its machine, saw green, and declared victory. The pipeline disagreed.</span></p><h2><span>What Went Wrong (and Why It&#8217;s Instructive)</span></h2><p><span>The failure was an ESLint configuration mismatch. The agent defaulted to single quotes. The project&#8217;s linter required double quotes. Local tests don&#8217;t check lint rules. The CI pipeline does.</span></p><p><span>This isn&#8217;t a dramatic failure. It&#8217;s a mundane one. And that&#8217;s the point.</span></p><p><span>AI agents don&#8217;t inherently know your project&#8217;s lint config, your environment variables, your CI-specific test runners, or your integration-level constraints. Local tests verify logic. CI verifies deployability. These are different things, and the gap between them is where &#8220;works on my machine&#8221; lives.</span></p><p><span>The one non-CI run that passed? The agent happened to discover the project&#8217;s lint:fix command on its own. Lucky, not reliable. Not a strategy.</span></p><h2><span>What the CI-Enabled Agent Actually Did</span></h2><p><span>When CI failed, the agent didn&#8217;t just see a red X. The RalphCI loop pre-fetches the pipeline status and injects it into the agent&#8217;s prompt context at the start of its next iteration. The agent sees something like:</span></p><h3><span>CI Status</span></h3><ul><li><p><span>Pipeline #551 FAILED with linting errors</span></p></li><li><p><span>Issue: game.test.ts using single quotes instead of double quotes</span></p></li></ul><p><span>Here&#8217;s what happened next, across all 5 CI-enabled runs:</span></p><ul><li><p><span>12 CI failures appeared in total</span></p></li><li><p><span>The agent fixed all 12 autonomously</span></p></li><li><p><span>Zero human intervention required</span></p></li></ul><p><span>In every case, the agent dropped its planned task, diagnosed the root cause from the failure log, applied the fix, re-verified locally, pushed, and resumed its work once the pipeline came back green.</span></p><p><span>It refused to mark the PR as &#8220;Ready for review&#8221; until CI was green.</span></p><p><span>Or as Dan Lorenc put it: </span><a href="https://www.chainguard.dev/unchained/gastown-and-where-software-is-going"><span>&#8220;Code is cheap. Green CI is priceless.&#8221;</span></a></p><h2><span>The Behavioral Shift</span></h2><p><span>The most interesting thing in this experiment isn&#8217;t the pass rate. It&#8217;s how the agent&#8217;s behavior changes when it has access to pipeline feedback.</span></p><p><span>Without CI, the agent&#8217;s definition of &#8220;good&#8221; is: local tests pass. It has no reason to think otherwise. It runs the suite, sees green, declares victory, and moves on. It&#8217;s not being careless. It literally has no other signal available.</span></p><p><span>With CI, the agent operates differently. It treats the pipeline as the source of truth. I watched it:</span></p><ul><li><p><span>Query pipeline status before starting new work</span></p></li><li><p><span>Drop planned tasks to prioritize CI fixes</span></p></li><li><p><span>Parse failure logs to diagnose root causes</span></p></li><li><p><span>Re-verify both locally and through the pipeline before continuing</span></p></li><li><p><span>Wait for pipeline completion before declaring a PR ready</span></p></li></ul><p><span>This is closer to how a senior engineer works than a junior one. Not because the model is smarter. It&#8217;s the same model in both groups. The feedback loop gives it the information it needs to operate at a higher level.</span></p><h2><span>An Unexpected Finding: CI Makes Agents Write Better Tests</span></h2><p><span>CI-enabled runs consistently produced more tests: 28-37 per run versus 21-28 for non-CI runs.</span></p><p><span>We didn&#8217;t instruct the agent to write more tests in CI mode. The prompt was identical. But when the agent operates within a feedback loop that includes external verification, it appears to write more thorough test suites on its own.</span></p><p><span>We don&#8217;t want to overclaim causation from 10 runs, but the pattern was consistent across all 5 CI-enabled experiments. If I had to guess: agents test more thoroughly when they know their work will be checked by something other than themselves. Which sounds a lot like what humans do.</span></p><h2><span>The Velocity Problem Nobody&#8217;s Talking About</span></h2><p><span>Everyone&#8217;s focused on making AI agents faster at writing code. But code generation was never the bottleneck, and it definitely isn&#8217;t now. The bottleneck is knowing whether the code you generated is actually safe to ship. As agents accelerate how fast code gets written, the gap between &#8220;code produced&#8221; and &#8220;code that&#8217;s actually deployable&#8221; doesn&#8217;t shrink. It widens. More code, generated faster, with the same (or less) visibility into whether it integrates, passes lint, respects environment config, and behaves correctly outside the agent&#8217;s local context.</span></p><p><span>That gap is where our 80% failure rate lives.</span></p><p><span>CI is what closes it. Not by slowing agents down, but by giving them the signal they need to self-correct. The CI-enabled runs in our experiment took more iterations and more time. They also produced 100% deployable code. The non-CI runs were &#8220;faster&#8221; and 80% broken.</span></p><p><span>Speed without confidence isn&#8217;t velocity. It&#8217;s drift.</span></p><p><span>The teams that will move fastest in the agent era won&#8217;t be the ones generating the most code. They&#8217;ll be the ones with the tightest feedback loops between code generation and verification, the ones who can point an agent at a problem and trust the pipeline to keep it honest.</span></p><h2><span>What This Means If You&#8217;re Building with AI Agents</span></h2><p><span>This experiment was small and controlled. A Snake game, not a production codebase. But the finding generalizes to a principle:</span></p><p><strong><span>The feedback loop defines the output quality.</span></strong></p><p><span>Same agent. Same task. Same model. Same prompt. The only difference was whether the agent could see what the pipeline saw. That single variable moved the CI pass rate from 20% to 100%.</span></p><p><span>If you&#8217;re running AI agents against real codebases without CI in the loop, you&#8217;re likely in the same position as our non-CI runs: the agent is confident, the code passes local tests, and you have no signal on whether it actually integrates.</span></p><h3><span>Three things we&#8217;d suggest based on what we found:</span></h3><p><strong><span>Close the feedback loop.</span></strong><span> If your agent can&#8217;t see CI results, it can&#8217;t fix CI failures. This sounds obvious, but most agent setups today push code and move on. The agent needs to see the pipeline status and have the opportunity to act on it.</span></p><p><strong><span>Treat systematic failures as tuning opportunities.</span></strong><span> The ESLint quote mismatch appeared in every single run. That&#8217;s not randomness, it&#8217;s a trainable pattern. Injecting your project&#8217;s lint rules into the agent&#8217;s prompt context, or adding a pre-commit hook, could eliminate the most common failure before it ever hits CI.</span></p><p><strong><span>Invest in your pipeline, not just your prompts.</span></strong><span> The agent&#8217;s ceiling is defined by the infrastructure around it. A better prompt might make the agent write slightly better code. A CI feedback loop changes what &#8220;done&#8221; means.</span></p><h2><span>What We&#8217;re Doing Next</span></h2><p><span>This was our first controlled study with proper sample size and identical configurations across groups. We&#8217;re planning to run the same experiment design against production-scale codebases with more complex CI pipelines, compare across different models, and explore whether smarter prompt context (feeding lint rules and failure patterns directly to the agent) can reduce CI failures before they happen.</span></p><p><span>We&#8217;re also interested in what this enables when you run agents in parallel: if each CI-verified run produces a genuinely deployable artifact, you can spin up 10 variants of a feature, all tested, all passing CI, and pick the best one. That changes how you think about prototyping.</span></p><p><strong><span>All 10 runs finished before lunch. Ship it. With receipts. &#128640;</span></strong></p><div><hr></div><p><em><span>This experiment was conducted by the CircleCI AI Testing Lab using RalphCI, a soon-to-be open-source tool for integrating AI coding agents with CI pipelines. The full dataset (10 runs, per-iteration metrics, activity logs) will be published alongside the repo. Stay tuned.</span></em></p><p><em><span>We&#8217;re sharing this because we think developers deserve data, not just opinions, on how to work effectively with AI agents. If you&#8217;ve run similar experiments, we&#8217;d love to compare notes.</span></em></p>]]></content:encoded></item></channel></rss>