<?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>Sun, 08 Nov 2026 21:45:31 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[Can an AI decision model stand in for your manual tester?]]></title><description><![CDATA[CI can&#8217;t tell you whether a person can actually use your app. I tested whether an AI player can cover that click-through, for about 29&#162; a game.]]></description><link>https://www.confidentcommit.com/p/ai-decision-model-automate-manual-testing</link><guid isPermaLink="false">https://www.confidentcommit.com/p/ai-decision-model-automate-manual-testing</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Wed, 04 Nov 2026 15:03:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c04e9ba6-d472-4d43-8e9c-65a5a77dd379_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I wanted to know if an AI could cover the manual testing a human does before release, so I raced a decision model against a hand-coded bot on <a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about">21 agent-built Snake games</a>. Same rules, same safe moves. The AI won.</p><p>CI can tell you an agent-built app compiles, lints, and passes its tests. It can&#8217;t tell you whether a person can actually use the thing. That check usually falls to a human clicking around and trying things out before release: exploratory testing, manual QA, a &#8220;human in the loop&#8221;, whatever your team calls it. Your other option is hand-coding a bot to do the clicking, and then maintaining that bot forever.</p><p>I built a small research test rig called <strong>Understudy</strong> to find out how much of that human click-through an AI player can cover, and whether it beats the hand-coded bot. Snake keeps the question easy to score: can somebody get through this, and how far? This is Understudy&#8217;s first real race.</p><blockquote><p><strong>Why &#8220;Understudy&#8221;?</strong> In theater, understudies learn the part so they can go on when the lead can&#8217;t. Same idea here: an agent that stands in for the human click-through, not a replacement for the show.</p></blockquote><p>Here&#8217;s the setup in plain English. Twenty-one Snake games, all built by coding agents in earlier <a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about">Loop Lab</a> experiments. Two players:</p><ul><li><p><strong>Greedy bot</strong> I vibecoded by hand in JavaScript: a short, fixed rulebook that chases the nearest food unless that would trap it.</p></li><li><p><strong>Jev</strong>, a <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev">decision model from Typesafe</a> that picks one answer from a fixed list instead of writing paragraphs of advice like a typical LLM would.</p></li></ul><p>Both see the same board. Both get the same list of moves that won&#8217;t kill the snake on each tick of the game. Each game runs until the snake dies, and the score is how much food it ate.</p><p>Jev averaged <strong>95.0</strong> points per game. The greedy bot averaged <strong>72.6</strong>. A second Jev setup with extra strategy tips in its prompt averaged 94.5, a dead heat with the first. On average, the tips bought nothing. But, that&#8217;s a second story. The main story is that Jev outscored the greedy bot on 19 of 21 builds.</p><p>Think of it as bowling with bumpers. Both bowlers had the gutters blocked, so nobody threw a gutter ball. The question was only who knocked down more pins.</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>Hypothesis</h2><p>If an AI decision model is held to the same safe-move list as a hand-coded bot baseline and scored until death on a fixed set of games, it should beat the baseline on mean score.</p><p>Why that bar? If the model can&#8217;t outscore a rule book that fits on one screen, in a game with five buttons, it has no business standing in for a human tester on anything harder.</p><p>And the CI idea I actually care about (i.e., freeze a set of scenarios you replay every night or before a release, keep a cheap deterministic player as the floor, run an agent &#8220;manual tester&#8221; against the same scenarios, compare) only makes sense if the agent beats the free player on something you can measure: higher scores and longer runs on the same games. If it can&#8217;t, just run the free bot and save the tokens.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;899dbc59-2930-4255-8215-187a6f1cda1a&quot;,&quot;duration&quot;:null}"></div><h2>Setup</h2><p><strong>The games.</strong> The corpus is 21 Snake builds pulled from <a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about">half a year of Loop Lab Snake testing</a>: six from <a href="https://www.confidentcommit.com/p/cost-of-a-green-pr">cost-of-a-green-PR</a> calibration runs, ten from the <a href="https://www.confidentcommit.com/p/we-let-an-ai-agent-say-i-passed-was">CI vs no-CI study</a>, and five from the <a href="https://www.confidentcommit.com/p/afk-builds-with-100-green-prs-chunk">Chunk sidecars / 100% green PR runs</a>.</p><p>Same spec, different agent runs, so 21 slightly different versions of one app. Food uses each game&#8217;s own random spawner (Math.random, like a real browser session), so no two runs see the same food sequence. Runs end at death, with two safety valves: a 10,000-tick ceiling and a stuck detector that kills a run after 2,500 ticks with no score change. A tick is one step of the game clock, one move.</p><p><strong>The shared move surface.</strong> Before either player picks a direction, a shared scorer looks at the board and grades every option. That scorer lives in one file (evaluate.ts) that both the greedy bot and Jev read from, so the rules can&#8217;t drift between them. For each direction it reports:</p><ul><li><p><strong>Fatal or not:</strong> reversing into your own neck, hitting a wall, or hitting your body</p></li><li><p><strong>Distance:</strong> how far the next square is from the food</p></li><li><p><strong>Space:</strong> a flood-fill count, meaning how many open squares the head could still reach from there</p></li><li><p><strong>Need:</strong> snake length plus two (plus one if the move eats), the room a snake needs to not box itself in</p></li><li><p><strong>Escape routes:</strong> how many safe moves exist <em>after</em> this one</p></li></ul><p>Those are the bumpers.</p><p><strong>SAFE</strong> means a direction that is not fatal on this tick: it won&#8217;t reverse into the neck, walk off the grid, or land on the body.</p><p>The players:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AeWc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AeWc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 424w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 848w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 1272w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!AeWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png" width="1256" height="526" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:526,&quot;width&quot;:1256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88712,&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/223193693?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.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_!AeWc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 424w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 848w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 1272w, https://substackcdn.com/image/fetch/$s_!AeWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b5d7bc-b5c7-414d-971e-1f05ba98a50e_1256x526.png 1456w" sizes="auto, 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>Here&#8217;s the heart of what Jev sees each tick, in plain English, expressed as human-readable intent. Only SAFE directions are listed. Then:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;6ffd35f5-c785-430f-bc8f-fe44f0bcbd92&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Among the listed SAFE choices:
  1. Prefer moves that still have an escape after this one.
  2. Prefer roomy squares (enough open space for the snake's length).
     If every option is tight, don't take food when a roomier non-food
     move is on the list.
  3. Among what's left: closer to food, then more open space,
     then keep the current facing on ties.
Pick exactly one listed direction.</code></pre></div><p>That&#8217;s it. The model makes the final call.</p><p>The <strong>Jev strategy</strong> profile specifically adds four short tactics on top: keep an escape into open space, don&#8217;t hug walls early, don&#8217;t cut off your own tail, break distance ties toward open space or the center. On average, those tips bought nothing on the scoreboard. Different tips might. That&#8217;s a future experiment.</p><p>The alternative is the <strong>Greedy</strong> player: lengthy JavaScript that encodes the same procedure as hard-coded branches, and has to be extended and maintained every time you want a smarter heuristic.</p><p>Jev gets the procedure as readable policy text, plus the scored candidates from evaluate.ts. Same bumpers. Less glue code to own.</p><p>Jev ran as jev-latest through Typesafe&#8217;s System One API, one call per tick, answering a single multiple-choice question: which direction? Only safe moves were offered whenever any existed. If Jev ever answered with a move outside that list, Understudy swapped in greedy&#8217;s pick for that tick.</p><p><strong>Variables.</strong> Changed: the player. Held constant: the 21 builds, the move surface, the safe-move filter, one decision per tick, and the run caps.</p><p><strong>Cost.</strong> Greedy runs free on my laptop&#8217;s CPU. Both Jev passes together cost about $12 on my personal Typesafe account, covering more than 109,000 decisions.</p><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_!VEB6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VEB6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 424w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 848w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 1272w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!VEB6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png" width="1260" height="652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a09ccc47-5510-4712-894e-0e28f486970a_1260x652.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1260,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104522,&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/223193693?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.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_!VEB6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 424w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 848w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 1272w, https://substackcdn.com/image/fetch/$s_!VEB6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa09ccc47-5510-4712-894e-0e28f486970a_1260x652.png 1456w" sizes="auto, 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>All 21 games finished at a normal game over for both Jev profiles. Greedy is $0 (i.e. FREE) CPU on my laptop, including all 105 runs. Each Jev profile was one pass over the 21 games at about $6; both together about $12 on my personal Typesafe account.</p><p>Quick unit math on that bill, using the run totals (one API call per tick, so ticks &#8776; decisions):</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eggt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 424w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 848w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 1272w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eggt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png" width="1258" height="294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:294,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37767,&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/223193693?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.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_!Eggt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 424w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 848w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 1272w, https://substackcdn.com/image/fetch/$s_!Eggt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f1b08e-6e0f-4c9d-8250-b01f463c748e_1258x294.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p>So: about <strong>29&#162; per game</strong>, and about <strong>11&#162; per thousand decisions</strong>. Cheap for a nightly corpus job. Still a real line item if you fire it on every commit.</p><p>Head-to-head, Jev strategy against Jev parity on the same 21 games:</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z94y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 424w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 848w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 1272w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z94y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png" width="1258" height="232" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:232,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35364,&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/223193693?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.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_!Z94y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 424w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 848w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 1272w, https://substackcdn.com/image/fetch/$s_!Z94y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35d5a18e-1e66-42f4-9f9b-c789f58479fc_1258x232.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p><strong>NOTE:</strong> One run went sideways. Strategy&#8217;s first try on one game variant ate only one food pellet, then circled the next random food pellet for 2,516 ticks without scoring until the stuck detector ended it at a score of 1. No API errors. Every move stayed on the safe list. Since that low score was merely bad luck due to bad luck with food placement, I archived that replay and reran the game: 106. The table uses the rerun. If I had kept the score of 1 instead and strategy&#8217;s mean dropped to 89.5, it would still be well above greedy and still no better than parity.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;da43395a-78d4-4983-b6e7-f2502320a510&quot;,&quot;duration&quot;:null}"></div><p>By the way, the above anomaly is not necessarily a problem with the Jev strategy prompt, but rather a limitation of attempting to automate a human in the loop. A human being would never play a game like that.</p><h2>What a CI pipeline config would read</h2><p>Every run writes a trace (JSON, every tick) and a self-contained replay page that opens in any browser. That&#8217;s the raw material for a CI gate. I have not wired this into a pipeline. The sketch below shows the shape, and the gate script in it doesn&#8217;t exist yet:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;c8211424-f867-4669-a052-1ef9b704bae2&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># Sketch only. score-gate.mjs is hypothetical.
jobs:
  understudy-play:
    docker:
      - image: cimg/node:22.13
    steps:
      - checkout
      - run: pnpm install
      - run: pnpm sim:batch -- --player greedy --results-name control
      - run: pnpm sim:batch -- --player jev --results-name agent
      - run: node scripts/score-gate.mjs --floor control --candidate agent
      - store_artifacts:
          path: results</code></pre></div><p>The control run sets the floor. The agent run has to clear it. The replays go up as <a href="https://circleci.com/docs/artifacts/">build artifacts</a> so a human can watch the worst game in a couple of minutes instead of replaying all 21 by hand.</p><h2>TL;DR</h2><p><strong>The lab claim held.</strong> With identical bumpers, Jev outscored a strong hand-coded bot by about 22 points per game and lived roughly 900 ticks longer. That wasn&#8217;t one hot streak either: parity beat greedy&#8217;s per-game average on 19 of 21 builds.</p><p><strong>So here&#8217;s my recommendation.</strong> If you&#8217;re choosing between hand-coding a bot and paying a human to click through every build, a decision model is worth a serious look as the stand-in. The policy is a paragraph of readable text, not a pile of branches you maintain forever, and it played better.</p><p><strong>Coaching it to &#8220;think strategically&#8221; hit diminishing returns.</strong> That&#8217;s the secondary finding, not the headline. My quick four-tip prompt left the average flat: parity and strategy split 9 to 9, with strategy about 0.6 points behind. The best and worst games did nudge up (70 / 128 against parity&#8217;s 66 / 119, counting the rerun), but on one pass per profile I won&#8217;t call that a win.</p><p>My read: most of Jev&#8217;s edge comes from weighing the features it&#8217;s handed, so put the knowledge in the state you pass it (escape routes, open space) before you write a paragraph of advice. The right coaching might still help. These four tips weren&#8217;t it, and I need more runs before I say anything definitive.</p><p><strong>The practice claim is an implication, not a measurement.</strong> Nothing here ran inside a CircleCI pipeline. But the shape works: frozen scenarios, a free deterministic control, an agent player, scores plus replays (as HTML artifacts). I&#8217;d use it when:</p><ul><li><p>The question is &#8220;can somebody get through this?&#8221; and you can score it (a game, a checkout flow, a signup)</p></li><li><p>You have a fixed scenario set the agent replays every night or before a release</p></li><li><p>You want a human to watch a two-minute replay of the worst run, not click through everything</p></li></ul><p>Btw, watching a snake circle one food pellet for 2,516 ticks until the stuck detector fires is the best part of the job. Same for the unwinnable food placements: maybe a game should never spawn food you can&#8217;t reach. Every replay artifact teaches something. None of them were written by hand. 100% of them were written by my Understudy agent.</p><p><strong>I wouldn&#8217;t use Understudy on every push of every PR.</strong> One API call per tick, in sequence, takes hours per corpus pass, and tokens are the tax the free control never pays. $12 for 42 full games is cheap for a nightly job. Per commit might get a bit pricey, depending on the app.</p><p><strong>I also wouldn&#8217;t ask Understudy about taste.</strong> A high Snake score means the game is playable to the end. It says nothing about whether the game is ugly, confusing, or fun, although we are still working on that.</p><p><strong>Limits, plainly:</strong> one Jev run per game against five for greedy, one app shape, and no quality-judge pass on these traces yet. I stopped after one full corpus pass per Jev profile because the gap over greedy was already clear and the token bill is real. More replicates would tighten the error bars. They would not change the headline.</p><p>A better next step than burning five times the API spend is pointing the same pattern at an app with screens to click through instead of a snake to steer. That&#8217;s the next experiment.</p><p>Bumpers keep the ball out of the gutter. A human in the loop still has to watch the replay. Understudy&#8217;s job is making sure there&#8217;s a replay worth watching before that human ever gets involved.</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[Agents will find your docs. Have you checked if they're still right? ]]></title><description><![CDATA[Here&#8217;s what happened when I tested our onboarding flow and found that agents have multiplied the paths into our product (and the docs that need checking).]]></description><link>https://www.confidentcommit.com/p/updating-agent-skills-and-docs</link><guid isPermaLink="false">https://www.confidentcommit.com/p/updating-agent-skills-and-docs</guid><dc:creator><![CDATA[Rosie Yohannan]]></dc:creator><pubDate>Fri, 30 Oct 2026 02:01:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/403a1c0a-814c-410e-a4dc-8f116532f507_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I found this problem by accident. I was reviewing our onboarding docs, which we try to do fairly regularly because the processes change.</p><p>In the past, that kind of review meant walking through the process set out in the existing docs myself, and taking notes and screenshots for each step in order to find gaps and outdated content. This job has expanded over recent months. The paths into a product have multiplied: People, or agents, might be doing everything from the terminal. You might use a skill, a plugin with your agent, or ask your agent to use the CLI, APIs, or MCP. There are now many ways to get set up, and I had to understand each to make sure we have them documented correctly.</p><p>So instead of just screenshotting the app, I planned to draw up journeys in a Figma file for each of the different ways you can get a project set up, with screenshots or a note of the command and outcome at every step.</p><p>Partway through, something odd happened. I had previously installed the CircleCI plugin while working on docs about how to use it. Since this is how Claude is designed to work (pick up cues from our interactions and decide how to best approach the task), my Claude session found it, decided it was relevant, and used it without my asking. It then sent me to a URL that doesn&#8217;t exist. Meanwhile, the CLI running in the same session had shown me a list of my orgs and asked me to pick one.</p><p>Three things didn&#8217;t add up:</p><ul><li><p>I&#8217;m used to Claude knowing which org I&#8217;m in, so being asked for one felt off.</p></li><li><p>The plugin sent me to a browser, outside the loop of what Claude and I were working on.</p></li><li><p>The CLI could already do what the plugin was asking me to do elsewhere. It lists your orgs, and it can create one, so there was no reason to open a browser and click through a bunch of buttons.</p></li></ul><p>Put together, these pointed to one conclusion: <strong>Claude was following stale instructions.</strong> The skill and the tool had drifted apart, and Claude followed the skill.</p><p>What I can&#8217;t tell you is how the skill got that way. It may have been written by an agent that made up the URL, or a review may have been missed, or the URL may once have existed and since been removed. Whichever it was, the result for me was the same.</p><p>Claude gave no sign that anything was wrong. Agents don&#8217;t signal uncertainty when they follow stale skills. It didn&#8217;t say &#8220;I found a skill, it might be out of date, here&#8217;s what it says.&#8221; It just followed the skill. The skill had become invisible infrastructure: something I didn&#8217;t know was running until it sent me somewhere wrong. With default settings, even when skills are packaged as plugins with versioned releases, an agent or human user won&#8217;t automatically know their skills are outdated, unless the individual user has previously opted into that configuration.</p><p>Today, I&#8217;ll be sharing how I worked through this challenge.</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>Hypothesis</h2><p>I went in with a simple hypothesis: <strong>a Claude session with a relevant skill installed would perform at least as well as the underlying tool.</strong> Skills are supposed to give agents richer context than a --help flag alone, so I expected the plugin path to match the CLI at minimum, and probably improve on it.</p><p>That hypothesis was wrong. The skill-assisted session did worse than the CLI, and it did so without telling me. Several assumptions sat underneath my hypothesis, and each one fell apart:</p><ul><li><p><strong>I assumed a skill would stay in step with its tool.</strong> I didn&#8217;t realize a skill could drift from the underlying tooling in such an extreme way, or that it could happen so quickly.</p></li><li><p><strong>I assumed I&#8217;d know when a skill was running.</strong> I&#8217;d forgotten I had the plugin installed at all, since I&#8217;d added it for a different line of work. In a natural-language chat, you don&#8217;t know what the agent is doing unless you check.</p></li><li><p><strong>I assumed the agent would choose sensibly between sources.</strong> The skill took precedence over the CLI, and nothing told me it had.</p></li><li><p><strong>I assumed there were only a few ways to get set up.</strong> There were far more paths than I&#8217;d expected, and they behaved very differently.</p></li></ul><p>Being wrong meant changing how I tested. I&#8217;d assumed the plugin&#8217;s instructions would stay in step with the CLI, so I&#8217;d treated the two as interchangeable. They aren&#8217;t. Each way of getting set up can drift on its own, so each one needs its own test.</p><h2>Setup</h2><p>It became clear that I would need to check all of the different ways to set up my project. I began with just the CLI in my terminal. I asked Claude to run through the steps using only the CLI, the underlying tooling, being explicit about which parts of the product to use. I asked Claude to enable the CLI MCP and get set up. All while noting the steps in my Figma file.</p><p>The conditions for the test were simple: I already had a CircleCI account, I was admin of an org, and I had a generic GitHub project with no CircleCI config. The task was just to set up that project, with my orgs already in place. It shouldn&#8217;t have been difficult.</p><p>I tested three (of many) paths for the same task:</p><ol><li><p>CLI directly in the terminal</p></li><li><p>CLI in a Claude Code session, no plugin installed</p></li><li><p>Claude Code session with the public CircleCI plugin installed (<a href="https://github.com/CircleCI-Public/skills">https://github.com/CircleCI-Public/skills</a>)</p></li></ol><p>In the third session, the plugin&#8217;s onboarding skill loaded without my explicitly invoking it. Claude found it, treated it as authoritative, and followed it.</p><p>I&#8217;d expected the three paths to feel broadly similar. It surprised me how different they were. To get through the process with the skill, I had to report the issue to the engineering team, ask for the problem to be fixed, and then go back and check that it was working.</p><p>It didn&#8217;t stop me from doing the work. The how-to guide I was updating doesn&#8217;t explicitly say &#8220;install the plugin, tell your agent to do this,&#8221; so I could carry on. But I had to pause, report to the team that something was off, and return to it later.</p><p>This would have come up eventually, and it might well have been a customer who hit it first. Writing or updating guides is a common way to uncover bugs, and catching them before customers do is one of the ways the docs team can bring the voice of the customer back to engineering teams directly.</p><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_!f72q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f72q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 424w, https://substackcdn.com/image/fetch/$s_!f72q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 848w, https://substackcdn.com/image/fetch/$s_!f72q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 1272w, https://substackcdn.com/image/fetch/$s_!f72q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!f72q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png" width="1256" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:1256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74867,&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/222410419?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.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_!f72q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 424w, https://substackcdn.com/image/fetch/$s_!f72q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 848w, https://substackcdn.com/image/fetch/$s_!f72q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 1272w, https://substackcdn.com/image/fetch/$s_!f72q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79d9d22-45fb-4ab1-a686-ecc736621c62_1256x450.png 1456w" sizes="auto, 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>The results clearly showed that the skill and the CLI had diverged. The CLI had been updated to handle org selection in the terminal. The skill still pointed to a browser flow with a URL that didn&#8217;t exist. Claude had no way to know which was fresher. It used what it found.</p><p>As mentioned earlier, Claude also asked me for an org slug (something the CLI can already see when I&#8217;m authenticated) and wanted me to create a new org in the app, at a URL I didn&#8217;t recognize. I&#8217;m quite familiar with our URL patterns, and from working on the CLI docs, I know the CLI and API can create an org. There should have been no clunky opening of a browser and clicking of buttons.</p><p><strong>Note:</strong> The agentic experience team has since fixed the skill. Instead of sending users to a broken URL in a browser, the agent now prompts them to pick an org in the session, so no URL is needed.</p><h3>What this says about our docs</h3><p>Many of our user guides were written from the viewpoint of clicking buttons in the web app. Today, we need to document more use cases for using our tools from a terminal. The fact is that every guide needs reviewing from the point of view of an agent doing the work, with a human in the loop or without one.</p><p>That&#8217;s a different level of review. You can get agents to write your docs for you, but you still need to check that they&#8217;re correct for the various ways your audiences work. Today, there are a lot more steps to cover, and getting through the work quickly and accurately is the challenge.</p><h3>What happened to my Figma file</h3><p>To record each journey, I&#8217;d been building a Figma file with screenshots of every step, or a small box with the command and outcome at each step from A to B. By the time I finished and found this problem, the &#8220;Using the Skill&#8221; section of the Figma was out of date the same day I created it. The artifact is still useful as a reference but by no means a static source of truth to build on. It&#8217;s a snapshot in time that will need to be constantly reviewed, just like the doc itself. A scratchpad.</p><p>It was a useful exercise, but the artifact that ultimately matters is the documentation, and even that may be a losing battle because the skills have already changed. I probably wouldn&#8217;t do it that way again.</p><p>Ideally, we&#8217;d move to automated docs generation from the code, with an added human review to confirm the reality of the experience. The challenge will be extracting what parts of this process we can optimize and automate for speed of delivery to keep things consistently up to date. However this rolls out, the most reliable way to ensure that docs are correct will always be returning to the product as it is, on the day of the update.</p><h3>Keeping docs from going stale</h3><p>Rather than constantly rebuilding Figma journeys, I&#8217;d now lean on a few other things:</p><ul><li><p><strong>Community feedback, which now includes agents.</strong> An agent could report, via an integration with our chatbot, something like &#8220;when I was answering this customer question, I couldn&#8217;t give them an accurate answer because...&#8221;</p></li><li><p><strong>An agentic review on a rolling basis</strong>, so docs don&#8217;t go stale between manual passes.</p></li><li><p><strong>Watching for changes in the relevant codebase </strong>and automating change requests in the corresponding docs. For example, the code change could flag an integration to create a Linear ticket, the agent would read the ticket scope and draft the change, and finally a human would review the change against real product use.</p></li></ul><h2>TL;DR</h2><p>Every public skill, MCP description, or structured doc you&#8217;ve published is now part of your agent surface, and agents will act on it as written. Skills are instructions for agents, so they need an owner who updates them whenever the tool changes, just like product docs.</p><p>The practical check: when did you last run your own onboarding flow with a plugin installed? The people maintaining the CLI aren&#8217;t always the people maintaining the skill, so the two can disagree without anyone noticing.</p><p>The app&#8217;s UI text, the skill, and the docs all carry the same instructions now, and every copy has to match; both each other and how the product actually works.</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><p></p>]]></content:encoded></item><item><title><![CDATA[We stopped doing migrations by hand. A bot does them now.]]></title><description><![CDATA[How a scheduled CircleCI pipeline with LLM-powered fixers replaced hundreds of manual pull requests&#8230; and keeps running forever.]]></description><link>https://www.confidentcommit.com/p/automate-code-migrations-llm-pipeline</link><guid isPermaLink="false">https://www.confidentcommit.com/p/automate-code-migrations-llm-pipeline</guid><dc:creator><![CDATA[Claire Alvis]]></dc:creator><pubDate>Wed, 21 Oct 2026 14:01:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fe965e5a-c75d-4bf8-87c6-a2bfedf8d597_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few months ago, an engineer asked me if we could batch-migrate all our internal repos to use gen2 executors. The old way would have meant someone opening over a hundred pull requests by hand, one repo at a time, then chasing teams to merge them. Instead, I wrote a prompt, triggered a pipeline, went back to my other work, and by the next day there were 150 open PRs across the org with the change already made, reviewed by me, and ready for each team to merge at their own pace.</p><p>The pipeline is still running.</p><p>When new repos appear, they get fixed too.</p><p>That pipeline is the repo fixer. Here is how it works and why I think the pattern is worth stealing.</p><h2>Hypothesis</h2><p>Every codebase accumulates patterns that made sense at the time and don&#8217;t anymore later on. Hardcoded image tags. Old resource classes. Config patterns that predate a better standard. Everyone knows these should be cleaned up. Nobody does it because the cost is too high: you have to touch every repo, write the same PR description forty times, and then wait for forty teams to review something trivial.</p><p>My hypothesis was that LLMs would be good enough at narrow, targeted transformations to make this class of work economically viable again. Not &#8220;write me an application&#8221; prompts. Specific, bounded prompts: &#8220;find config files that reference this executor, update them to use this one instead, explain what you changed and why.&#8221; If that worked, and if I made it easy enough for other engineers to define their own fixers, people would use it without being asked.</p><p>Both turned out to be true.</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>Setup</h2><p>My process always reflects a focus on &#8220;the customer&#8221;; in this case the customers were my fellow teammates, divided into 2 distinct groups:</p><p><strong>Customer 1: The SME who knows the fix needs to happen but doesn&#8217;t want to make the PRs.</strong> They write the prompt once, defining what the broken pattern looks like and how to fix it. That&#8217;s the end of their work. They never touch a repo directly.</p><p><strong>Customer 2: The engineer responsible for actually merging the fix</strong> in their repo. They get a well-described draft PR from a bot user, can review it quickly, and merge on their own schedule without being chased.</p><p>I consciously built for both from the start.</p><p>Repo fixer is a CircleCI pipeline that runs on a schedule across every repo in the org. The engineer who knows a fix needs to happen writes a fixer once. After that, the pipeline handles everything.</p><p>Each fixer has two phases.</p><p>The first phase is detection. Before spending money on an LLM, the pipeline checks whether this repo even needs the fix. This is done with cheap tools: bash, grep, or a code search query. If the pattern isn&#8217;t present, the fixer exits immediately. Most repos exit here. You only pay for the LLM on the repos that actually need work.</p><p>The second phase is the fix itself. If detection passes, the pipeline runs the fixer, which is defined as a bash script, an LLM prompt, or a combination of both. The prompt is written by the person who knows the codebase pattern best, so it&#8217;s specific. When the gen2 migration ran, the prompt knew exactly which executor names to look for, what to replace them with, and what edge cases to watch for.</p><p>It&#8217;s worth noting that the gen2 fixer used an LLM prompt, but it could have been written with ast-grep or bash tools with more work. LLMs handle edge cases you didn&#8217;t even think of very well and I knew that it would only run once because of the gating detections, so I decided that LLM prompt was the way to go here. I could have spent hours finding and tuning the script to work on all the edge cases but&#8230; I didn&#8217;t have to.</p><p>When the fixer decides to make a change, it commits the diff and opens a PR as a bot user. Using a bot user means any engineer on the team can approve and merge the PR. If the author opened it, they couldn&#8217;t merge their own work, which would make the whole point moot.</p><p>The PR includes everything a reviewer needs: what changed, why, which fixer generated it, and a link to context. PRs open as drafts by default. I review them in bulk before they go out, then pass them off to each team. That review gate is not optional. When you&#8217;re opening hundreds of PRs at once, you need to QA the output before creating noise for everyone downstream.</p><p>There are also two Claude skills for managing the system day-to-day: one to trigger a fixer immediately instead of waiting for the next scheduled run, and one to view and triage the PRs that are waiting to be merged.</p><p>Personally, I&#8217;m not a &#8220;wait to act until it&#8217;s perfect&#8221; person. I&#8217;m a &#8220;get something working and then iterate&#8221; person. So the tooling itself went through several iterations.</p><p>The first version was a pile of bash scripts. Moving it to a Go binary made a real difference: writing a new fixer became a much better experience for the subject matter expert, which is the whole point. If defining a fixer is painful, people won&#8217;t write them. The PR descriptions also evolved. The first version shipped with an empty description. It now includes a disclosure that the change was generated by a tool, signed commits, and enough context that a reviewer can approve it in under a minute.</p><p>The inspiration for the pattern was Sourcegraph batch changes. The key difference is that repo fixer keeps running on a schedule forever. Batch changes are a one-time operation. Patterns keep appearing in new repos, so a one-time run puts you back where you started six months later.</p><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_!3rQM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3rQM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 424w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 848w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 1272w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!3rQM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png" width="1262" height="322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:1262,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48478,&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/219646877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.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_!3rQM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 424w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 848w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 1272w, https://substackcdn.com/image/fetch/$s_!3rQM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a8a3f60-e7e2-4828-a6c4-12af0c67a57c_1262x322.png 1456w" sizes="auto, 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>The cleaner result is behavioral. I expected to have to suggest the repo fixer to people. For the first few fixers, I did. Now engineers come to me asking to add one. The SME who knows a pattern needs fixing writes a prompt, and their work is done. The PRs appear on a schedule without them doing anything else.</p><p>One thing that caught me off guard: not all of our repos had the same default branch. The pipeline had to handle that variation, which wasn&#8217;t something I had thought through on the first pass. It&#8217;s worth building for early if you&#8217;re doing this across a large org.</p><h2>TL;DR</h2><p>The LLM is not the interesting part of this. The interesting part is the structure around it.</p><p>A detection pass before the LLM call is not optional at scale. If you skip it and run the prompt on every repo unconditionally, you burn money and slow everything down. The cheap filter is what makes the system viable to run on a schedule forever.</p><p>Draft PRs with a review gate before merge are also not optional. LLM-generated PRs at volume create a lot of noise. You need a way to verify the output before it lands in forty engineers&#8217; review queues.</p><p>The bot user pattern solves another big problem. If a human opens a PR, that human is now in the critical path for every merge. A bot user removes that dependency entirely. Anyone can approve. Teams merge on their own schedule.</p><p>And the scheduling matters more than I expected. The value of repo fixer is the tenth run, six months later, when a new repo appears with the old pattern and gets a PR the next morning without anyone having to remember to file a ticket.</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><p></p>]]></content:encoded></item><item><title><![CDATA[When MCP is present, it always wins]]></title><description><![CDATA[An experiment reveals that agents ignore explicit CLI instructions when MCP is available. The fix? Prompt engineering, not tool configuration.]]></description><link>https://www.confidentcommit.com/p/mcp-vs-cli-prompt-engineering-agents</link><guid isPermaLink="false">https://www.confidentcommit.com/p/mcp-vs-cli-prompt-engineering-agents</guid><dc:creator><![CDATA[Joaquin Sandoval]]></dc:creator><pubDate>Tue, 13 Oct 2026 15:02:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/92650724-6ccb-446f-94eb-9ffbdd4a56ab_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We wanted to help customers use the CLI to debug failing pipelines faster. So we added a button in the UI that copies a ready-made AI prompt. The idea: click the button, drop the prompt into your AI agent, and get a diagnosis without hunting through logs. The prompt was built around a new command, <code>circleci run get &lt;id&gt; --failure-report</code>, which pulls all the context you need about a failing job in a single call instead of several.</p><p>I had assumed this would be a slam dunk. But the numbers we saw on our analytics dashboard didn&#8217;t add up: More customers clicked the button than ended up running the <code>--failure-report</code> command. This was odd, given that the prompt explicitly told the agent to use it.</p><p>At the same time, in my daily work, I tried using the CLI for my own work to fix pipelines and review runs. And I started noticing that even if I told the agent to use the CLI, it would use the CircleCI MCP (which I also have installed).</p><p>It left me with a lot of questions. Was this a coincidence? Where were all these clicks going? Were customers using different tools? Was the prompt not working? Was it a CLI distribution problem? Or maybe there were other factors influencing this behavior: was it the available context? Hidden preferences in the agent&#8217;s system prompt? Was the CLI too confusing to use?</p><p>To answer these questions, I built some evals and began investigating.</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>Hypothesis</h2><p>My initial hypothesis was that the agent had certain preferences when it comes to which tools to use for each task (in this case, to fetch CI context). These preferences could be related to the model&#8217;s training (system prompt), the instructions given (prompt engineering) or to the available context for the agent. Which of these factors had an actual impact on the agent&#8217;s behavior, and why?</p><p>If we found what caused the agent to pick one tool over another, we could better design and distribute the tools we&#8217;ve been building for agents and engineers.</p><h2>Setup</h2><p>From my previous work, I had already set up a controlled environment with CircleCI tools that let me run evals on agent behavior and grade the results directly. I decided to reuse that project for this new behavioral experiment.</p><p>The task was simple: give the agent a failed pipeline URL and ask it to fetch and diagnose the error. Not fix it&#8230; just diagnose. That let me isolate the tool-choice behavior without mixing it with the ability to actually fix the problem (a whole different goal).</p><p>I set up multiple environments, varying two things:</p><p><strong>Tool availability:</strong> CLI only, MCP only, REST API only, and combinations (all three, CLI + MCP, CLI + API, MCP + API).</p><p><strong>Instructions:</strong> either free choice (use whatever tool you want) or an explicit instruction to use the CLI.</p><p>We had 10 different conditions. We ran each condition across 27 different samples using Claude-Sonnet-5 and recorded which tool the agent picked.</p><p>After viewing the initial results, I had some visibility on the preferences, but I was still missing the reasoning behind them. So I ran a second pass and added one line to the prompt: &#8220;Justify why you chose that tool.&#8221; I wanted the agent&#8217;s reasoning in plain language, not just the outcome.</p><h2>Results</h2><p>All the arms had a CircleCI Token for them to make authenticated requests to the API. This was mentioned to the agent in some experiments, and not in others, to analyze whether the agent tried to hit the API or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HD2J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HD2J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 424w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 848w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 1272w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HD2J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png" width="1256" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158452,&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/219640835?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.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_!HD2J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 424w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 848w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 1272w, https://substackcdn.com/image/fetch/$s_!HD2J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7576c46-67c7-4bc4-af02-1b096907b82e_1256x880.png 1456w" sizes="auto, 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>As you can see, there is a clear preference for MCP even when instructed to only use the CLI. When the MCP is available, it almost always goes that way. When not, agents showed a strong preference for the API over the CLI. Even when using the CLI, the API was still called a couple of times.</p><p>These results were already surprising. The hypothesis was somewhat correct: agents do prefer MCP over any other tool. But we still did not know <em>why</em> they were picking those tools; we only knew that they did. So we added an extra step and re-ran the free-choice experiments, asking the agents to explain why they chose the tool they chose.</p><p>The agents provided the following explanation of why they were choosing the API over the CLI:</p><blockquote><p>&#8220;I&#8217;ll use the CircleCI REST API via curl since it gives structured JSON I can parse directly without needing interactive CLI auth setup.&#8221;</p></blockquote><p>And for choosing the MCP over the CLI when both were available:</p><blockquote><p>&#8220;MCP tools provide structured access to pipeline data without needing to construct API calls manually.&#8221;</p></blockquote><p>Both explanations are wrong about the facts. The CLI in our setup was already authenticated via CIRCLE_TOKEN. It has a --json flag that produces the same structured output. The agent didn&#8217;t know either of those things. The information existed, but since it wasn&#8217;t in the prompt, it was missed.</p><p>So we updated the CLI prompt to state three things explicitly: the CLI is pre-authenticated via CIRCLE_TOKEN, it supports --json for structured output, and here are the exact command examples.</p><p>We ran the experiment again. The agent started using the CLI. We went from 0% of sessions using the CLI to 100% of sessions using it, while others also kept using the API for additional context. Nevertheless, when the MCP was available, it was still the agent&#8217;s preferred tool.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U4Eb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 424w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 848w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 1272w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!U4Eb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png" width="1258" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:304,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63521,&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/219640835?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.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_!U4Eb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 424w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 848w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 1272w, https://substackcdn.com/image/fetch/$s_!U4Eb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269f80ab-1b7c-45f4-bd22-04a8df8ea180_1258x304.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><h2>TL;DR</h2><p>The agent isn&#8217;t reading your mind or your README. It&#8217;s making tool-selection decisions based on what&#8217;s in its context at the moment it has to choose. If that context is incomplete (if it doesn&#8217;t know the CLI is authenticated, or that --json exists), it will make a reasonable-sounding choice that happens to be wrong.</p><p>Two things follow from this.</p><p><strong>MCP schema presence outweighs instructions.</strong> When an MCP server is configured, its tool definitions are already parsed into the model&#8217;s context. That&#8217;s a structural advantage over a CLI that has to be described in prose. Telling the agent to use the CLI is fighting uphill against a schema the model has already internalized. If you want the CLI to win in a mixed environment, you have to make the CLI&#8217;s capabilities as legible as the MCP&#8217;s, which means prompt engineering.</p><p><strong>The agent&#8217;s wrong choice was entirely predictable from its context.</strong> It wasn&#8217;t hallucinating. It was reasoning correctly from incomplete information. &#8220;Doesn&#8217;t need interactive auth setup&#8221; is a reasonable thing to prefer, but it just wasn&#8217;t true in our environment, and our prompt didn&#8217;t say so. Once the prompt said so, the behavior changed.</p><p>The broader point: any time an agent is choosing between tools, the choice is a function of what it knows about each option at selection time. If you&#8217;re not getting the behavior you want, the first question is what the agent thinks it knows&#8230; and whether that&#8217;s accurate.</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><p></p>]]></content:encoded></item><item><title><![CDATA[Benchmarking System One models (Jev, Laya) before trusting them in CI/CD ]]></title><description><![CDATA[A small elevator simulator benchmark shows hosted and open-weight models still struggle to beat a simple rule zero-shot.]]></description><link>https://www.confidentcommit.com/p/benchmarking-ai-decision-models-ci-cd</link><guid isPermaLink="false">https://www.confidentcommit.com/p/benchmarking-ai-decision-models-ci-cd</guid><dc:creator><![CDATA[Fabio Ramirez]]></dc:creator><pubDate>Thu, 08 Oct 2026 17:25:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/928f7663-5579-4a48-a942-5238f72ac109_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Your pipeline makes small decisions all day: which runner takes this job, which tests to run for this diff, whether that failure deserves a retry, whether to ship. You&#8217;ve probably encoded them as thresholds, config, and a few heuristics you&#8217;re afraid to touch. That works until a flaky test, a saturated runner pool, and a release deadline all hit in the same minute, and the rule you need is the one nobody wrote.</p><p>Recently I&#8217;ve been curious about decision models: a newer kind of AI built to pick one option from a list, quickly and cheaply. Could one handle choices like these? Real pipelines are a hard place to find out, because you can&#8217;t replay the same Tuesday twice. So I decided to create a simulation.</p><p>A building shares the same pipeline problem with its elevators. The cars are your runners, the button presses are your commits, and a dispatcher has to pick a car for every call, instantly and forever. An elevator bank has a clean score (how long people wait) and can be replayed exactly. Add a rule for each new edge case and you end up with the same pile of special cases.</p><p>Like your pipeline, when it chooses well, no one notices. But when it chooses badly, people stand in lobbies, checking their watches, never knowing why.</p><p>What we can build is limited by the pieces we can ship. You can solve a surprising number of problems with plain rules, but every new variable multiplies the cases. A heavy group, a broken car and a meeting ending on the fifth floor can all arrive in the same minute. Write a rule for each combination, and soon you are tending a jungle, and somewhere in it there is always a case nobody thought of.</p><p>So the question behind this experiment is simple to ask and hard to answer: can we take a small part of what the language-model revolution has taught us, and use it to put smart, affordable parts into ordinary things, like the lift in an office? That is also why the benchmark is an animated building rather than a silent script: I want you to watch how quickly a few simple things turn into a moment nobody planned for.</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>Hypothesis</h2><p>We tested two decision models: TypeSafe&#8217;s Jev, a hosted model getting a lot of attention right now, and Laya, a small open-weight model you can run and train yourself. Our central hypothesis was that a small, affordable AI decision model could make a repeated, real-world choice (here, which elevator answers a call) as well as a well-tuned classic rule, but only under two conditions:</p><ul><li><p>First, the model has to be given the right information in the right form.</p></li><li><p>Second, a model built to be trained has to actually be trained, on the system&#8217;s own decisions.</p></li></ul><p>We did not expect these models to beat the rule. The question was narrower and more practical: what does it take to match the baseline you already have? That is the question a CI/CD team faces before handing decisions like runner selection or test selection to a model. Before it can improve on your rules, it has to equal them. We broke the idea into three testable hypotheses:</p><ol><li><p>For Jev, how we describe the cars matters as much as the model.</p></li><li><p>Out of the box, the open model is not ready: <a href="https://huggingface.co/helmo/laya">its makers call it</a> &#8220;a fast base to specialise, not a zero-shot decision engine&#8221;.</p></li><li><p>Fine-tuned on the building&#8217;s own decisions, the open model can reach the level of the best dispatchers.</p></li></ol><p>We explored these first on ten seeds, then re-tested the headline claims on fresh seeds (see &#8220;Then we checked&#8221;). Each one is tested in the experiments below.</p><h3>The contenders</h3><p>Decision models are a different kind of AI. A chat model writes; a decision model <em>chooses</em>. You send it the facts and a typed question with a set of options, and it returns one option, with a probability for every option, in a single step. There is no text to parse and nothing to make up. For elevators, the question is one per call: <em>&#8220;Which car should answer this hall call?&#8221;</em>, asked only among the cars that can legally take it.</p><ul><li><p>Jev is TypeSafe&#8217;s hosted decision model (TypeSafe calls it a <em>System One</em> model), reached through an API. It can&#8217;t be fine-tuned: &#8220;the same weights serve every account&#8221;.</p></li><li><p>Laya is Convai Innovations&#8217; open-weight model (Apache 2.0, 421 million parameters). You run it on your own machine, and you can train it.</p></li></ul><p>Both speak the same API, so we could send them byte-for-byte identical requests, with only the model name changed. That is rare in AI comparisons.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3e4615d6-7fc6-4988-bbac-30d288d859e4&quot;,&quot;duration&quot;:null}"></div><p><em>(to watch the video, ensure you&#8217;re reading this article in your web browser or Substack app.)</em></p><h2>The setup</h2><p>We built <a href="https://github.com/CircleCI-Research/elevator-decision-arena">Elevator Decision Arena</a>, an open-source benchmark that lives inside a simulation. It races two dispatchers side by side, in two copies of the same building, with the same passengers and the same surprises. The building and its traffic are simulated. The decisions are real: real algorithms, and real calls to both models. The results describe our simulated building, not any real one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZICi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZICi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZICi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:221871,&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/219451468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.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_!ZICi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 424w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 848w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!ZICi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f32131-eb6b-43c7-b1bf-c0b86db0b323_1600x1000.png 1456w" sizes="auto, 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><em>Jev (left) and base Laya (right) dispatching the same morning rush, 48 seconds in. Same building, same passengers, same moment; in both buildings, car 3 is out of service.</em></p><ul><li><p>Building: 24 floors and 4 cars. Two kinds of traffic: <em>Normal Traffic</em>, a steady day, and <em>Morning Wave</em>, a lobby rush with a heavy group, a broken car and a sudden crowd.</p></li><li><p>Seeds: a seed is a whole morning, replayed exactly. Every dispatcher faces the same people, and we compare them seed by seed. (This is the same idea as replaying the same commit history through two different pipeline configurations, so the only thing that differs is the decision-maker.)</p></li><li><p>Fixed decision time: every decision takes 0.25 s, whoever makes it, so only the quality of the choice counts.</p></li><li><p>Yardsticks: <em>Nearest-Car ETA</em>, a classic rule that sends the car with the lowest estimated arrival time (versions v1.2.0 and a load-aware v1.3.0), and <em>round robin</em>, which hands calls to the cars in turn, wherever they are.</p></li><li><p>Pinned versions: jev-1.13.0, checked on every answer; Laya at a reviewed commit, on a laptop GPU (Apple M4 Pro).</p></li></ul><h3>Experiment 1: How you ask matters</h3><p>We asked Jev the same question three ways. For each car, it read either raw numbers, friendlier words, or an arrival estimate worked out by our code:</p><ul><li><p>Raw: <em>floor 3.2, moving up, doors closed, 150 of 630 kg, 2 stops, 1 call</em></p></li><li><p>Words: <em>4 floors below the call, moving towards it, about a quarter full, 2 stops planned</em></p></li><li><p>Estimate: <em>arrives in about 9 s, about a quarter full (480 kg of room), 2 stops planned</em></p></li></ul><p>(These examples come from a hand-built test request, whose cars are larger than the simulator&#8217;s.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fkah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fkah!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 424w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 848w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 1272w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fkah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png" width="1268" height="456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:456,&quot;width&quot;:1268,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68874,&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/219451468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.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_!Fkah!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 424w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 848w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 1272w, https://substackcdn.com/image/fetch/$s_!Fkah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb82f5a76-0bb3-4b52-8909-b8c20a1fdd0f_1268x456.png 1456w" sizes="auto, 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>On raw numbers, Jev did about as well as taking turns. <a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13">TypeSafe&#8217;s own docs</a> explain why: Jev &#8220;is not a calculator&#8221;, and the advice is to &#8220;keep the arithmetic in code&#8221;. With the estimate, Jev came within a second of the classic rule, too close for ten seeds to call.</p><p>One caveat: the estimate is the classic rule&#8217;s own formula, and our question asks for the car that will arrive soonest. Jev is still free to prefer a slower car with room, but we handed it the key number. On 1,601 separate validation decisions, it picked the rule&#8217;s car 90.3% of the time.</p><h3>Experiment 2: The open model, out of the box</h3><p>We sent base Laya the same raw-number requests, untrained.</p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HtaQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 424w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 848w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 1272w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!HtaQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png" width="1264" height="298" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:298,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48079,&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/219451468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.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_!HtaQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 424w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 848w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 1272w, https://substackcdn.com/image/fetch/$s_!HtaQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd396d6-9e30-4cf5-ae63-b8e1a743521d_1264x298.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p>Used zero-shot, in our question format, base Laya did worse than round robin, a dispatcher that doesn&#8217;t even look at where the cars are. With the arrival estimate it improved (40.3 s and 50.7 s) but still trailed taking turns. On the 1,601 validation decisions it agreed with the classic rule 24.9% of the time, a little below a random pick.</p><p>None of this contradicts Laya&#8217;s documentation, which says base checkpoints are &#8220;near chance on typed-decisions zero-shot&#8221;. A fair reader could also point to our side: we wrote the question format, and in these runs the cars were always listed in the same order. Reading raw numbers, base Laya picked the first car on the list far more often than the rule would.</p><p>Where Laya already wins: it answers in about 40 ms on a laptop (Jev: about 200 ms over the network), costs nothing per decision, gives the same answer to the same request, works offline, and can be taught.</p><h3>Experiment 3: Teaching the open model</h3><p>We then taught Laya with the one thing Jev can never be trained on: the building&#8217;s own decisions, generated by the simulator. The seeds we raced on were never used in training.</p><ul><li><p><strong>Copy the rule (imitation):</strong> 4,382 decisions labeled with the classic rule&#8217;s choice; about 24 minutes on a laptop GPU. Agreement with the rule rose from 24.9% to 92.8%. In the races it waited 9.4 s and 7.3 s less than base Laya, on every seed, and came level with the rule and with Jev. A student who copies a teacher can, at best, reach the teacher, and that is what it did.</p></li><li><p><strong>Learn from outcomes (hindsight):</strong> At each decision the simulator tried every car, played 90 seconds forward, and labeled the car that led to the least waiting. A dispatcher acting on those labels was about 6 s better than everything, but it is an oracle: its forward plays see the real future, including who walks in next. Laya trained on those labels came out level again, and captured none of that gap. The labels knew the future; the model can only see the present.</p></li><li><p><strong>A model for another building:</strong> In a second building (12 floors, 3 cars, evening traffic heading down), the model we had fine-tuned on the first building&#8217;s decisions, with no training on this one, performed at the same level as the classic rule. A model trained only on the second building&#8217;s 2,109 decisions did far worse: it sent car 1 every time. Its 43% accuracy was misleading, because car 1 happened to be the correct answer in 43% of the training labels.</p></li></ul><h3>Then we checked, properly</h3><p>All of the above was exploration: we chose the best way to ask while watching the same ten mornings. When you look at the answer while you tune the question, you can fool yourself without meaning to.</p><p>So we wrote the tests down before running them, committed the plan to the repository, and only then made a single call. We did two runs, each on thirty fresh mornings nobody had ever run, with a correction for testing many claims at once, and a margin set in advance for what counts as &#8220;equal&#8221;: 1.5 seconds, smaller than the gap between the rule and taking turns. The plans, the results and the full analysis are public, in <a href="https://github.com/CircleCI-Research/elevator-decision-arena/tree/main/docs/confirmation">docs/confirmation</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3GTO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3GTO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 424w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 848w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!3GTO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png" width="1264" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163570,&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/219451468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.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_!3GTO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 424w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 848w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!3GTO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F214c34a7-4b9d-4ba3-b1b0-aabbd0334900_1264x1000.png 1456w" sizes="auto, 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>All thirteen pre-registered claims held, including the fine-tune&#8217;s level in the second building. The effects shrank a little on fresh mornings, as honest effects usually do. And shuffling the cars made no difference to the fine-tune either: it had learned the facts, not the positions.</p><p>Two things we report as we found them:</p><ul><li><p><strong>One earlier claim did not survive:</strong> On the first ten seeds, the fine-tune looked 1.6 s better than the load-aware rule in the second building. On fresh seeds it was simply level. We dropped the claim.</p></li><li><p><strong>Round robin surprised us:</strong> In the morning rush, taking turns was level with the classic rule and the best models, on both sets of fresh mornings. Simple things can be stronger than they look.</p></li></ul><h3>Speed and cost</h3><ul><li><p><strong>Speed:</strong> With Jev&#8217;s real 200 ms round trip counted in the simulation, it stayed within a second of the rule. For elevators, a blink doesn&#8217;t seem to matter.</p></li><li><p><strong>Cost:</strong> Jev costs about $0.00002 per decision at TypeSafe&#8217;s list price of $0.042 per million input tokens (as of October 2026; <a href="https://docs.typesafe.ai/models">pricing</a>). The whole study, about 25,000 Jev decisions, cost less than half a dollar. Laya and its fine-tunes cost nothing per call.</p></li></ul><p>For pipelines, this suggests that latency and per-decision cost may not be the main obstacle for decisions that happen between jobs, such as picking a runner or choosing a test subset, where a fraction of a second is small next to a build that takes minutes. We did not test this on real workloads.</p><h2>Results</h2><p>Across three experiments on ten seeds, and a pre-registered re-test on fresh mornings in which all thirteen claims held, the answer came down to a few things: how the question is asked, whether the model has been trained, and what it is measured against. Five lessons follow. They hold inside our simulated building, and any link to your pipeline is an analogy, not something we measured.</p><ol><li><p>What you show a model matters as much as the model. The biggest step came from giving Jev a number our code had already worked out.</p></li><li><p>Out of the box, the generalist wins. Jev was sensible from day one; base Laya was not, as its makers say.</p></li><li><p>A small open model can be taught to the level of a good rule in 24 minutes on a laptop, and then will run with no per-decision fees.</p></li><li><p>Beating the rule needs more than better labels. The model has to see something the rule ignores, such as recent calls on each floor. That is our next experiment.</p></li><li><p>Test on mornings you haven&#8217;t seen. Writing the test down first is cheap, and it is the difference between a hunch and a result.</p></li></ol><h3>Limits</h3><ul><li><p>A simulated building with made-up traffic, two building sizes and three traffic patterns. The comparisons hold inside this world, not beyond it.</p></li><li><p>&#8220;Equal&#8221; means within the pre-set 1.5 s margin, not identical. Results marked exploratory (the hindsight fine-tune, the collapse, real-latency runs, Jev vs Laya head to head) were not re-tested.</p></li><li><p>One base Laya checkpoint, one training recipe, one device. Other settings may do better or worse.</p></li><li><p>Identical requests are not identical chances: a model built to be fine-tuned, asked zero-shot in our format, was tested on our terms, not its own.</p></li><li><p>We did not test any CI/CD workload. The pipeline connections in this article are analogies drawn from the elevator results, not measured findings. Elevator dispatch also has one clean goal (average wait), whereas pipeline decisions often balance speed, cost and risk at once, which is harder to benchmark.</p></li></ul><h2>TL;DR</h2><p>In our small building, a simple rule held its own, and even plain turn-taking held its ground in the morning rush. Nothing here shows that decision models are needed yet. But these models are improving quickly, and I believe that for many everyday decisions a decision model will become the cheapest way to handle the cases our rules never imagined: the crowded minute, the broken car, the pattern nobody wrote down. That is my personal bet, not a finding. Only time can prove it, or prove me wrong.</p><p><strong>If you build and run pipelines, here is what we&#8217;d take from the experiment:</strong></p><ul><li><p><strong>Present the data well:</strong> Let your code compute the key number (an estimated wait, a queue depth, a historical duration) and let the model weigh it. Handing it raw metrics performed about as well as no intelligence at all.</p></li><li><p><strong>Benchmark against the dumbest baseline:</strong> Round robin tied the best approaches in the rush. If a trivial rule matches your model, you don&#8217;t need the model.</p></li><li><p><strong>Hosted generalist or small open model is a real trade-off:</strong> The hosted model was sensible from day one but can&#8217;t be customized. The open model was poor until trained, then matched a good rule, runs offline, and costs nothing per decision.</p></li><li><p><strong>Training on your own history has a ceiling:</strong> A model that learns to copy your rules will, at best, equal your rules. To do better it needs to see signals the rules ignore.</p></li><li><p><strong>Distrust a metric that looks like knowledge:</strong> A model that always picks the same answer can post an impressive accuracy number. Compare every score with what a trivial guess would get.</p></li><li><p><strong>Evaluate on data you haven&#8217;t tuned against:</strong> Write the test down first, run it on fresh data, and be ready to drop a claim that doesn&#8217;t hold up. One of ours didn&#8217;t.</p></li><li><p><strong>Latency and cost are probably not the blocker: </strong>A 200 ms network call didn&#8217;t hurt, and 25,000 decisions cost under fifty cents. Quality of the decision, and how you ask, are what matter.</p></li></ul><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><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[External memory cut our agent's flip rate by a third. Cost: 7% more tokens.]]></title><description><![CDATA[Adding a note-taking tool to a pipeline-fixing agent cut its inconsistent "flip rate" by a third, with no drop in fix rate or merge quality and only a 7% increase in token cost.]]></description><link>https://www.confidentcommit.com/p/reducing-ai-agent-nondeterminism-external-memory</link><guid isPermaLink="false">https://www.confidentcommit.com/p/reducing-ai-agent-nondeterminism-external-memory</guid><dc:creator><![CDATA[Joaquin Sandoval]]></dc:creator><pubDate>Tue, 06 Oct 2026 13:03:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d16e35b4-f2e9-4ca4-80ca-99e77aa664ab_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Internally, CircleCI has been focused on improving our platform for AI agents. As part of that focus, we&#8217;ve been running different experiments evaluating the performance of AI agents around a specific problem: fixing a broken pipeline (one of, if not the most common issue of our customers).</span></p><p><span>After ~45 experiments we reached a plateau: we were getting a consistent 85% +/- 3% pipeline fix rate in different runs, no matter how the agent fetched the failed pipeline context. As a result, we wanted to further examine the details of each run, asking ourselves the following questions:</span></p><ul><li><p><span>How many samples does the agent </span><strong><span>always fix?</span></strong></p></li><li><p><span>How many samples does the agent </span><strong><span>never fix?</span></strong></p></li><li><p><span>How many samples would </span><strong><span>switch fix-result</span></strong><span> run over run?</span></p></li></ul><p><span>The results were a surprise: 60% were always fixable, 15% were never fixed, and 25% would be fixed in some runs but not in others. We named the last share </span><strong><span>flip rate</span></strong><span>: the percentage of tasks whose outcome changes across repeated runs on the same input. A high flip rate means any single run is unreliable: differences between experiments may be noise rather than a real effect.</span></p><p><span>The next question became: Why? What changed across runs that caused this variation of outcomes?</span></p><p><span>We looked at the different fixes the agent did to these swapping samples and the answer was more simple than we predicted: This variation was a result of agentic non-determinism; the agent would sometimes come up with the correct solution, but sometimes it would miss certain aspects of the fix, or try something completely different. Note that this is distinct from hallucination since agents were not making up a fix; they were looking at different paths that seemed valid and landed in different places.</span></p><p><span>With this in mind, we moved on to creating a solution. How can we make more consistent fixes? Which tools can help with this? As we started researching what other people were doing, a trend emerged: Helping an agent better manage its memory/context reduces the unexpected behavior and creates better quality outputs.</span></p><p><span>For more information on the research we were consulting to inform our work, check out </span><a href="https://www.coderabbit.ai/blog/your-ai-agent-has-amnesia"><span>code rabbit memory</span></a><span> and </span><a href="https://mendral.com/blog/same-llm-different-agent#:~:text=Insights%3A%20a%20learning%20system"><span>Mendral</span></a><span>.</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>The agent fails to be consistent across runs, so giving the agent an external memory should help reduce this inconsistent work.</span></p><p><span>Before stepping into developing a full context graph or anything too complex, I decided to try the least complicated implementation: a simple note-taking tool. I anticipated that this would give the agent a way to annotate its most important findings and read them at will, thus producing better and more consistent output.</span></p><h2><span>Setup</span></h2><p><span>In designing the project&#8217;s structure, we wanted a way to prove that what we added actually had an impact. As I&#8217;ve mentioned in </span><a href="https://www.confidentcommit.com/p/we-cut-25-of-tokens-fixing-ci"><span>a past article</span></a><span>, I&#8217;m a fan of the scientific method and a big believer in repeatable structure. So, we designed this as a formal experiment with a baseline and a target to measure against. Also, due to the non-deterministic behavior of agents, we made sure to run the same experiment multiple times to validate that our results maintained across runs.</span></p><p><span>Two tools were added to the agent:</span></p><ul><li><p><span>A tool to save a note with a given key, similar to a dictionary.</span></p></li><li><p><span>A function to return all the stored notes.</span></p></li></ul><p><span>We tried three different setups: </span></p><ol><li><p><strong><span>Basic:</span></strong><span> Give the tools an instruction to &#8220;save each finding, read before finalizing&#8221;.</span></p></li><li><p><strong><span>Formal read protocol:</span></strong><span> Tools and instruction to read before diagnosis and before validation (mandatory).</span></p></li><li><p><strong><span>Auto-surface:</span></strong><span> When saving a note, it would return the full accumulated notes on every call, reaching context automatically.</span></p></li></ol><p><span>Across the 25% fix rate samples, we tested this against Claude Code with Sonnet 5, running each setup three times to measure actual flip rate. Each run started fresh, so no context is shared across runs. To measure success, we ran the real pipeline to capture outcome, and we also used an Agent-As-Judge (Claude Opus 4.6) to evaluate the quality of the fix, focusing on if it was &#8220;mergeable or not&#8221; (we call this &#8220;merge quality&#8221;).</span></p><h2><span>Results</span></h2><p><span>The three mechanisms reduce flip-rate on a certain level, producing more consistently passing pipelines across attempts, but fix rate and merge quality had a different behavior across setups.</span></p><p><span>Basic setup dropped on flip rate, but hurt on quality. Looking into the behavior of the agent, it was writing a lot, but it almost never read what it wrote. This affected the solution&#8217;s quality, dropping from 72% from the control experiment, to 60%.</span></p><p><span>The second setup was the other way around, it achieved the biggest reduction in flip-rate (from 50% to 25%) and quality remained the same. Adoption from the agent was visible too, with all the sessions reading the notes as instructed.</span></p><p><span>Finally, the third setup also decreased the flip rate to 30% and improved quality by a small margin, proving again that giving the agent a place to better manage its memory/context helps to reduce the uncertainty of its behavior.</span></p><p><span>Since the goal was also to have the smallest impact possible in token usage, we tested the second setup with the full dataset, three times, to measure actual impact on reducing the flip-rate without having regressions. The results can be found in the table 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_!G2v8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G2v8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 424w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 848w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 1272w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!G2v8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png" width="1258" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52519,&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/217144065?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.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_!G2v8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 424w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 848w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 1272w, https://substackcdn.com/image/fetch/$s_!G2v8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F759a65aa-383b-46f8-83ab-ae9a0d156479_1258x382.png 1456w" sizes="auto, 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 benefits are clear: reducing the flip rate by &#8531; without dropping fix rate nor quality, costing less than 10% more tokens per sample, and taking less than 5% more time.</span></p><p><strong><span>Sidebar: </span></strong><span>In a separate experiment, we found that testing with Claude Opus 5 showed a fix rate improvement of +5% and quality improvement of +7%, at 36% higher cost, which is worth knowing before switching models.</span></p><h2><span>TL;DR</span></h2><p><span>It is clear that nowadays we cannot rely only on the agent&#8217;s context to get the work done.</span></p><p><span>As problems grow, external memory tools do improve on achieving more consistent results. These experiments back up that trend: reducing the variability of results with only a 7% increase on token consumption is a really good deal, rather than using a bigger (more expensive) model with a bigger context window.</span></p><p><span>Our findings here mean we can now consider other memory tools in our day-to-day agent usage.</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><p></p><p><span><br></span></p>]]></content:encoded></item><item><title><![CDATA[I installed WordPress on a CI microVM. It turned into a plugin dev environment.]]></title><description><![CDATA[What started as a curiosity experiment turned into a surprisingly practical workflow for testing WordPress plugins across multiple PHP versions simultaneously.]]></description><link>https://www.confidentcommit.com/p/wordpress-plugin-dev-environment-chunk-sidecar-microvm-claude-code</link><guid isPermaLink="false">https://www.confidentcommit.com/p/wordpress-plugin-dev-environment-chunk-sidecar-microvm-claude-code</guid><dc:creator><![CDATA[Okamoto Hidetaka]]></dc:creator><pubDate>Thu, 01 Oct 2026 15:02:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/22a219ca-d29a-4322-8c71-b25f64a2de41_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Before joining CircleCI, I worked as a developer at a WordPress hosting company, mostly doing plugin development and maintenance. WordPress plugins need to work across multiple PHP versions, so verification was always complex. Spinning up a VM or Docker container per environment ate up local PC resources, and for small fixes it sometimes came down to pushing to CI and just hoping all PHP version checks passed.</span></p><p><span>Following my last role, I developed a personal habit: whenever a new runtime shows up (a microVM, AWS Lambda&#8217;s PHP runtime, etc.), I like to see if WordPress runs on it. Chunk sidecars (a remote microVM that&#8217;s usable with little burden on your local PC, right inside a dev session) felt like they could provide an ideal fit for my WordPress test.</span></p><p><span>This is how I used Claude Code to spin up a full WordPress environment inside a Chunk sidecar, what got in the way, and why the whole thing turned out to be more useful than I expected.</span></p><h2><span>Hypothesis</span></h2><p><span>Chunk sidecars are designed for inner-loop CI verification: sync your working tree to a remote microVM, run your tests or linting there, and validate before pushing. That&#8217;s the intended use. I wanted to see if the environment could hold something heavier.</span></p><p><span>My hypothesis was that Claude Code could set up a full WordPress installation inside a single sidecar with minimal input from me. WordPress normally wants MySQL, but running a second service inside a microVM meant more moving parts and more weight. SQLite (the same backend WordPress Playground uses) keeps the stack to one process. My assumption going in was that the lighter the environment, the better the odds the sidecar would hold.</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>Setup</span></h2><p><span>Chunk sidecars are designed to hand the contents of the microVM to an agent like Claude Code. So I delegated. I started by telling Claude Code the conditions: the snapshot ID of the microVM I wanted, and the requirement to keep the database lightweight. Claude Code can manage Chunk sidecar startup operations through the CLI, so I handed it the implementation from there.</span></p><p><span>Next came the database choice. A standard WordPress LAMP stack needs Apache, PHP, and a running MySQL or MariaDB instance. That&#8217;s a lot of moving parts for a verification VM. What is less widely known is that WordPress can swap its database backend to SQLite via the official SQLite Database Integration plugin; the same mechanism WordPress Playground uses to run WordPress entirely in a browser. I specified SQLite to keep the VM fast to start and easy to maintain.</span></p><p><span>Claude Code handled the setup: creating the db.php file, writing wp-config.php, and wiring the SQLite connection via the chunk command.</span></p><p><span>After 6 minutes, 42 seconds, WordPress was running inside the microVM.</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_!pQ6I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pQ6I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 424w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 848w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 1272w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!pQ6I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png" width="1262" height="672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:672,&quot;width&quot;:1262,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:100451,&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/216776555?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.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_!pQ6I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 424w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 848w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 1272w, https://substackcdn.com/image/fetch/$s_!pQ6I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0114a86-874b-481e-8ab2-b62cc822ee35_1262x672.png 1456w" sizes="auto, 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>Bonus data:</span></strong><span> A later experiment found that restarting from a snapshot (rather than building from scratch) took ~14&#8211;28 sec to reach a verified working state; roughly 27&#8211;29x faster than the from-scratch build.</span></p><p><span>Getting the sidecar up takes one command. There&#8217;s no image argument on this first run; nothing had been snapshotted yet, so a bare create provisions a fresh environment. From the second launch onward, you boot from the snapshot instead, with </span><code>chunk sidecar create --image &lt;snapshot-id&gt;</code><span>.</span></p><h2><span>Results</span></h2><p><span>WordPress came up cleanly. The next step was WP-CLI. Since the sidecar runs in an isolated VM with no inbound internet access, I wanted it for demonstration purposes rather than production use.</span></p><p><span>That is where Claude Code&#8217;s auto-mode stopped me:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;49d49354-20e7-4fc8-9c29-e01d40a12813&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Permission denied by the Claude Code auto mode classifier.
Reason: [Code from External] The agent downloads and executes a wp-cli.phar binary
from raw.githubusercontent.com (an external, agent-chosen source) ...</code></pre></div><p><span>Auto-mode will not download and execute external binaries on its own. I approved it manually, and the install proceeded. After that, things moved quickly:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f63e06d6-1f5b-41df-b67d-ff55ae52aecc&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">wp plugin install hello-dolly --activate
wp post create --post_title="Test post" --post_status=publish
wp post list</code></pre></div><p>Posts created, listed, plugin activated. Full WordPress environment, running inside a remote microVM, operated entirely through CLI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-nYt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-nYt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 424w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 848w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 1272w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!-nYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png" width="1258" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59549,&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/216776555?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.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_!-nYt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 424w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 848w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 1272w, https://substackcdn.com/image/fetch/$s_!-nYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6d4cdff-ad8d-49f2-83ff-749733a108dd_1258x380.png 1456w" sizes="auto, 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>Worth noting: I took a snapshot after the initial setup, then created a new sidecar from it and it came up already fully working (Apache running, WordPress serving over HTTP 200) without re-running any of the install steps. I also re-tested this separately with 5 restarts from a snapshot, all successful, previously-created posts still present each time.</span></p><h2><span>TL;DR</span></h2><p><span>I went in thinking this was a curiosity exercise. I came out realizing Chunk sidecars might be a serious option for WordPress plugin development.</span></p><p><span>Here&#8217;s why: once WordPress is set up inside the VM, you can snapshot that state. The next time you need the environment, it starts from the snapshot instead of from scratch. Combine that with Chunk sidecar sync to push your local plugin code into the running VM, and you have a tight loop: edit locally, sync to the sidecar, run PHPUnit there, get results. No Docker daemon pulling CPU on your laptop. No Vagrant box eating RAM.</span></p><p><span>The part that makes it interesting for plugin work specifically is parallel environments. Because sidecars are remote and lightweight, you can run multiple instances simultaneously against different PHP versions. That is harder to manage with a local Docker setup.</span></p><p><span>By way of proof: I built three snapshots (PHP 8.1 / 8.3 / 8.4, each with WordPress + SQLite Database Integration installed) and launched all three sidecars simultaneously. There were no conflicts: no port collisions, no resource contention&#8230; all three came up clean. Verified php -v on each matched the intended version, and each WordPress instance responded with HTTP 200.</span></p><p><span>One caveat: </span><code>.chunk/config.json</code><span> only holds a single </span><code>validation.sidecarImage</code><span> value. There&#8217;s no built-in way to map multiple snapshots to different PHP versions. So running this in practice means either passing </span><code>--image &lt;snapshot-id&gt;</code><span> explicitly each time, looking snapshots up by name via Chunk sidecar snapshot list, or wiring the IDs into a CI matrix config.</span></p><p><span>The auto-mode block on WP-CLI was worth noting too. It was auto-mode doing exactly what it is supposed to do: pausing before it runs an external binary it sourced itself, rather than executing it without asking. One manual approval, and it moved on. That&#8217;s the right behavior for an agent running in a verification environment.</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><p></p>]]></content:encoded></item><item><title><![CDATA[I cut CI failure context 40x using the --failure-report flag. Retries got cheaper, not fewer. ]]></title><description><![CDATA[Swapping raw CI logs for --failure-report cut failure context 40x with no change in retry count: cheaper to read, not fewer times reading it.]]></description><link>https://www.confidentcommit.com/p/circleci-failure-report-flag-cuts-ci-context-tokens-coding-agent</link><guid isPermaLink="false">https://www.confidentcommit.com/p/circleci-failure-report-flag-cuts-ci-context-tokens-coding-agent</guid><dc:creator><![CDATA[Ryan E. Hamilton]]></dc:creator><pubDate>Tue, 29 Sep 2026 15:03:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3a484556-0c0a-452f-9a00-45d52c87dde2_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>I handed a coding agent seven tasks and a classic </span><a href="https://www.confidentcommit.com/p/what-snake-games-have-taught-us-about"><span>Snake game spec</span></a><span>, then walked away from the keyboard to let it cook. AFK, start to finish. Every task iteration that cleared inner-loop checks got pushed, and the outer-loop CI pipeline ran on every one of those pushes.</span></p><p><span>When a pipeline came back red, the local fix loop got triggered: </span><strong><span>read the failure, patch it, push again</span></strong><span>.</span></p><p><span>That loop is where an AFK run burns dollars and wall-clock nobody budgeted for. And a fat slice of that bill is nothing more than the CI pipeline failure context we shovel into the model when the agent asks for it.</span></p><p><span>So I ran the build again and changed exactly one thing: what the fix agent reads when CI goes red. Push cadence held still. Same model, same task list, same expectation (a merge-ready </span><a href="https://www.confidentcommit.com/p/cost-of-a-green-pr"><span>green PR</span></a><span> at the end of the run).</span></p><p><span>One arm was given the entire raw CI pipeline failure output. The other got a compact, structured report from the following </span><a href="https://cli.circleci.com/"><span>CircleCI CLI</span></a><span> command: </span><a href="https://www.confidentcommit.com/p/we-cut-25-of-tokens-fixing-ci"><span>circleci run get --failure-report</span></a><span>.</span></p><p><span>Full pipeline failure output: </span><strong><span>~800,898 characters</span></strong><span>.</span></p><p><code>--failure-report</code><span>: </span><strong><span>~19,936</span></strong><span>.</span></p><p><span>About </span><strong><span>40x</span></strong><span> less stuff stuffed into the prompt.</span></p><p><span>Across both arms, fix loops stayed at </span><strong><span>3</span></strong><span>, and pipelines stayed at </span><strong><span>8</span></strong><span>.</span></p><p><span>That is the finding. </span><strong><span>Compact, structured failure context makes a retry cheaper. It does not, by itself, make retries disappear.</span></strong></p><p><span>Nothing here prevents the red. It makes the red cheaper to read.</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 the CI fix loop reads a compact, structured failure report instead of the whole log dump, CI pipeline failure diagnosis input tokens should drop. Retry count should not.</span></p><p><span>Same red pipelines fed to the fix agent. Thinner diet.</span></p><h2><span>Setup</span></h2><p><span>Same Snake build both arms. Seven tasks. AFK. Push after every task that cleared inner-loop checks.</span></p><p><span>The variable was failure shape, not how often we triggered outer-loop CI.</span></p><ul><li><p><strong><span>per-task-push (full log):</span></strong><span> when a pipeline went red, the fix agent fetched the </span><strong><span>entire CI pipeline failure output</span></strong><span>.</span></p></li><li><p><strong><span>per-task-push </span></strong><code>--failure-report</code><strong><span>):</span></strong><span> same cadence. Failures shaped with the </span><a href="https://cli.circleci.com/"><span>CircleCI CLI</span></a><span> command </span><code>circleci run get --failure-report</code><span>. Compact. Structured. Sized for an agent.</span></p></li></ul><p><span>Everything else that could wander, I tried to hold still: model, task list, merge-ready green PR at the end of the run.</span></p><h2><span>Results</span></h2><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jn9s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 424w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 848w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 1272w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jn9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png" width="1456" height="333" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:333,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85427,&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/215281325?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.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_!Jn9s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 424w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 848w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 1272w, https://substackcdn.com/image/fetch/$s_!Jn9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98d671c5-4725-49a7-8407-2c7834b5e707_1748x400.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p><span>Both arms finished green. Both still took the outer pipeline </span><strong><span>eight</span></strong><span> times. Both still ran the fix loop </span><strong><span>three</span></strong><span> times.</span></p><p><span>So why care about fewer failure-log characters if cost, wall-clock, pipelines, and fix loops look basically the same?</span></p><p><span>Because the totals are misleading.</span></p><p><span>Most of that ~$15 bill is the agent </span><strong><span>writing the game</span></strong><span>, not reading CI failures. That build cost jumps around run to run (call it </span><strong><span>$10 to $17</span></strong><span>). So even when we cut failure-log input from ~800k characters to ~20k, the total check can only drop about </span><strong><span>$1 to $2</span></strong><span>. Wall-clock barely moves either. Reading a thinner failure report might save milliseconds or seconds, not minutes.</span></p><p><span>The savings are still real on every fix. Every time the agent has to diagnose a red pipeline, you stuff ~40x less into the prompt. That is input tokens you do not buy. On this pair of runs the whole-run LLM bill moved from </span><strong><span>$16.75 to $14.27</span></strong><span>. Do not hang a strategy on that exact delta. Codegen variance is loud. The quiet, repeatable tell is the input diet: </span><strong><span>~800k &#8594; ~20k</span></strong><span> characters of failure context, with </span><strong><span>zero</span></strong><span> change in how often we came back for another CI pipeline run.</span></p><p><strong><span>Extremely detailed feedback on every attempt. Same number of attempts. Cheaper to read each time.</span></strong></p><h2><span>TL;DR</span></h2><p><span>--failure-report is graded comments, not the whole exam booklet: failed steps, condensed output, enough to fix without hauling the universe into the context window.</span></p><p><span>So treat it as hygiene. Use the flag. Always. Pull it from the </span><a href="https://cli.circleci.com/"><span>CircleCI CLI</span></a><span>, pipe it into the fix loop, point the agent at it, and stop letting that loop read raw logs. It belongs in any decent agent harness. For the longer cut on tokens and fix time versus raw logs, see the </span><code>--failure-report write-up</code><span>.</span></p><p><span>Cheaper retries are good. </span><a href="https://www.confidentcommit.com/p/cost-of-a-green-pr"><span>Zero retries are better</span></a><span>.</span></p><p><span>If the goal is a green PR in one take, this flag will not get you there. Showing the agent what CI will check </span><strong><span>before it writes product code</span></strong><span> will. That is </span><a href="https://www.confidentcommit.com/p/cost-of-a-green-pr"><span>a different experiment</span></a><span>, and it is the one that drove fix loops from 3 to 0.</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><p></p>]]></content:encoded></item><item><title><![CDATA[Schrödinger's prompt: Truncated or not, depending on when macOS was looking]]></title><description><![CDATA[macOS silently drops deep-link prompt content past 1,024 bytes, and whether your prompt survives depends on what the shell happens to be doing at that moment.]]></description><link>https://www.confidentcommit.com/p/macos-deep-link-prompt-truncation-1024-bytes-claude-code-terminal</link><guid isPermaLink="false">https://www.confidentcommit.com/p/macos-deep-link-prompt-truncation-1024-bytes-claude-code-terminal</guid><dc:creator><![CDATA[Rodrigo Palomares]]></dc:creator><pubDate>Thu, 24 Sep 2026 21:49:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a87d286e-54fe-4b25-9fa7-c114ff75fa34_1300x830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>Our team was working on a feature that required clicking a claude-cli:// link in the browser. We expected Claude Code to open with the prompt already typed in the box. Ours opened cut off mid-word: 1041 characters sent, 683 received.</span></p><p><span>Clicking the same link again sometimes worked. Same link, same machine, different result. Raise your hand if you love debugging exasperating intermittent issues! No one? Ok, let&#8217;s move on.</span></p><p><span>The prompt passes through a command line. Inspecting the running process showed a command line exactly 1024 bytes long, not 1025 or 1023. And software engineers know that a round number like 1024 points to a full buffer somewhere.</span></p><p><span>Breaking down the command:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;5f16cddf-8b2c-4d51-97f4-9606866494c8&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">113 bytes  program path + flags
911 chars  encoded prompt, all remaining data
---------
1024 bytes  hard stop</code></pre></div><p><span>Those 911 encoded characters unpack to 683 real ones, matching the truncated prompt character for character.</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>A browser click does not start Claude. The browser hands the URL to macOS, macOS hands it to the registered handler, and the handler opens a Terminal window and types a command into the shell, encoded prompt and all, as one long line.</span></p><p><span>So the prompt has to survive the connection between Terminal and the shell in that window. The same channel your keyboard uses.</span></p><p><span>That channel was the suspect. Stated plainly, the hypothesis had three parts:</span></p><ul><li><p><span>The channel holds about 1024 bytes. Anything beyond that gets dropped, with no error.</span></p></li><li><p><span>The drop only happens when the shell is not reading at that moment. A shell that reads continuously drains the channel and lets any length through, which would explain why the same link succeeds and fails.</span></p></li><li><p><span>Therefore the prompt survives only while </span><code>113 + encoded length &lt;= 1022</code><span>, or </span><strong><span>681 characters</span></strong><span>.</span></p></li></ul><p><span>The 681 figure came out of </span><code>(1022 - 113) / 4 * 3</code><span> before any test ran.</span></p><h2><span>Setup</span></h2><p><span>I could have planned many experiments, trying to foresee limitations and potential routes and optimize based on what I thought might be quicker and more robust. But I would always rather go directly into experimentation mode, invest that planning time in finding leads on the ground, and iterate from there.</span></p><p><span>So I started by manually replicating this intermittent issue. Once I found where Claude got an actual truncated prompt, I asked it (given the relationship we&#8217;ve built over the years, it feels weird calling Claude &#8220;it&#8221;, but for the sake of professionalism I&#8217;ll stick to that)  &#8220;</span><em><span>check the parameters/arguments used to open this Claude instance, and figure out why the prompt was only prefiled with this instead of the whole prompt</span></em><span>&#8221;. From there, I dove into the rabbit hole, scripting the browser&#8217;s behavior:</span></p><ul><li><p><span>Fire the same URL macOS would receive from a click</span></p></li><li><p><span>Snapshot running processes before and after</span></p></li><li><p><span>Capture the full command line of the launched process</span></p></li><li><p><span>Decode the prompt and compare received text with sent text</span></p></li><li><p><span>Kill only the processes the script started</span></p></li></ul><p><span>That script measures two hops: what the handler built, and what the launched program received. If the two differ, the loss happened in the terminal hop.</span></p><p><span>A second script went after the boundary directly. It built the real command line for prompts of every length, pushed each one through a real channel held in the failing state, and bisected the largest prompt that survived.</span></p><p><span>About 400 measured runs in total, all on the same machine.</span></p><h2><span>Results</span></h2><p><span>The two hops differed. The handler always built the full 1388-character payload; the program sometimes received less. The loss happens in the terminal hop, as predicted.</span></p><h3><span>1. Is the channel the bottleneck?</span></h3><p><span>I fed some text while the receiving program was not reading, then counted what got through.</span></p><div class="captioned-image-container"><figure><div class="image-link image2" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qrXR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 424w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 848w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 1272w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!qrXR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png" width="1258" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41734,&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/216807714?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.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_!qrXR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 424w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 848w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 1272w, https://substackcdn.com/image/fetch/$s_!qrXR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ef7a679-ab6b-432e-a167-571b36096f54_1258x258.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div></div></div></div></figure></div><p><span>The cap holds at 1022 bytes no matter how much gets sent. Retrying the send does not help. Once the buffer is full, it stays full.</span></p><h3><span>2. What makes some runs work?</span></h3><p><span>One condition delivers everything: the receiver has to be actively reading at the same moment. Shifting the start of reading by a few hundred milliseconds flipped otherwise identical runs. Ten arrived full, fourteen truncated.</span></p><h3><span>3. Where exactly is the line?</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_!Ino8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ino8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 424w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 848w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 1272w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ino8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png" width="1254" height="426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:426,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53262,&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/216807714?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.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_!Ino8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 424w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 848w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 1272w, https://substackcdn.com/image/fetch/$s_!Ino8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20d5c02f-42e6-4b60-94b7-148f5459e79b_1254x426.png 1456w" sizes="auto, 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>681 characters, exactly where the formula put it.</span></p><h3><span>What this means</span></h3><p><span>All three parts of the hypothesis held. The channel between Terminal and a shell holds about 1024 bytes. If the shell is reading when the command lands, it drains input continuously and any length gets through. If the shell is busy for a moment, redrawing or running a prompt hook, the buffer fills, the channel drops the overflow, and the shell runs a cut-off command.</span></p><p><span>No error appears anywhere. The prompt is just shorter than the one you sent.</span></p><p><span>Timing decides, which is why the bug is rare. Twelve emulated clicks in a row delivered the full prompt. Two clicks four minutes apart in the original session did not.</span></p><h3><span>Two false alarms</span></h3><p><span>Both wrong answers came from broken measurement.</span></p><p><span>The emulator matched the wrong process ID and decoded with standard base64 when the encoding is base64url, so it reported &#8220;truncated&#8221; on runs where the full prompt had arrived. Then a timing bug in the second script let the receiver wake 193 ms in, inside the sender&#8217;s 200 ms deadline. Everything passed, and the reported limit came out at 1040 characters, which meant nothing.</span></p><p><span>Problematic, because a test that passes for the wrong reason is worse than one that fails.</span></p><h3><span>The fix</span></h3><p><span>Prompts below 681 characters never hit this. Above 681, success depends on timing, and most clicks still work, which is precisely what makes it hard to diagnose.</span></p><p><span>For our experimental case (opening prefilled Claude Code prompts from the web) the honest answer is: don&#8217;t go this route. &#128578;</span></p><p><span>For CLI scripts, keep long prompts off the command line:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;035c81a8-4206-4813-88d6-474b865d9f8b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">claude "$(cat prompt.txt)"
# or
cat prompt.txt | claude -p</code></pre></div><p><span>Both skip the terminal channel entirely, so the limit never applies.</span></p><h2><span>TL;DR</span></h2><p><span>Clicking a </span><code>claude-cli://</code><span> link makes macOS open a Terminal window and type a long command into it, prompt encoded inside. That typing channel holds about 1024 bytes. If the shell is not reading at that exact moment, everything past the limit is dropped with no error and Claude opens with a half-finished prompt.</span></p><p><span>The cutoff is 681 characters. Below that, prompts always arrive. Above it, most clicks still work, which is why the bug looks random.</span></p><p><span>Don&#8217;t prefill long prompts from the browser. In CLI scripts, use </span><code>claude &#8220;$(cat prompt.txt)&#8221;</code><span> or </span><code>cat prompt.txt | claude -p</code><span>. Neither goes through the terminal.</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><p></p>]]></content:encoded></item><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><div class="image-link image2" 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="auto, 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="auto, 100vw" loading="lazy"></picture><div></div></div></div></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><div class="image-link image2" 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></div></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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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><div class="image-link image2" 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="auto, 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="auto, 100vw" loading="lazy"></picture><div></div></div></div></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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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><div class="image-link image2" 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="auto, 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="auto, 100vw" loading="lazy"></picture><div></div></div></div></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="auto, 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="auto, 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><div class="image-link image2" 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="auto, 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="auto, 100vw" loading="lazy"></picture><div></div></div></div></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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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="auto, 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></channel></rss>