<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Reliant blog</title>
    <link>https://reliantlabs.io/blog</link>
    <atom:link href="https://reliantlabs.io/blog/rss.xml" rel="self" type="application/rss+xml" />
    <description>Notes from building Reliant: workflows, agents, and the engineering behind them.</description>
    <language>en</language>
    <lastBuildDate>Tue, 31 Mar 2026 23:05:43 GMT</lastBuildDate>
    <item>
      <title>Implement, Verify, Review, Refactor: AI Agent Retry Loop</title>
      <link>https://reliantlabs.io/blog/ai-agent-retry-loop</link>
      <guid isPermaLink="true">https://reliantlabs.io/blog/ai-agent-retry-loop</guid>
      <pubDate>Tue, 31 Mar 2026 23:05:43 GMT</pubDate>
      <dc:creator>Shawn Nunoo</dc:creator>
      <description>AI coding agents spiral when retries feed failed code back as context. Three design decisions fix this: check gates, three-strategy review, and conditional undo.</description>
      <content:encoded><![CDATA[<p><img src="https://reliantlabs.io/blog/ai-agent-retry-loop/cover.png" alt="Implement, Verify, Review, Refactor: AI Agent Retry Loop" width="2762" height="1558" /></p><h2 id="the-problem-with-just-try-again" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">The problem with &quot;just try again&quot;</h2>
<p class="my-5">You ask an AI coding agent to add webhook handling to a TypeScript service. It creates a new pub/sub layer instead of using the existing EventBus in <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">src/core/events.ts</code>. Tests fail because the new layer doesn&#x27;t integrate with the existing event subscribers. You re-run the agent. It sees its own broken pub/sub code and, instead of questioning the approach, starts patching it. It wraps the broken handler in a try-catch, adds a special case for the failing test, and imports a compatibility shim. By iteration three, the code is worse than if the agent had never touched it.</p>
<p class="my-5">The underlying problem is context pollution. A naive retry feeds the agent its own failed code, and it tries to fix that code in place. Stale snippets, debug logs from previous attempts, and half-applied fixes pile on more noise. By iteration three, the agent spends most of its context window navigating artifacts from earlier attempts instead of understanding the actual codebase.</p>
<p class="my-5">PithyCyborg put this well: &quot;A retry that doesn&#x27;t change the conditions is usually just a more expensive way to fail.&quot; Feeding the agent its own failed output as context doesn&#x27;t change the conditions.</p>
<p class="my-5">The LLMLOOP study (ICSME 2025) confirmed the flip side: structured feedback loops measurably improve LLM code generation quality on benchmark tasks. Whether iteration is productive or just expensive randomness comes down to how the loop is designed.</p>
<h2 id="three-design-decisions-that-separate-convergence-from-spiraling" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Three design decisions that separate convergence from spiraling</h2>
<p class="my-5">A productive retry loop needs three mechanisms that most implementations skip.</p>
<h3 id="checks-as-a-gate-before-review" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Checks as a gate before review</h3>
<p class="my-5">Run lint, test, and build after every implementation attempt. If any check fails, skip review entirely and loop back to the implementer immediately.</p>
<p class="my-5">Most retry loops send every attempt to a reviewer (human or LLM) regardless. That wastes the reviewer&#x27;s token budget on surface-level problems. A reviewer analyzing code that doesn&#x27;t compile will point out missing imports and syntax errors, not whether the approach is correct. The check gate ensures the reviewer only sees code that meets a minimum bar: it compiles, the linter passes, and the existing tests still work.</p>
<p class="my-5">The check gate also creates a fast inner loop. Failed checks restart the cycle in seconds (the time it takes to run <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">npm test</code>), not minutes (the time it takes for a reviewer agent to read, analyze, and produce structured feedback). For common first-attempt mistakes like missing imports or type errors, this fast loop resolves the issue without ever invoking the reviewer.</p>
<h3 id="three-strategy-review-not-passfail" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Three-strategy review, not pass/fail</h3>
<p class="my-5">After checks pass, a reviewer evaluates the implementation and chooses one of three strategies: <strong class="font-semibold text-fg">pass</strong> (exit the loop), <strong class="font-semibold text-fg">continue</strong> (approach is sound, needs more work), or <strong class="font-semibold text-fg">refactor</strong> (approach is fundamentally wrong).</p>
<p class="my-5">&quot;Continue&quot; and &quot;refactor&quot; describe two different situations that binary pass/fail conflates.</p>
<p class="my-5">Take the webhook example from the opening. On the first attempt, the agent creates its own pub/sub layer instead of using EventBus. The reviewer identifies this as a <strong class="font-semibold text-fg">refactor</strong> situation: the foundation is wrong. No amount of patching will make a custom pub/sub layer integrate correctly with the existing event subscribers. The right response is to revert and start fresh with the instruction &quot;use EventBus in <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">src/core/events.ts</code>.&quot;</p>
<p class="my-5">On the second attempt, the agent uses EventBus correctly but forgets to clean up the handler registration in <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">UserService.teardown()</code>. The reviewer identifies this as a <strong class="font-semibold text-fg">continue</strong> situation: the foundation is sound. The agent used the right abstraction, integrated with existing subscribers, and just missed one detail. The next iteration should build on this work, not throw it away.</p>
<p class="my-5">Treating these the same way is why retry loops feel like expensive randomness. When a &quot;continue&quot; situation gets the &quot;refactor&quot; treatment, you throw away sound work. When a &quot;refactor&quot; situation gets the &quot;continue&quot; treatment, you spend iterations patching code that should have been reverted on iteration one.</p>
<p class="my-5">This three-strategy model is a design choice, not a discovered law. You could add a fourth strategy (&quot;abort and escalate to a human&quot;) or collapse it into two with a severity parameter. The point is that binary pass/fail isn&#x27;t enough. The reviewer needs a way to distinguish &quot;keep building&quot; from &quot;start over.&quot;</p>
<p class="my-5">The reviewer’s feedback is all the next iteration has to work with. It needs to describe what went wrong, what approach would work better, which parts of the codebase matter, and what patterns the next implementer should follow.</p>
<h3 id="refactor-means-undo-not-fix" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Refactor means undo, not fix</h3>
<p class="my-5">When the reviewer chooses &quot;refactor,&quot; a dedicated agent undoes the work. It does not attempt to fix or improve the code. It reverts.</p>
<p class="my-5">The next iteration&#x27;s implementer starts fresh: the original request plus the reviewer&#x27;s feedback about what went wrong and what to try instead. The workspace is clean, with no artifacts from the failed approach to work around.</p>
<p class="my-5">Throwing away code feels wasteful. But patching fundamentally wrong code usually makes things worse. The implementer is better off starting clean with good feedback than inheriting a workspace full of wrong-approach artifacts. The reviewer&#x27;s diagnosis is what carries forward, not the code.</p>
<h3 id="the-reviewer-isnt-an-oracle" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">The reviewer isn&#x27;t an oracle</h3>
<p class="my-5">The entire model depends on the reviewer making correct strategy calls. LLM reviewers get it wrong: they call &quot;continue&quot; on a fundamentally wrong approach, or call &quot;refactor&quot; on code that just needs a small fix. Two mechanisms limit the damage.</p>
<p class="my-5">First, <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">max_retries</code> (default: 3) acts as a circuit breaker. Even if the reviewer consistently misclassifies, the loop terminates after a bounded number of iterations. When the loop exits at the retry limit, the workspace contains whatever state the last iteration left. The user reviews from there.</p>
<p class="my-5">Second, <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">yield: true</code> pauses the loop after each iteration for human review. This is the default. The user sees the reviewer&#x27;s strategy and feedback, and can override: continuing when the reviewer said refactor, or reverting manually when the reviewer said continue. Fully autonomous mode (<code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">yield: false</code>) removes this safety net and is only appropriate when you trust the reviewer&#x27;s judgment on the specific codebase.</p>
<figure class="my-10"><img width="1890" height="1077" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/check-pass.png" alt="check pass" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<h2 id="what-each-iteration-actually-sees" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">What each iteration actually sees</h2>
<p class="my-5">In a naive retry, each iteration inherits everything from previous attempts: code, debug logs, failed approaches, reviewer comments. Context grows linearly with each attempt. JetBrains Research (2025) found that agent-generated context quickly becomes noise, and that effective context size is often much smaller than the window size. Stale implementation details from earlier iterations crowd out the agent&#x27;s ability to reason about the actual problem.</p>
<p class="my-5">A structured retry loop inverts this. Only the reviewer&#x27;s feedback crosses the iteration boundary. Implementation narratives, check logs, and refactoring details stay in isolated thread forks that are discarded after each iteration.</p>
<p class="my-5">Concretely, after three iterations the main thread contains:</p>
<figure class="my-10"><img width="1490" height="384" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/main-thread-after-three-iterations.png" alt="The main thread after three iterations: one reviewer feedback message per iteration" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">Three messages. Not three full implementation transcripts with diffs, debug logs, and reviewer analyses.</p>
<p class="my-5">The third implementer receives three feedback messages instead of 50,000 tokens of accumulated implementation history. Martin Fowler&#x27;s overview of context engineering for coding agents arrives at the same conclusion: the challenge is curating what the model sees, not fitting more in.</p>
<figure class="my-10"><img width="2178" height="4179" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/structured-retry-naive-retry.png" alt="structured retry, naive retry" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<h2 id="the-workflow-implementation" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">The workflow implementation</h2>
<p class="my-5">Get It Right, an open-source Reliant workflow, implements these three decisions in a single workflow.yaml.</p>
<p class="my-5">The workflow runs an <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">attempt</code> loop: <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">implement → [lint, test, build] → review → [refactor?] → loop back</code>. A CEL expression controls the loop condition:</p>
<figure class="my-10"><img width="1546" height="298" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/while-loop.png" alt="while loop" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">The loop continues when the reviewer says &quot;continue&quot; or &quot;refactor,&quot; or when any check fails. It exits on &quot;pass&quot; or when <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">max_retries</code> is reached. When the loop hits the retry limit without a &quot;pass,&quot; the workflow exits with the current workspace state. The user takes over from there.</p>
<p class="my-5">Lint, test, and build run in parallel after each implementation. A <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">join_checks</code> node waits for all three, then an edge condition decides whether to proceed to review:</p>
<figure class="my-10"><img width="1562" height="376" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/from-join-checks.png" alt="from join checks" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">If any check has a non-zero exit code, the edge goes to <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">[]</code> (no next node), ending the iteration. The reviewer never runs on broken code.</p>
<p class="my-5">The reviewer produces a structured JSON response (<code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">{grade, strategy, feedback}</code>), and its <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">save_message</code> directive writes only the strategy and feedback to the main thread. The reviewer&#x27;s full analysis, the code diffs it examined, and the commands it ran stay in the reviewer&#x27;s forked thread and are discarded.</p>
<p class="my-5">The edge from review to refactor fires only on the &quot;refactor&quot; strategy:</p>
<figure class="my-10"><img width="1580" height="274" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/from-review.png" alt="from review" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">Every agent fork uses <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">memo: false</code>, starting a fresh thread each iteration. Only the reviewer&#x27;s <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">save_message</code> writes back to the main thread. The result: workspace state and reviewer feedback are the only data that persists across iterations.</p>
<h2 id="when-structured-retry-loops-pay-off" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">When structured retry loops pay off</h2>
<p class="my-5">Retry loops with structured review cost roughly 2-4x a single agent pass in tokens and time: multiple implementation attempts, reviewer analysis, and conditional refactoring. That overhead is justified in specific situations.</p>
<p class="my-5">Complex brownfield codebases with implicit conventions are the clearest fit — the kind where human PR reviews consistently say &quot;we don&#x27;t do it that way here.&quot; When the agent keeps generating code that &quot;should&quot; work but violates undocumented patterns, a retry loop with a reviewer that discovers and communicates those patterns is worth the token cost. Cross-cutting changes that touch multiple interconnected systems are another good case: higher odds of a fundamentally wrong approach, and the conditional undo prevents iteration debt from accumulating.</p>
<p class="my-5">Greenfield projects and simple one-file bug fixes don&#x27;t need this. No existing conventions to discover, no architecture to fight against. Run the agent once. If it fails, re-prompt. For well-documented codebases where the architecture is obvious from the code, the value of the three-strategy distinction drops because the agent is less likely to choose a fundamentally wrong approach in the first place.</p>
<p class="my-5">There&#x27;s a gray area for medium-complexity tasks where we&#x27;re less sure. A multi-file refactor in a codebase you understand well might benefit from the check gate alone (run tests before re-prompting) without the full three-strategy review. The overhead depends on how often the agent picks wrong approaches, and that varies by codebase, task, and model.</p>
<p class="my-5">These principles apply regardless of tooling. Running Claude Code manually? Run tests before re-prompting. When you review the output, distinguish &quot;keep going&quot; from &quot;start over.&quot; When starting over, <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">git checkout .</code> before re-running the agent. These concepts work whether you use Get It Right, build your own loop, or do it by hand.</p>
<h2 id="get-it-right-as-a-workflow" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Get It Right as a workflow</h2>
<p class="my-5">Get It Right is an open-source Reliant workflow that implements this retry pattern as an automated pipeline. The workflow.yaml shown throughout this post is the complete implementation:</p>
<figure class="my-10"><img width="1578" height="208" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/ai-agent-retry-loop/reliant-get-it-right.png" alt="reliant get it right" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">The workflow accepts configurable check commands, a max retry count (default 3), and an execution mode. Set <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">yield: true</code> to pause after each iteration for manual review, or <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">yield: false</code> to run the full loop autonomously.</p>
<p class="my-5">The trade-off is real: Reliant replaces your current tool. If you&#x27;re using Claude Code or Cursor, adopting Get It Right means switching to a different development environment. That&#x27;s a legitimate switching cost, and it only makes sense if you&#x27;re working on codebases complex enough to justify structured iteration.</p>
<p class="my-5">For readers who won&#x27;t switch, the three design decisions transfer to any setup. The check gate, three-strategy review, and conditional undo are patterns, not product features. Build them into your own scripts, apply them manually, or use them as a framework for evaluating other tools.</p>
<p class="my-5">Get It Right is one workflow in a broader library. <a href="https://github.com/reliant-labs/one-ring" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">One Ring</a> adds planning, parallel verification, and multi-reviewer code review around the same retry loop. The workflow.yaml and documentation are on <a href="https://github.com/reliant-labs/get-it-right" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">GitHub</a>. The <a href="https://docs.reliantlabs.io/docs/" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Reliant platform documentation</a> covers the workflow primitives (loop nodes, edge conditions, thread forking, structured output) used throughout this post.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why AI Coding Agents Say &quot;Done&quot; When They Aren't</title>
      <link>https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent</link>
      <guid isPermaLink="true">https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent</guid>
      <pubDate>Tue, 17 Mar 2026 05:44:34 GMT</pubDate>
      <dc:creator>Seena Nadimi</dc:creator>
      <description>AI coding agents say “done” on fuzzy tasks when they aren’t. The issue is structural, not prompting. Here’s how objective vs fuzzy completion changes workflows.</description>
      <content:encoded><![CDATA[<p><img src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/cover.png" alt="Reliant - ralph wiggum and other workflows" width="1550" height="416" /></p><p class="my-5"><em>This is the first post in a series examining the philosophies behind popular AI coding workflows — what they get right, where they break down, and what happens when workflows become a programmable primitive</em></p>
<p class="my-5">Ask an AI coding agent to remove dead code and you usually get something that looks right. It deletes the obvious unused function, removes one import, updates a call site or two, then says the cleanup is complete. Then you open the diff and find three more helpers with no callers, a test fixture that still points to the old path, and one branch that still imports the deleted module.</p>
<p class="my-5">Once you start noticing it, that failure mode is all over the place. A refactor updates the main implementation and still misses the shadow copy in a helper package. A test rename changes the test file names, but CI config still points at the old targets. The agent says it edited four files. One of those edits never landed in the branch.</p>
<p class="my-5">This is why &quot;done&quot; from an agent often means review is just starting. The frustrating part is that the agent usually did real work. The branch is better than before, but the task still is not done.</p>
<p class="my-5">It helps to give this a name: the repetition pattern. The human sees partial completion, asks again with a narrower prompt, gets another slice of progress, checks the repo again, and keeps going until the leftovers stop showing up. The Ghost Task Problem describes a similar symptom from another angle: claimed completion drifting away from branch state. This is not a weird edge case. It is a routine operating condition for AI coding work on brownfield codebases.</p>
<p class="my-5">The natural reaction is to blame the prompt. Write clearer instructions. Add more context. Specify the directories to check. That helps on the margins, but it misses the structural issue: no prompt can give an agent the ability to verify its own fuzzy work. The agent&#x27;s strongest skill — generating plausible, working code — is exactly what makes this failure mode so dangerous. It is not that agents are bad at coding. It is that they are too good at looking done. The problem is not linguistic. It is architectural.</p>
<h2 id="the-real-distinction-is-objective-completion-vs-fuzzy-completion" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">The real distinction is objective completion vs fuzzy completion</h2>
<p class="my-5">The most useful question is whether the task has a clear stop condition, not whether the model seems smart in the abstract. Once you sort tasks that way, a lot of confusing agent behavior starts to make more sense.</p>
<p class="my-5">Objective completion means there is outside evidence the work is done: the test suite passes, the build succeeds, the linter is clean, or the generated file matches the schema. You can argue about the implementation, but you do not have to guess whether the requested state was reached.</p>
<p class="my-5">Fuzzy completion means the stop condition depends on judgment, coverage, or discovery. &quot;Remove all dead code&quot; sounds clear until you realize the repo has helper directories, test fixtures, generated stubs, half-migrated modules, and old scripts that only show up in deploy paths. &quot;Finish this refactor&quot; sounds clear until the remaining work is scattered across naming conventions, comments, docs, config, and edge-case call sites. The agent can make visible progress and still not have real evidence that it found everything.</p>
<p class="my-5">This is why the same model can look solid on one task and shaky on another. Ask it to add a failing test, fix the implementation, and stop when the test passes, and the model gets a strong external signal. Ask it to find every stale pattern tied to a seven-month migration, and the model has to search and certify its own search. That is a harder problem than raw code generation.</p>
<figure class="my-10"><img width="1600" height="820" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/task-table.png" alt="task table" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">The distinction matters because it tells you what kind of control loop you need. Objective tasks can often converge with repetition plus verification. Fuzzy tasks usually need narrower scopes, explicit checklists, or a human review step that accepts you may not get a perfect stop signal.</p>
<figure class="my-10"><img width="784" height="267" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/objective-vs-fuzzy-completion.png" alt="objective vs fuzzy completion" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<h2 id="why-single-pass-work-breaks-down" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Why single-pass work breaks down</h2>
<p class="my-5">Single-pass workflows break down when the agent has to solve the problem and certify the result in one shot. It sounds efficient in chat. In practice, it lumps together three different jobs: finding the work, doing the work, and checking whether anything subtle remains.</p>
<p class="my-5">The first problem is self-assessment. Models are good at recognizing local progress, but they are less reliable at proving global completeness when the search space is broad. If the agent removed ten stale references, that visible progress becomes a source of false confidence. The branch looks cleaner, the diff is non-trivial, and the model leans toward declaring success.</p>
<p class="my-5">The second problem is attention. Large repos do not present all evidence with equal weight. The loud files are the ones that fail tests, import the old symbol directly, or sit near the files already in context. Quiet leftovers live in helper scripts, fixture data, deployment paths, copied utility modules, and low-traffic tests. A single pass hits the loud evidence first.</p>
<p class="my-5">The third problem is context pressure. Long sessions pile up plans, diffs, failed ideas, and partial scans. Once the conversation gets heavy, the model starts reasoning through a compressed version of the work instead of the full raw state. Reliability degrades because the session now contains a summary of the repo problem, not the repo problem itself.</p>
<p class="my-5">Put those three together and you get a common sequence. The agent does something meaningful. The remaining work gets less salient after the first cleanup. The model reads its own progress as stronger evidence than it deserves, then emits a confident completion statement.</p>
<h2 id="repetition-as-workaround-and-where-it-stops-working" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Repetition as workaround, and where it stops working</h2>
<p class="my-5">Once engineers notice the pattern, they reach for the same fix. They ask the agent again with a tighter question. Check the diff. Search for the old symbol. Paste the remaining matches back into chat. Ask for another pass focused on leftovers.</p>
<p class="my-5">This works more often than a single pass suggests it should. The repo changed after the first pass, so the remaining evidence stands out more clearly. A second prompt aimed at one blind spot can direct the model toward files it ignored.</p>
<p class="my-5">The problem is scale. A strong engineer can run that loop on one important task. A team cannot afford to do it by hand for every migration, cleanup, refactor, and bug fix. And the cost is not just the review time — it is what organizations choose not to attempt. Teams unconsciously limit AI to the tasks where single-pass works: write a test, fix this bug, add this endpoint. The hardest and most valuable work — large migrations, cross-cutting refactors, deep cleanup of technical debt — stays manual or does not happen, because the review cost of running an agent on fuzzy tasks is too high to justify.</p>
<p class="my-5">That hidden cost is the real impact of the repetition pattern. It is not that agents waste twenty minutes of review time. It is that the pattern silently caps the return on AI-assisted development at the easy tasks.</p>
<p class="my-5">Repetition also has a hard ceiling. It does not fix a bad plan, a wrong abstraction, or a design mistake the model keeps preserving. If the agent misunderstood the architecture, extra passes produce a more complete version of the wrong solution. A practical diagnostic: after two or three passes, is the system finding new territory or working over the same ground? New territory looks like previously missed files, newly surfaced search hits, or a shrinking set of concrete leftovers. Same ground looks like reworded explanations, churn in the same files, or cosmetic edits around an unresolved core issue.</p>
<h2 id="what-the-structured-version-looks-like" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">What the structured version looks like</h2>
<p class="my-5">Once repetition becomes routine, the question is how to make the loop and the stop condition explicit instead of relying on memory and patience.</p>
<p class="my-5">Two strategies keep appearing. One resets context between passes — each run reads the repo fresh, takes a bounded step, and checks exit conditions. This works well when the task can be verified objectively. The other preserves accumulated state — each pass builds on the previous one&#x27;s findings. That approach matters more for fuzzy, diagnosis-heavy work, but the challenge is keeping the session coherent as state piles up.</p>
<p class="my-5">Reliant&#x27;s <a href="https://github.com/anthropics/claude-code/blob/main/plugins/ralph-wiggum/README.md" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Ralph Wiggum</a> workflow is a context-reset loop that makes all of this explicit. Each iteration runs three steps: orient (read the repo, pick the next task), implement (execute that one task, test, commit), and verify (structured check against acceptance criteria). The loop continues while tasks remain, up to a configurable cap.</p>
<p class="my-5">The key design decisions are visible in the workflow definition:</p>
<figure class="my-10"><img width="1440" height="1210" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/yaml-definition.png" alt="yaml definition" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">Three things matter here for the repetition pattern. First, the <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">while</code> condition is an explicit exit rule — <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">tasks_remaining == true &amp;&amp; iter.iteration &lt; max_iterations</code> — not the agent deciding it feels done. Second, the verify step forces a structured boolean through a response schema instead of letting the agent write prose about completion. The agent must commit to <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">tasks_remaining: true</code> or <code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">tasks_remaining: false</code>. Third, each step forks its own thread (<code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">thread.mode: fork, memo: false</code>), so the orient step re-reads the repo fresh each iteration rather than reasoning from accumulated context. Iteration summaries are saved to the main thread, but the working context resets.</p>
<figure class="my-10"><img width="1550" height="416" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/cover.png" alt="ralph wiggim workflow" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<figure class="my-10"><img width="1248" height="424" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/ralph-wiggim-iteration.png" alt="ralph wiggim iteration" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p><a href="https://www.youtube.com/watch?v=2ZCyCvEBPBU">Ralph Wiggum workflow overview</a> (YouTube)</p>
<p class="my-5">This is not a magic fix. It is the same loop practitioners already discovered — orient, implement, verify, repeat — but with the stop condition, the context strategy, and the verification schema encoded as workflow primitives instead of living in the engineer&#x27;s head. For recurring work where review cost is already high, the explicit version is easier to trust and cheaper to run than the manual version.</p>
<h2 id="a-practical-decision-framework" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">A practical decision framework</h2>
<p class="my-5">Before handing work to an agent, classify the task by completion type and choose the evidence that will stop the loop.</p>
<p class="my-5">Three questions:</p>
<ol class="my-5 list-decimal space-y-2 pl-6 marker:text-fg-muted">
<li class="pl-1">Is completion objective or fuzzy?</li>
<li class="pl-1">What observable evidence would prove the task is done?</li>
<li class="pl-1">If the evidence stays fuzzy, what is the stop rule?</li>
</ol>
<p class="my-5">That last question matters because every loop needs a bound. The bound might be three passes, a fixed checklist, a search with zero remaining matches in named directories, or a required human review before merge.</p>
<figure class="my-10"><img width="1586" height="490" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/why-ai-coding-agents-say-done-when-they-arent/task-table-2.png" alt="Task table" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">The framework is simple, but it prevents a lot of avoidable frustration. Many bad experiences with agents come from handing them fuzzy tasks while expecting objective-task reliability, or from treating a weak proxy like a hard stop signal. Once you separate those cases, the behavior gets easier to predict.</p>
<h2 id="where-workflows-go-next" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Where Workflows Go Next</h2>
<p class="my-5">Once you treat premature &quot;done&quot; as a structural failure mode — not a prompting problem — the next question is how to prevent it systematically. Two camps have emerged. One bets on tighter process: enforced TDD, role separation, structured reviews. The other bets on context management: fresh state, file-based memory, decomposition into bounded chunks.</p>
<p class="my-5">The next post examines the discipline camp — Superpowers and BMAD — and what happens when you treat enforced process as the primary defense against agent failure.</p>]]></content:encoded>
    </item>
    <item>
      <title>Opus 4.6 Thinking Tokens Cost 5x What They Should</title>
      <link>https://reliantlabs.io/blog/reduce-tokens-opus-4-6</link>
      <guid isPermaLink="true">https://reliantlabs.io/blog/reduce-tokens-opus-4-6</guid>
      <pubDate>Mon, 09 Feb 2026 19:21:03 GMT</pubDate>
      <dc:creator>Shawn Nunoo</dc:creator>
      <description>How effort controls, adaptive thinking, and multi-model routing cut Opus 4.6 API costs. Includes benchmark data, code examples, and per-task cost breakdowns.</description>
      <content:encoded><![CDATA[<p><img src="https://reliantlabs.io/blog/reduce-tokens-opus-4-6/cover.png" alt="Opus 4.6 Thinking Tokens Cost 5x What They Should" width="445" height="519" /></p><p class="my-5">Opus 4.6 is the most capable model Anthropic has released. It’s also the most expensive to run on simple tasks, and not because of the input pricing.</p>
<p class="my-5">The cost is in thinking tokens. Opus 4.6 defaults to high effort, which means it thinks deeply on almost every request. Ask it to rename a variable, generate a boilerplate Express route, or format a JSON response. It reasons through all of them. <a href="http://anthropic.com/news/claude-opus-4-6" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Anthropic’s own announcement</a> says as much: the model “thinks more deeply and more carefully revisits its reasoning before settling on an answer,” which “can add cost and latency on simpler ones.”</p>
<p class="my-5">Output tokens on Opus 4.6 run $25 per million. Input tokens cost $5 per million. Thinking tokens bill as output tokens. So every time Opus 4.6 spins up its reasoning engine on a task that didn’t need it, you’re paying 5x the input rate for tokens you’ll never see in the response. <a href="http://platform.claude.com/docs/en/build-with-claude/adaptive-thinking" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">The actual thinking content gets summarized before it reaches you, but you’re billed for the full chain of thought</a>.</p>
<p class="my-5">This creates a specific problem for anyone running Opus 4.6 in production or using it through the API for coding workflows. The model is better at hard problems like complex debugging, architectural reasoning, and root cause analysis across large codebases, which is where Opus 4.6 earns its pricing. But most engineering work is implementing a known pattern, writing a standard test, generating scaffolding, formatting output. Running Opus 4.6 at full reasoning depth on those tasks eats tokens that could be otherwise used for hard work.</p>
<p class="my-5">Anthropic knows this. The <a href="http://anthropic.com/news/claude-opus-4-6" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Opus 4.6 announcement</a> recommends setting effort to medium for “many routine tasks” and only using high or max effort when you need the deepest reasoning. They give you the tools to avoid spending more time and money than you have to. So how do you take advantage?</p>
<p class="my-5">That’s what effort controls are: a way to tell Claude how hard to think. <a href="http://platform.claude.com/docs/en/build-with-claude/effort" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Four levels, from low to max</a>, each one changing how many tokens Claude spends on internal reasoning, how many tool calls it makes, and how long it takes to respond. Paired with adaptive thinking, effort controls give you a dial that trades reasoning depth against cost and latency. Turn it down when you need speed. Turn it up when you’re doing something complex.</p>
<p class="my-5">The rest of this post covers how effort controls work at the API level, when to use each level on real engineering tasks, and how effort interacts with model selection in multi-agent workflows. If you’re running Opus 4.6 and your API bill is higher than expected, start here.</p>
<h2 id="how-effort-controls-work" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">How Effort Controls Work</h2>
<p class="my-5">Effort controls are a single parameter in the API that changes how Claude allocates compute to a request. You set it in output_config:</p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">{</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">&quot;model&quot;: &quot;claude-opus-4-6-20250613&quot;,</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">&quot;max_tokens&quot;: 16000,</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">&quot;output_config&quot;: {</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">&quot;effort&quot;: &quot;medium&quot;</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">},</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">&quot;messages&quot;: [...]</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">}</code></p>
<p class="my-5">Four levels are available: low, medium, high, and max. High is the default. If you omit the parameter entirely, you get high. <a href="http://platform.claude.com/docs/en/build-with-claude/effort" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">By the way, Max is exclusive to Opus 4.6</a>.</p>
<p class="my-5"><a href="http://platform.claude.com/docs/en/build-with-claude/effort" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Effort is a behavioral signal, not a strict token budget</a>. Setting effort to low doesn’t cap thinking tokens at a fixed number. It tells Claude to approach the task with less deliberation. The model decides what that means in context. On a simple formatting task, low effort might skip thinking entirely. On something moderately complex, it might think briefly instead of deeply. You’re setting intent, not a hard limit.</p>
<h4 id="what-each-level-does" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">What each level does</h4>
<figure class="my-10"><img width="740" height="340" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/reduce-tokens-opus-4-6/effort-spectrum-breakdown.png" alt="Effort spectrum breakdown" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5"><strong class="font-semibold text-fg">Low.</strong> Claude skips thinking on straightforward requests, makes fewer tool calls, and produces shorter responses. Use this when you already know what you want and Claude’s job is execution, not reasoning. Boilerplate generation, formatting, classification, simple transformations.</p>
<p class="my-5"><strong class="font-semibold text-fg">Medium.</strong> Claude thinks when the task warrants it but doesn’t go deep by default. Fewer tool calls than high, shorter reasoning chains. <a href="http://anthropic.com/news/claude-opus-4-6" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">This is the level Anthropic recommends for “many routine tasks” on Opus 4.6</a>. At medium effort, Opus 4.5 matched Sonnet 4.5’s best SWE-bench score while <a href="http://anthropic.com/news/claude-opus-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">using 76% fewer output tokens</a>. That’s the efficiency sweet spot for most coding work.</p>
<p class="my-5"><strong class="font-semibold text-fg">High (default).</strong> Claude thinks on most requests and reasons more carefully before responding. This is what you get if you don’t set the parameter at all. Good for complex tasks, but expensive on routine ones because thinking tokens bill at the output rate ($25/MTok on Opus 4.6).</p>
<p class="my-5"><strong class="font-semibold text-fg">Max (Opus 4.6 only).</strong> No constraints on thinking depth. Claude will use as much reasoning as it determines it needs, which can mean long chains of thought that approach the max_tokens budget. Reserve this for problems where you want Claude to exhaustively reason through every angle: security audits, root cause analysis, architectural decisions with competing tradeoffs.</p>
<h4 id="how-effort-interacts-with-thinking" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">How effort interacts with thinking</h4>
<p class="my-5">Effort controls work best when paired with <a href="http://platform.claude.com/docs/en/build-with-claude/adaptive-thinking" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">adaptive thinking</a>:</p>
<pre class="my-6 overflow-x-auto rounded-lg border border-hairline bg-inset p-4 text-sm leading-relaxed [&amp;_code]:bg-transparent [&amp;_code]:p-0 [&amp;_code]:text-[1em]"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg language-json">{
  &quot;model&quot;: &quot;claude-opus-4-6-20250613&quot;,
  &quot;max_tokens&quot;: 16000,
  &quot;thinking&quot;: {
    &quot;type&quot;: &quot;adaptive&quot;
  },
  &quot;output_config&quot;: {
    &quot;effort&quot;: &quot;medium&quot;
  },
  &quot;messages&quot;: [...]
}
</code></pre>
<p class="my-5">Adaptive thinking is the recommended configuration for Opus 4.6. It replaces the older budget_tokens approach, which is <a href="http://platform.claude.com/docs/en/build-with-claude/adaptive-thinking" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">deprecated on this model</a>. Where budget_tokens gave you a fixed token ceiling for thinking, adaptive thinking lets the model decide how much to think based on the effort level and task complexity. The two work together: effort sets the intent, adaptive thinking handles the allocation.</p>
<p class="my-5">One behavior that adaptive thinking enables automatically is interleaved thinking. Claude can think between tool calls, <a href="http://platform.claude.com/docs/en/build-with-claude/adaptive-thinking" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">not just at the start of a response</a>. In agentic workflows where Claude calls tools in sequence, this changes the execution pattern. Without interleaved thinking, Claude does all its reasoning upfront and then executes. With it, Claude can reason about each tool result before deciding what to do next. At lower effort levels, it skips this intermediate reasoning when the tool results are straightforward. At higher levels, it reasons after every step.</p>
<h4 id="what-effort-affects" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">What effort affects</h4>
<p class="my-5">Effort doesn’t just control thinking tokens. It changes three things:</p>
<p class="my-5"><strong class="font-semibold text-fg">1. Thinking depth.</strong> How many tokens Claude spends on internal reasoning before producing a response</p>
<p class="my-5"><strong class="font-semibold text-fg">2. Tool call frequency.</strong> How many tools Claude invokes per request. Lower effort means fewer calls, which reduces both latency and cost.</p>
<p class="my-5"><strong class="font-semibold text-fg">3. Response length.</strong> Lower effort produces shorter, more direct text responses. Higher effort produces more detailed, considered responses.</p>
<p class="my-5">A high-effort request with multiple tool calls and deep thinking can generate 5-10x the output tokens of the same request at low effort. That multiplier hits your bill at $25 per million output tokens on Opus 4.6.</p>
<h4 id="one-more-thing-effort-is-promptable" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">One more thing: effort is promptable</h4>
<p class="my-5">You can also <a href="http://platform.claude.com/docs/en/build-with-claude/effort" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">steer thinking frequency through your system prompt</a>. If you tell Claude “think carefully about edge cases” in the system prompt, it will think more often even at medium effort. If you tell it “respond concisely without deliberation,” it will think less even at high effort. The effort parameter sets the baseline; the prompt can push it in either direction. This gives you two levers: the parameter for broad control, the prompt for task-specific tuning.</p>
<h2 id="when-to-use-each-level" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">When to Use Each Level</h2>
<p class="my-5">Here’s what we know so far. Anthropic’s benchmark data shows that at medium effort, Opus 4.5 matched Sonnet 4.5’s best SWE-bench score while using 76% fewer output tokens. At the highest effort, <a href="http://anthropic.com/news/claude-opus-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">it exceeded Sonnet 4.5 by 4.3 points while still using 48% fewer tokens</a>.</p>
<figure class="my-10"><img width="740" height="380" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/reduce-tokens-opus-4-6/swe-bench-by-effort.png" alt="SWE-bench score and output tokens for Opus 4.5 at each effort level, against Sonnet 4.5" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">Here’s what we know so far. Anthropic’s benchmark data shows that at medium effort, Opus 4.5 matched Sonnet 4.5’s best SWE-bench score while using 76% fewer output tokens. At the highest effort, <a href="http://anthropic.com/news/claude-opus-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">it exceeded Sonnet 4.5 by 4.3 points while still using 48% fewer tokens</a>.</p>
<p class="my-5">Early access partners reported similar results in production. GitHub’s <a href="http://anthropic.com/news/claude-opus-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Mario Rodriguez saw it</a> “surpass internal coding benchmarks while cutting token usage in half”. JetBrains <a href="http://anthropic.com/news/claude-opus-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">reported</a> 50-75% reductions in tool calling errors and build/lint errors with their Junie agent. AJ Orbach at Text2SQL.ai called the effort parameter “brilliant,” noting that at lower effort the model “delivers the same quality we need while being dramatically more efficient” for SQL generation workflows.</p>
<p class="my-5">That data is compelling but narrow. SWE-bench scores and SQL generation are specific use cases. What’s missing is systematic testing across the range of tasks engineers run every day: writing tests, debugging across multiple files, reviewing PRs, scaffolding new services, refactoring legacy code. Nobody’s published “I ran the same debugging task at low, medium, high, and max and measured quality, cost, and latency for each.” We’re running those experiments now and will publish the results in a follow-up post. If you’re testing effort levels in your workflows, we’d like to compare notes.</p>
<p class="my-5">Until that data exists, here’s what we’re working with. It draws on Anthropic’s docs, the benchmark results, the partner reports, and our own experimentation.</p>
<h4 id="low-effort-execution-tasks" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">Low effort: execution tasks</h4>
<p class="my-5">Use low when Claude’s job is to produce something you already know the shape of. You’re asking it to write a known pattern, not reason through a problem.</p>
<p class="my-5">Tasks that fit: boilerplate generation, file scaffolding, import formatting, conventional commit messages, simple type annotations, lint-fix suggestions, renaming variables across a file, generating standard route handlers.</p>
<p class="my-5">The common thread is that these tasks have a clear correct output. There’s no ambiguity about what “good” looks like. Claude doesn’t need to weigh tradeoffs or consider edge cases. Low effort skips thinking on these, produces shorter responses, and makes fewer tool calls. <a href="http://thomas-wiegold.com/blog/claude-opus-4-5-review" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Thomas Wiegold frames it well: “Need a quick function signature? Low effort.”</a></p>
<p class="my-5"><strong class="font-semibold text-fg">Medium effort: standard implementation</strong></p>
<p class="my-5">Medium is the workhorse level. This is where most daily coding happens: implementing a CRUD endpoint, writing unit tests for an existing function, refactoring with a known pattern, reviewing straightforward PRs, writing documentation for existing code, adding error handling to a module.</p>
<p class="my-5">These tasks need some reasoning but not deep analysis. Claude should think about how your conventions apply, check that the implementation is correct, and produce clean output. It shouldn’t spend tokens tracing edge cases or reconsidering architectural decisions. Medium gives you that balance.</p>
<p class="my-5">Anthropic recommends medium for <a href="http://anthropic.com/news/claude-opus-4-6" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">“many routine tasks” on Opus 4.6</a>, and the SWE-bench data supports it. For most implementation work, medium delivers the same quality as high at a fraction of the token cost. If you’re only going to change one thing about how you use Opus 4.6, set effort to medium for your standard coding workflows.</p>
<h4 id="high-effort-complex-reasoning" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">High effort: complex reasoning</h4>
<p class="my-5">High is the default, and for good reason on hard problems. Debugging a race condition, refactoring a module that touches six files, writing tests for edge cases in auth flows, understanding how an unfamiliar dependency behaves under load, reviewing a PR that changes core business logic.</p>
<p class="my-5">These tasks require Claude to hold multiple concerns in working memory, trace execution paths, consider failure modes, and reason about interactions between components. The extra thinking tokens are worth it because catching an issue here prevents hours of debugging later. High effort is where Opus 4.6 earns its pricing.</p>
<p class="my-5">If you’re leaving high as your default for everything, you’re either rich or NGMI. If 60% of your API calls are medium-complexity tasks running at high effort, you’re overpaying on the majority of your workload.</p>
<h4 id="max-effort-exhaustive-analysis" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">Max effort: exhaustive analysis</h4>
<p class="my-5">Max is for problems where you want Claude to leave nothing on the table. Root cause analysis across a large codebase, security audits of authentication flows, designing system architecture from competing requirements, debugging production incidents with incomplete logs.</p>
<p class="my-5">These are the tasks where a shallow answer is worse than no answer. You want Claude to consider every angle, second-guess its initial conclusions, and reason through implications. Max effort can produce long chains of thought that approach the max_tokens budget. The cost per request is high, but you’re using it on problems where the alternative is hours of senior engineer time.</p>
<p class="my-5">Max is exclusive to Opus 4.6. If you’re not on Opus 4.6, high is your ceiling.</p>
<h4 id="cost-math-why-distribution-is-everything" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-8 mb-2 text-lg">Cost math: why distribution is everything</h4>
<p class="my-5"><a href="http://digitalapplied.com/blog/claude-opus-4-5-complete-guide-agents-coding" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">One practitioner framework from Digital Applied</a> suggests a 60/30/10 split: 60% of requests at medium, 30% at high, 10% at low. They report taking a client from $840/month to $320/month by shifting requests from blanket-high to this distribution.</p>
<p class="my-5">That’s one data point, not a proven formula, but the principle is sound. Most API spend on Opus 4.6 comes from thinking tokens on requests that didn’t need deep reasoning. Shifting your default from high to medium and reserving high/max for tasks that warrant it is the highest-leverage change you can make.</p>
<h2 id="the-multi-model-angle" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">The Multi-Model Angle</h2>
<p class="my-5">Effort controls give you one axis of optimization: how hard a single model thinks. The second axis is which model you use in the first place.</p>
<p class="my-5"><a href="http://platform.claude.com/docs/en/about-claude/pricing" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Anthropic’s current lineup spans a wide cost range</a>:</p>
<p class="my-5"><strong class="font-semibold text-fg">Haiku 4.5:</strong> $1/$5 per MTok (input/output)</p>
<p class="my-5"><strong class="font-semibold text-fg">Sonnet 4.5:</strong> $3/$15 per MTok</p>
<p class="my-5"><strong class="font-semibold text-fg">Opus 4.6:</strong> $5/$25 per MTok</p>
<p class="my-5">Haiku 4.5 delivers roughly 90% of Sonnet 4.5’s agentic coding performance at one-third the cost, based on <a href="http://anthropic.com/news/claude-haiku-4-5" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Augment’s evaluation</a>. That means a formatting task running on Opus 4.6 at high effort versus Haiku 4.5 at low effort isn’t a small difference. It’s an order of magnitude.</p>
<p class="my-5">Practitioners figured this out before Anthropic shipped the tooling for it. <a href="http://thomas-wiegold.com/blog/claude-opus-4-5-review" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Simon Willison ran a major refactor of sqlite-utils with Opus</a>, covering 20 commits, 39 files, and 3,000+ lines changed. Partway through, he switched to Sonnet and “kept on working at the same pace”. The gap between the models showed on ambiguous architectural decisions, not on well-scoped implementation. <a href="http://medium.com/@ayaanhaider.dev" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Ayaan Haider tested all three models</a> across Flutter projects and landed on a simple split: “Haiku for setup, Sonnet for builds, Opus for reviews. That combo just works”. He found Opus caught async bugs and rebuild issues the other models missed entirely, but for routine builds it was overkill.</p>
<p class="my-5">The pattern keeps showing up. An <a href="http://github.com/0xrdan/claude-router" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">open-source tool called claude-router routes</a> requests to Haiku, Sonnet, or Opus based on complexity and reports ~40% cost savings. <a href="http://zenvanriel.nl/ai-engineer-blog/clawdbot-api-cost-optimization-guide" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">The Clawdbot optimization guide</a> describes workflows where a main agent spawns sub-agents on cheaper models for background tasks, reporting 60%+ cost reductions. <a href="http://code.claude.com/docs/en/model-config" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Anthropic themselves built this pattern into Claude Code</a>: opusplan mode uses Opus for planning and auto-switches to Sonnet for execution.</p>
<p class="my-5">Use the expensive model for the hard thinking and cheaper models for everything else. The community has been doing this by hand: switching models mid-session, building routing layers, running different models in different terminals.</p>
<p class="my-5">But here’s where the two axes meet. Model selection tells you which brain to use. Effort controls tell you how hard that brain should think. Combined, you get a matrix:</p>
<figure class="my-10"><img width="688" height="448" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/reduce-tokens-opus-4-6/cost-per-request-model.jpg" alt="Cost per request model" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">Nobody’s running every row at Opus/high, but in practice most developers are still using one model at one effort level per session. Claude Code lets you pick a model and set an effort level, but it applies to the whole session. You can’t say “use Opus at max for this planning step, then switch to Sonnet at medium for implementation, then Haiku at low for cleanup.” Not without manually switching between commands.</p>
<p class="my-5">The primitives exist, but the per-task orchestration doesn’t. Not yet.</p>
<h2 id="where-this-goes-effort-as-a-workflow-primitive" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Where This Goes: Effort as a Workflow Primitive</h2>
<p class="my-5">If you’re running single-agent sessions in Claude Code, effort controls save you money today. Set your default to medium, bump to high when you’re debugging something hard, and you’ll see the difference on your next invoice. That saves money with zero tooling changes.</p>
<p class="my-5">If you’re looking to save even more using multi-agent workflows, we recommend per-agent configuration, tuning the model and effort level for each step in a workflow independently. A planning step needs Opus at max effort, an implementation step needs Sonnet at medium, and a formatting step needs Haiku at low. Running every step at Opus/high means paying $25/MTok output on a formatting pass that Haiku could handle at $5/MTok with low effort. Per-agent tuning lets you put your budget where it earns a return and cut it everywhere else.</p>
<p class="my-5">Claude Code doesn’t support this yet. You pick one model and one effort level, and it applies to the whole session. If you want to change the configuration between steps, you switch manually. That works for two or three steps but breaks down when you’re running a six-step bug reproduction workflow or kicking off three workflows in parallel.</p>
<p class="my-5">This is what we’re building at Reliant. In Reliant’s workflow builder, each agent in a workflow gets its own model and effort level:</p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">Planning Agent → Opus 4.6, max effort</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">Implementation Agent → Sonnet 4.5, medium effort</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">Test Agent → Sonnet 4.5, high effort</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">Review Agent → Opus 4.6, high effort</code></p>
<p class="my-5"><code class="rounded bg-panel-raised px-1.5 py-0.5 font-mono text-[0.875em] text-fg">Formatting Agent → Haiku 4.5, low effort</code></p>
<p class="my-5">The workflow runs sequentially. Planning completes, implementation starts, tests run, review checks the output, formatting cleans it up. Each agent uses the configuration tuned to its role. You set it up once in the visual builder and run it on every bug, every feature, every refactor.</p>
<p class="my-5">The matrix from the previous section is the mental model, and Reliant is where you implement it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Agent Teams in Claude Code: How They Work, When They Break, and What Comes Next</title>
      <link>https://reliantlabs.io/blog/claude-code-agent-teams</link>
      <guid isPermaLink="true">https://reliantlabs.io/blog/claude-code-agent-teams</guid>
      <pubDate>Fri, 06 Feb 2026 18:36:44 GMT</pubDate>
      <dc:creator>Shawn Nunoo</dc:creator>
      <description>How Claude Code's agent teams coordinate AI agents, where they break down (file conflicts, validation, model costs), and when structured workflows work better.</description>
      <content:encoded><![CDATA[<p><img src="https://reliantlabs.io/blog/claude-code-agent-teams/cover.webp" alt="Agent Teams in Claude Code: How They Work, When They Break, and What Comes Next" width="3840" height="2004" /></p><p class="my-5">Anthropic shipped <a href="https://code.claude.com/docs/en/agent-teams" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">agent teams</a> alongside Opus 4.6 today. If you missed it in the announcement, here&#x27;s the short version:</p>
<p class="my-5">You can now spin up multiple Claude Code instances that coordinate through a shared task list and work in parallel.</p>
<p class="my-5">On the same day, Anthropic&#x27;s Nicholas Carlini <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">published a post about using 16 parallel Claude agents to build a C compiler from scratch</a>: 2,000 sessions, $20,000 in API costs, 100,000 lines of Rust. That post is the best stress test of this primitive that exists right now, and I&#x27;ll reference it throughout.</p>
<p class="my-5">Agent teams are still experimental, the docs are thin, and the gap between &quot;multiple Claudes working together&quot; and &quot;multiple Claudes working together <em>productively</em>&quot; is wide.</p>
<p class="my-5">Here&#x27;s what we’ve found so far.</p>
<h2 id="what-are-agent-teams" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">What are agent teams?</h2>
<p class="my-5">Agent teams sit on top of Claude Code&#x27;s existing primitives (subagents, custom agents, CLAUDE.md files) but they work differently from all of them.</p>
<p class="my-5">One Claude Code session becomes the <strong class="font-semibold text-fg">team lead</strong>. It creates a shared task list, spawns <strong class="font-semibold text-fg">teammates</strong>, and coordinates results. Each teammate runs in its own context window and works independently. When teammates finish, they report findings back through an inbox system, and the lead synthesizes everything.</p>
<p class="my-5">To enable the feature, set CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 in your environment or settings.json.</p>
<figure class="my-10"><img width="754" height="214" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/claude-code-agent-teams/enabling-agent-teams-in-claude-code.png" alt="Enabling agent teams in Claude Code" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">After that, you describe the team structure in natural language and Claude handles the spawning.</p>
<p class="my-5">Here&#x27;s the example from the docs:</p>
<blockquote class="my-6 border-l-2 border-hairline-strong pl-5 italic text-fg-body">
<p class="my-5"><em>I&#x27;m designing a CLI tool that helps developers track TODO comments across their codebase. Create an agent team to explore this from different angles: one teammate on UX, one on technical architecture, one playing devil&#x27;s advocate.</em></p>
</blockquote>
<p class="my-5">Claude creates the team, spawns three teammates, gives each a perspective, and synthesizes their findings when they&#x27;re done. You can interact with individual teammates directly using Shift+Up/Down to cycle between them, or run in tmux for split-pane visibility. That &quot;explore from different angles&quot; framing is deliberate.</p>
<p class="my-5">The docs recommend starting with tasks that have clear boundaries and don&#x27;t require writing code: reviewing a PR, researching a library, investigating a bug. These are read-heavy, parallel-friendly tasks where agents can work without stepping on each other.</p>
<h3 id="how-this-differs-from-what-claude-code-already-had" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">How this differs from what Claude Code already had</h3>
<p class="my-5">Claude Code already supports parallel work through a few different mechanisms, and agent teams add a coordination layer on top.</p>
<p class="my-5"><strong class="font-semibold text-fg">Subagents</strong> run inside a single Claude Code session. They inherit the parent&#x27;s context, do a task (research a question, verify a fact, run a specific check), and report back to the main agent. They can&#x27;t talk to each other, and you can&#x27;t interact with them directly. They work well for delegation within a single conversation, but not for parallel exploration across independent contexts.</p>
<p class="my-5"><strong class="font-semibold text-fg">Custom agents</strong> are specialized roles you define in .md files: a code reviewer, a security auditor, a documentation writer. Claude invokes them based on task fit. Each gets its own system prompt, tool access, and optionally a specific model (Opus, Sonnet, Haiku). They&#x27;re powerful for specialization, but they still run one at a time within a single session.</p>
<p class="my-5"><strong class="font-semibold text-fg">Manual worktrees</strong> are the DIY version. You open multiple terminal tabs, check out separate Git worktrees, and run independent Claude Code sessions in each one. You get full context isolation and parallel execution, but you&#x27;re the coordinator. This is what a lot of power users already do for parallel work, and it works well if you don&#x27;t mind managing the merges yourself.</p>
<p class="my-5"><strong class="font-semibold text-fg">Agent teams</strong> add automated coordination on top of parallel sessions. The team lead manages a shared task list, teammates communicate through inboxes, and you can monitor everyone from one place. The tradeoff: you give up some control in exchange for not having to manually orchestrate across tabs.</p>
<p class="my-5">Subagents and custom agents are single-session primitives. Manual worktrees and agent teams are multi-session primitives. Context isolation (each session having its own window) makes true parallel work possible, but also makes coordination hard.</p>
<h3 id="the-c-compiler-version-is-a-different-harness" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">The C compiler version is a different harness</h3>
<p class="my-5">One thing that confused us initially: the agent teams feature shipping in Claude Code today and the setup Carlini used for the C compiler project are related but not identical.</p>
<p class="my-5">Carlini&#x27;s harness is more bare-bones. He spins up Docker containers, each with its own clone of a shared bare git repo. Each agent runs in an infinite loop: finish a task, push changes, pull from upstream, pick the next task. Coordination happens through git&#x27;s own conflict resolution and a lock file system where agents claim tasks by writing to current_tasks/. There&#x27;s no orchestration agent or inbox system. <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Each Claude just decides what to work on next</a>.</p>
<p class="my-5">The Claude Code agent teams feature adds more structure: a team lead role, explicit task assignment, inter-agent messaging, and the ability to interact with individual teammates without stopping the team. But both approaches share the same core idea: multiple Claude instances, each with independent context, working on a shared codebase.</p>
<p class="my-5">Carlini&#x27;s version ran 16 agents for two weeks and produced a compiler that can build Linux 6.9. Claude Code features a research preview with known limitations <a href="https://code.claude.com/docs/en/agent-teams" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">around session resumption, task coordination, and shutdown behavior</a>. The primitive works, but the shipping feature is still a research preview.</p>
<p class="my-5">If you&#x27;ve been following <a href="http://steve-yegge.medium.com/welcome-to-gas-town" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Steve Yegge&#x27;s Gas Town framework</a>, agent teams cover similar ground with a simpler coordination model: one lead, N workers, inbox messaging.</p>
<p class="my-5">Gas Town uses a more elaborate role hierarchy (mayor, polecats, witnesses) and has been in use longer.</p>
<p class="my-5">Both are trying to solve the same problem: how do you coordinate multiple Claude instances working on a shared codebase?</p>
<p class="my-5">Agent teams bake a minimal version of this into Claude Code itself rather than requiring an external harness.</p>
<h2 id="when-do-agent-teams-work" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">When do agent teams work?</h2>
<p class="my-5">Based on 24 hours of use, we found Agent Teams have a narrow sweetspot: tasks where multiple agents can explore a problem in parallel, mostly by reading, without needing to write to the same files.</p>
<h3 id="read-heavy-parallel-exploration" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Read-heavy parallel exploration</h3>
<p class="my-5">The strongest use case is when you have a question with multiple angles, and each angle can be explored independently. We call it <em>multi-perspective investigation</em>.</p>
<p class="my-5"><strong class="font-semibold text-fg">Code review from multiple perspectives.</strong> You&#x27;re reviewing a large PR and want a security audit, a performance review, and an architectural assessment happening simultaneously. Each agent reads the diff, checks different things, and reports findings to the lead. The agents never conflict because they&#x27;re all reading, but not writing code.</p>
<p class="my-5"><strong class="font-semibold text-fg">Bug investigation.</strong> You have a production error and don&#x27;t know where to start. One agent traces the stack trace through the codebase, another checks recent commits that touched the relevant modules, a third reads the test suite for coverage gaps. Each agent narrows the search space, and the lead synthesizes a hypothesis from their findings.</p>
<p class="my-5"><strong class="font-semibold text-fg">Library evaluation.</strong> You&#x27;re choosing between three ORMs for a new service. Each agent evaluates one: reads the docs, checks GitHub issues, looks at the API surface, assesses compatibility with your stack. Instead of serial research, you get three parallel evaluations that the lead can compare.</p>
<p class="my-5">The team lead synthesizes perspectives you&#x27;d otherwise read and compare yourself.</p>
<h3 id="how-to-structure-tasks-so-agents-dont-collide" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">How to structure tasks so agents don&#x27;t collide</h3>
<p class="my-5">The moment agents start writing code, you need to think about file boundaries.</p>
<p class="my-5">Anthropic&#x27;s docs are direct about this: two teammates editing the same file leads to overwrites. The lead assigns work rather than merging results, so you need to break work into units where each agent owns distinct files.</p>
<p class="my-5"><strong class="font-semibold text-fg">Module-per-agent.</strong> If you&#x27;re building a CLI tool, one agent writes the argument parser, another writes the core logic, a third writes the output formatter. Each agent owns a directory or file and doesn&#x27;t touch the others. This is roughly how Carlini structured the C compiler. <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Agents worked on separate compiler passes (lexer, parser, code generator) and pushed changes independently</a>.</p>
<p class="my-5"><strong class="font-semibold text-fg">Test-per-agent.</strong> You have ten modules that need test coverage. Each agent gets assigned a module and writes tests for it. The files are naturally separated because each module has its own test file. This is close to &quot;embarrassingly parallel&quot; because agents are interchangeable and can self-assign from a queue.</p>
<p class="my-5"><strong class="font-semibold text-fg">Spike-per-agent.</strong> You&#x27;re prototyping three different approaches to the same problem. Each agent works in its own branch or directory, building a proof of concept. You compare the results and pick one. The agents never touch shared code because each approach is isolated by design.</p>
<p class="my-5">The common thread: you need to decompose the work <em>before</em> spawning the team, and the decomposition needs to produce units with clear file boundaries. If you can&#x27;t draw those boundaries cleanly, agent teams will fight over files, and right now there&#x27;s no merge resolution built into the coordination layer.</p>
<h3 id="so-what-did-20000-and-16-agents-actually-produce" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">So what did $20,000 and 16 agents actually produce?</h3>
<p class="my-5">Carlini&#x27;s C compiler experiment is the most ambitious test of parallel Claude agents that exists, and it shows the real ceiling of this approach with current models.</p>
<p class="my-5"><strong class="font-semibold text-fg">What worked?</strong> 16 agents, each running in a Docker container with its own git clone, built a Rust-based C compiler from scratch over about two weeks. <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">The result compiles real-world C code, including the Linux 6.9 kernel for x86, ARM, and RISC-V</a>. Without being told to, agents self-organized into roles: deduplication, performance, code quality, documentation.</p>
<p class="my-5"><strong class="font-semibold text-fg">How much did it cost?</strong> 2,000 Claude Code sessions, roughly 2 billion input tokens, and $20,000 in API spend. The compiler is 100,000 lines of Rust.</p>
<p class="my-5"><strong class="font-semibold text-fg">Is it actually good?</strong> Carlini is honest about this: the generated code is less efficient than GCC <em>with optimizations disabled</em>. The compiler proves the approach works, but nobody&#x27;s shipping code with it. The internet claims the <a href="https://x.com/peach2k2/status/2019690036481126569" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">compiler is brittle</a> - thus we need more time to tell whether it’s good or not.</p>
<p class="my-5"><strong class="font-semibold text-fg">What challenges did he face working with multiple agents?</strong></p>
<p class="my-5"><strong class="font-semibold text-fg">Agent Collisions:</strong> When multiple agents hit the same failing test during the Linux kernel compilation, they all tried to fix it simultaneously and overwrote each other&#x27;s changes. Carlini had to build a custom oracle-based test harness that split test cases so agents would encounter different failures. The same file conflict the docs warn about, playing out across 16 agents at once. The solution required custom infrastructure outside of Claude Code itself.</p>
<p class="my-5"><strong class="font-semibold text-fg">Context Rot:</strong> <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Context windows filled up fast</a>. Test output from a full compiler run can flood the context with thousands of lines of irrelevant diagnostics. Carlini built --fast flags that run random subsamples of tests so agents could check their work without burning their entire context on output. Claude also can&#x27;t tell time, so agents would happily run a full test suite for hours without realizing they were blocked. The --fast flags doubled as a time management hack.</p>
<p class="my-5"><strong class="font-semibold text-fg">What did Carlini prove about agent teams:</strong> The compiler experiment proves that parallel Claude agents can produce real, working software at non-trivial scale. It also shows that the coordination problems (file conflicts, context pollution, unbounded execution) don&#x27;t disappear when you throw more agents at them; they multiply. Every solution Carlini built (the oracle test harness, the --fast flags, the task lock files) was custom infrastructure built to solve problems the agents couldn&#x27;t solve on their own.</p>
<h2 id="where-agent-teams-break-down" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Where agent teams break down</h2>
<p class="my-5">Section 2 covered the file conflict and context pollution problems through the lens of Carlini&#x27;s compiler experiment. Those are real, but they&#x27;re also the <em>obvious</em> failure modes. The structural limitations of agent teams as a coordination primitive are more interesting, because they&#x27;re not bugs waiting to be fixed. They follow directly from how the feature works.</p>
<h3 id="agent-collisions" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Agent collisions</h3>
<p class="my-5">When multiple agents work on the same codebase independently, they tend to notice the same things. In the compiler project, agents would all encounter the same failing test during a Linux kernel compilation and independently try to fix it. <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Carlini&#x27;s solution was a custom oracle that split test cases so agents would hit different failures</a>.</p>
<p class="my-5">This isn&#x27;t specific to compilers. If you spin up a team to investigate a production bug, there&#x27;s a good chance multiple teammates will trace the same stack trace to the same root cause and file near-identical reports. The lead then has to deduplicate rather than synthesize. You spent tokens on three agents but got one answer.</p>
<p class="my-5">So what’s the underlying issue? Agent teams don&#x27;t have a mechanism for teammates to check what others are already working on in real time. The inbox system lets them report findings <em>after</em> completing work, but there&#x27;s no shared state that prevents duplicate effort <em>during</em> work. Carlini solved this with lock files in current_tasks/. The Claude Code feature relies on the team lead&#x27;s judgment to assign non-overlapping work upfront, which works well for clearly decomposable tasks and poorly for investigation where the right decomposition isn&#x27;t obvious until you&#x27;re mid-exploration.</p>
<h3 id="supervising-agents" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Supervising agents</h3>
<p class="my-5">Anthropic&#x27;s own docs include <a href="https://code.claude.com/docs/en/agent-teams#monitor-and-steer" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">this line</a>: &quot;Letting a team run unattended for too long increases the risk of wasted effort&quot;. That&#x27;s a carefully worded way of saying agent teams need babysitting.</p>
<p class="my-5">Each agent drifts independently, and the drift compounds. In a single Claude Code session, you can watch the agent&#x27;s reasoning and course-correct when it goes off-track. With a team of four agents running in parallel, you&#x27;re monitoring four streams of work simultaneously.</p>
<p class="my-5"><a href="https://code.claude.com/docs/en/agent-teams#choose-a-display-mode" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">You can cycle between teammates with Shift+Up/Down</a>, but you can only read one at a time. If teammate #3 goes down a rabbit hole while you&#x27;re reviewing teammate #1&#x27;s findings, you won&#x27;t notice until #3 reports back with wasted work.</p>
<p class="my-5">Agent teams exist to parallelize work, but monitoring parallel work is inherently harder than monitoring serial work. The more agents you add, the more supervision overhead you take on. Carlini&#x27;s 16-agent setup required building automated test infrastructure specifically to catch agents that were spinning. For a three-agent team reviewing a PR, the overhead is manageable. For anything larger or longer-running, you need external structure to keep agents on track.</p>
<h3 id="single-model-per-session" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Single model per session</h3>
<p class="my-5">Agent teams don&#x27;t support per-teammate model selection, rather every teammate uses the same model.</p>
<p class="my-5">If your session runs Opus, every teammate runs Opus. If it runs Sonnet, every teammate runs Sonnet. This gets expensive quickly.</p>
<p class="my-5">Different tasks within a parallel workflow have very different intelligence and cost profiles. Planning tasks benefit from a strong model that can reason about architecture. Tasks that grep through a codebase counting function signatures don&#x27;t need Opus-level reasoning and shouldn&#x27;t cost Opus-level tokens. A security review probably wants the strongest model available, while a formatting check could run on Haiku.</p>
<p class="my-5">In the compiler experiment, every agent ran the same model for every type of work: planning, implementing, testing, debugging, documenting. Carlini&#x27;s $20,000 bill reflects this. Some of that spend went toward Opus-level reasoning for tasks that could have been handled by a cheaper model, and there&#x27;s no way to optimize that within the current agent team’s design.</p>
<p class="my-5">Custom agents in Claude Code <em>do</em> support per-agent model selection (you specify the model in the agent&#x27;s .md definition). But custom agents are single-session primitives. Agent teams, which give you parallel execution, don&#x27;t give you model flexibility, so you currently have to choose.</p>
<p class="my-5">For API users, this is a cost optimization problem. For Pro subscription users, it&#x27;s a rate limit problem: agent teams multiply token consumption with no way to route cheaper tasks to cheaper models. A three-agent team burns through your daily allocation roughly three times faster, and every teammate consumes Opus tokens whether the task warrants it or not.</p>
<h3 id="no-checkpoints-or-approval-gates" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">No checkpoints or approval gates</h3>
<p class="my-5">The bottleneck in multi-agent work is validation. Running four agents simultaneously is easy. Knowing whether each agent&#x27;s output is correct before the next agent consumes it is the hard part, and agent teams have no structural answer for it.</p>
<p class="my-5">When a workflow runs through agent teams, progress depends entirely on the model&#x27;s judgment about when a task is &quot;done.&quot; There&#x27;s no mechanism to insert a validation step between phases of work, like &quot;confirm the bug is actually reproduced before starting the fix&quot; or &quot;run the test suite before moving to documentation.&quot;</p>
<p class="my-5">In a single Claude Code session, you can approximate this by being present and saying &quot;wait, check this before continuing.&quot; With agent teams, you&#x27;d need to monitor each teammate&#x27;s progress and manually intervene at the right moment. For a three-agent PR review, that&#x27;s fine because the task is inherently one-shot: each agent reviews and reports. For a multi-phase task like bug reproduction (reproduce, then debug, then fix, then test), there&#x27;s no structural way to enforce &quot;don&#x27;t start debugging until reproduction is confirmed.&quot;</p>
<p class="my-5">The team lead coordinates task <em>assignment</em>, but it doesn&#x27;t validate task <em>completion</em>. A teammate says &quot;done&quot; and the lead trusts it. If the reproduction agent reports &quot;bug reproduced&quot; but actually reproduced something slightly different, the debug agent proceeds on a false premise and the error compounds through every subsequent step. Adding more agents doesn&#x27;t help here. It makes validation harder because there are more handoffs to check.</p>
<h3 id="visibility-is-terminal-output-across-tmux-panes" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Visibility is terminal output across tmux panes</h3>
<p class="my-5">The monitoring interface for agent teams is tmux. You split your terminal into panes, one per teammate, and watch the output scroll. As mentioned before, can also cycle between teammates within a single pane using Shift+Up/Down.</p>
<p class="my-5">For a short-lived team of two or three agents doing read-only work, this is adequate. For anything longer or more complex, you&#x27;re watching multiple streams of unstructured text and trying to hold the state of each agent in your head. There&#x27;s no summary view of &quot;agent 1 is 60% through its task, agent 2 is blocked on a failing test, agent 3 finished and reported findings.&quot; You have to read the raw output and figure that out yourself.</p>
<p class="my-5">Carlini&#x27;s compiler setup had the same visibility challenge at a much larger scale (16 agents). His solution was to watch git commit messages and task lock files to infer what agents were doing. <a href="http://anthropic.com/engineering/building-c-compiler" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">He built external tooling to track progress because the agents themselves didn&#x27;t provide structured status updates</a>.</p>
<p class="my-5">Terminal output shows you what agents are producing, but not which step they&#x27;re on, what&#x27;s passed validation, or what&#x27;s blocked. That kind of structured execution tracking doesn&#x27;t exist in agent teams yet.</p>
<h2 id="whats-the-value-of-structured-orchestration" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">What’s the value of structured orchestration?</h2>
<p class="my-5">Agent teams sit at one point on a coordination spectrum.</p>
<p class="my-5">On one end, subagents: single-session helpers that do a task and report back. On the other end, explicit workflow definitions where every agent, sequence, checkpoint, and model choice is specified upfront. Agent teams land in the middle: multi-session parallelism with coordination through model judgment.</p>
<p class="my-5">The limitations from section 3 (convergence, supervision, single model, no checkpoints, terminal visibility) all trace back to the same design choice: agent teams coordinate through the team lead&#x27;s reasoning rather than through explicit structure. That choice buys you flexibility.</p>
<p class="my-5">You describe what you want in natural language and the lead figures out how to decompose it. But it also means every coordination decision (who works on what, when a task is done, what happens when something fails) depends on the model getting it right.</p>
<p class="my-5">Structured workflow orchestration takes the opposite approach. You define the coordination explicitly: which agents run, in what order, with what validation between steps. The model handles execution within each step, but the structure between steps is fixed.</p>
<p class="my-5">Take the multi-perspective code review from section 2 (security audit, performance review, architectural assessment in parallel) and add a sequential phase: after the reviews complete, an agent synthesizes findings into an action plan, and a final approval step validates the plan before it&#x27;s marked complete.</p>
<p class="my-5">This is how we’d set this up with Reliant:</p>
<figure class="my-10"><img width="584" height="330" loading="lazy" decoding="async" src="https://reliantlabs.io/blog/claude-code-agent-teams/workflow-code-review-pipeline-in-reliant.png" alt="Workflow: Code Review Pipeline in Reliant" class="mx-auto h-auto max-w-full rounded-lg border border-hairline"/></figure>
<p class="my-5">On rejection: Step 2 re-runs with feedback included in context</p>
<p class="my-5">On approval: workflow completes, action plan delivered</p>
<p class="my-5">Each agent runs a different model at a different effort level. The Security and Architecture Reviewers run on Opus because those assessments benefit from stronger reasoning. Performance Reviewer runs on Sonnet because it&#x27;s mostly checking quantitative patterns (N+1 queries, unindexed lookups, unnecessary allocations) where Sonnet is adequate and cheaper. Synthesis Agent runs Opus at max effort because it&#x27;s doing the hardest reasoning in the workflow: reconciling three perspectives into one coherent plan. Approval Agent runs Sonnet at medium effort because it&#x27;s checking against known conventions, not generating novel analysis.</p>
<p class="my-5">In agent teams, all of these would run the same model at the same effort level. For a workflow like this, that means either overpaying for the performance review and approval check (if you run Opus) or under-powering the security review and synthesis (if you run Sonnet).</p>
<p class="my-5">This matters more because models tend to perform differently across roles. Engineers consistently report that LLMs catch problems during review that they introduced during implementation: the same model that writes a bug will flag it when asked to review against the original spec. If review is where models are most reliable, you want your review agents running at high effort on a strong model, and you can afford to run implementation agents cheaper. Uniform model selection across a team prevents that optimization entirely.</p>
<p class="my-5">The checkpoint at Step 3 does something agent teams can&#x27;t express: it gates progress on validation. The approval agent checks the synthesis against the repo&#x27;s conventions (pulled from local context that smart onboarding generated from the codebase). If the action plan misses something or contradicts a convention, the workflow loops back to Step 2 with specific feedback rather than delivering a flawed result. The team lead in agent teams would need to catch this by reading the output and manually intervening.</p>
<p class="my-5">And because each step in the workflow is a defined node, execution tracking shows you exactly where things stand: which parallel reviews have completed, whether the synthesis is running, whether the approval passed or rejected. If the workflow fails at Step 2 (say, a rate limit or context overflow), you resume from Step 2 with the Step 1 results still intact rather than re-running the entire pipeline.</p>
<h3 id="where-this-doesnt-make-sense" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-10 mb-3 text-xl sm:text-2xl">Where this doesn&#x27;t make sense</h3>
<p class="my-5">Structured workflows require you to know the structure upfront. If you&#x27;re investigating a bug and you don&#x27;t know whether the problem is in the frontend, the backend, or the database layer, defining a fixed agent sequence before you&#x27;ve explored the problem is premature. Agent teams are better here because the lead can decompose the work dynamically based on what teammates discover.</p>
<p class="my-5">The same applies to open-ended research, prototyping, and any task where the right decomposition only becomes clear mid-execution. Agent teams trade structural guarantees for flexibility, and that&#x27;s the right tradeoff when the task is genuinely exploratory.</p>
<p class="my-5">There&#x27;s also a subtler limitation: structured workflows shift the bottleneck from &quot;monitoring agent work&quot; to &quot;defining agent work well enough upfront.&quot;</p>
<p class="my-5">Writing a good workflow definition is its own skill. If your task decomposition is wrong, the structure doesn&#x27;t save you; it just makes you wrong in a more organized way. The workflow builder helps by making decomposition visible and editable, but the thinking still has to come from the engineer.</p>
<p class="my-5">The decision framework is straightforward: if you can write down the steps before starting, structured orchestration gives you per-agent model selection, checkpoints, visual tracking, and resume capability. If you can&#x27;t write down the steps because you need to discover them, agent teams let you describe the goal in natural language while the lead figures out decomposition on the fly.</p>
<p class="my-5">Most real engineering work involves both. You investigate (exploratory, agent teams are well-suited) and then you execute a known process (structured, workflow orchestration is well-suited). A bug goes through an open-ended investigation phase where you don&#x27;t know what you&#x27;re looking for, followed by a reproduce-debug-fix-test sequence that follows the same steps every time.</p>
<h2 id="building-on-these-primitives" class="scroll-mt-28 font-semibold tracking-tight text-fg mt-14 mb-4 text-2xl sm:text-3xl">Building on these primitives</h2>
<p class="my-5">Agent teams don&#x27;t exist in isolation. They combine with Claude Code&#x27;s other primitives, and the combinations matter more than any single feature.</p>
<p class="my-5">Custom agents define the roles your teammates play. A teammate spawned as your security-reviewer custom agent carries that agent&#x27;s system prompt, tool permissions, and behavioral constraints into its isolated session. Skills (CLAUDE.md files) give every agent access to your codebase conventions, API patterns, and architectural decisions. Hooks trigger actions at specific points in the execution: run linting after every file edit, execute tests after implementation, post a summary to Slack when a team completes its work. Together, these primitives turn a generic &quot;investigate this codebase&quot; team into a specific, configured squad that knows your project&#x27;s rules and follows your team&#x27;s process.</p>
<p class="my-5">These combinations are assembled manually. You write the custom agent definitions, maintain the skill files, configure the hooks, and prompt the team lead with the right decomposition strategy. The orchestration layer (who runs when, what validates what, when to stop and check) lives in your prompt and the model&#x27;s judgment rather than in explicit structure.</p>
<p class="my-5">Agent teams are still marked experimental in <a href="https://code.claude.com/docs/en/agent-teams" class="text-blue-400 underline underline-offset-2 decoration-blue-400/40 hover:decoration-current transition-colors">Claude Code&#x27;s documentation</a>. Anthropic is iterating on the messaging protocol, the coordination patterns, and the interfaces between lead and teammates. The primitives will get more composable, the coordination will get more structured, and the boundary between &quot;flexible agent team&quot; and &quot;defined workflow&quot; will narrow. Future versions will likely support typed message schemas between agents, coordination strategies beyond the lead-teammate pattern, and hook integration for checkpoint-like validation.</p>
<p class="my-5">For now, the decision framework from section 4 holds. Use agent teams when you need parallel exploration and the decomposition isn&#x27;t known upfront. Use structured workflows when you need sequential handoffs, per-agent configuration, validation between steps, and organizational reuse. Use both when a task has an exploratory phase followed by a known execution process.</p>
<p class="my-5">The engineers getting the most out of multi-agent AI right now are the ones who recognize which phase of work they&#x27;re in and reach for the right primitive. Agent teams gave Claude Code a real parallelism capability. Understanding its boundaries, and knowing what sits beyond them, is how you use it well.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
