<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel>
<title>Max Zimmer</title><link>https://emzimmer.com</link><description>Writing by Max Zimmer.</description>
<item><title>/loop, -p, the Agent SDK, and background sessions, untangled</title><link>https://emzimmer.com/loop-p-agent-sdk-background-sessions/</link><guid>https://emzimmer.com/loop-p-agent-sdk-background-sessions/</guid><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;code&gt;/loop&lt;/code&gt;, &lt;code&gt;-p&lt;/code&gt;, the Agent SDK, and background sessions are four ways to run Claude Code without typing every message yourself. &lt;code&gt;/loop&lt;/code&gt; repeats a prompt inside a session you already have open. &lt;code&gt;-p&lt;/code&gt; runs a single prompt and exits, so it&amp;#39;s the one for scripts. The Agent SDK is that same engine as a Python or TypeScript library. A background session is a normal Claude Code chat that keeps going after you close the terminal.&lt;/p&gt;
&lt;p&gt;The Claude Code docs group all four under one heading on the &lt;a href=&quot;https://code.claude.com/docs/en/sessions#/loop-p-agent-sdk-and-background-sessions&quot;&gt;sessions page&lt;/a&gt;, and what they share is narrow. The session picker and &lt;code&gt;claude --continue&lt;/code&gt; handle each of them differently from a normal chat. If you&amp;#39;re new, that heading makes them look like one feature, or at least four related ones. They&amp;#39;re not. I keep explaining the difference to people who are new to Claude Code, so here it is written down once.&lt;/p&gt;
&lt;h2 id=&quot;short-version&quot;&gt;Short version&lt;/h2&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Is it a chat you can reply to?&lt;/th&gt;
&lt;th&gt;How you start it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A prompt that re-runs on a timer inside your session&lt;/td&gt;
&lt;td&gt;Yes, it&amp;#39;s your current session&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/loop 5m check the deploy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One prompt, one answer, then exit&lt;/td&gt;
&lt;td&gt;No, it prints and quits&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude -p &amp;quot;what does auth.py do?&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent SDK&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&amp;#39;s engine as a library in your own code&lt;/td&gt;
&lt;td&gt;Only if your code builds that&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @anthropic-ai/claude-agent-sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background session&lt;/td&gt;
&lt;td&gt;A full chat with no terminal attached&lt;/td&gt;
&lt;td&gt;Yes, attach or reply anytime&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude --bg &amp;quot;fix the flaky test&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;loop-repeats-a-prompt-in-your-session&quot;&gt;/loop repeats a prompt in your session&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://code.claude.com/docs/en/scheduled-tasks#run-a-prompt-repeatedly-with-%2Floop&quot;&gt;&lt;code&gt;/loop&lt;/code&gt;&lt;/a&gt; re-runs a prompt in the session you&amp;#39;re already in. It&amp;#39;s for waiting on something, like a deploy finishing, CI going green, or review comments landing on a PR. It arrived in &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;Claude Code 2.1.71&lt;/a&gt; in March 2026.&lt;/p&gt;
&lt;p&gt;What you pass decides how it behaves:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;/loop 5m check if the deployment finished    # fixed interval
/loop check whether CI passed                 # Claude picks the interval
/loop                                         # built-in maintenance prompt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With an interval, it runs on a schedule. Units are &lt;code&gt;s&lt;/code&gt;, &lt;code&gt;m&lt;/code&gt;, &lt;code&gt;h&lt;/code&gt;, and &lt;code&gt;d&lt;/code&gt;, and anything under a minute rounds up to a minute. Without an interval, Claude picks the wait after each run, somewhere between one minute and one hour depending on what it saw. A bare &lt;code&gt;/loop&lt;/code&gt; runs a built-in prompt that keeps working on unfinished tasks and tends the current branch&amp;#39;s pull request. You can swap that default for your own instructions in &lt;code&gt;.claude/loop.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The limits matter more than the syntax. A loop only fires while the session is open and idle. Close the terminal and it stops. Recurring loops also delete themselves after seven days, so a forgotten one can&amp;#39;t run forever. If you want something that runs on a schedule without a session open, the docs point you to &lt;a href=&quot;https://code.claude.com/docs/en/scheduled-tasks#compare-scheduling-options&quot;&gt;cloud routines or Desktop scheduled tasks&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;To stop a fixed-interval loop, ask Claude to cancel it. &lt;code&gt;Esc&lt;/code&gt; only stops the self-paced kind.&lt;/p&gt;
&lt;h2 id=&quot;p-runs-one-prompt-then-exits&quot;&gt;-p runs one prompt, then exits&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://code.claude.com/docs/en/headless&quot;&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/a&gt; (short for &lt;code&gt;--print&lt;/code&gt;) runs Claude Code without the chat interface. You hand it a prompt, it does the work, prints the result, and exits. The docs used to call this &amp;quot;headless mode&amp;quot; and now call it &lt;a href=&quot;https://code.claude.com/docs/en/glossary&quot;&gt;non-interactive mode&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;claude -p &amp;quot;Find and fix the bug in auth.py&amp;quot; --allowedTools &amp;quot;Read,Edit,Bash&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the one for scripts, git hooks, and CI. It exits with code 0 on success and non-zero on failure, so a script can branch on the result. Add &lt;code&gt;--output-format json&lt;/code&gt; and you get machine-readable output, including a session ID.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;-p&lt;/code&gt; run isn&amp;#39;t a dead end. It&amp;#39;s saved like any other session (unless you pass &lt;code&gt;--no-session-persistence&lt;/code&gt;), so you can keep going:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;session_id=$(claude -p &amp;quot;Start a review&amp;quot; --output-format json | jq -r &amp;#39;.session_id&amp;#39;)
claude -p &amp;quot;Now focus on the database queries&amp;quot; --resume &amp;quot;$session_id&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I haven&amp;#39;t needed &lt;code&gt;-p&lt;/code&gt; myself yet.&lt;/p&gt;
&lt;h2 id=&quot;the-agent-sdk-is-p-as-a-library&quot;&gt;The Agent SDK is -p as a library&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://code.claude.com/docs/en/agent-sdk/overview&quot;&gt;Agent SDK&lt;/a&gt; gives you &amp;quot;the same tools, agent loop, and context management that power Claude Code,&amp;quot; but you call it from Python or TypeScript instead of the command line. It was called the Claude Code SDK until &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;version 2.0.0&lt;/a&gt; in September 2025, which is why older blog posts use that name.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install @anthropic-ai/claude-agent-sdk   # TypeScript
pip install claude-agent-sdk                 # Python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The SDK runs the Claude Code binary under the hood, and your skills, &lt;code&gt;CLAUDE.md&lt;/code&gt; memory, hooks, and MCP servers load the same way they do in the CLI. Use it when you&amp;#39;re building something: an internal tool, a bot, a product feature that needs an agent. If you&amp;#39;re in a language other than Python or TypeScript, the docs say to shell out to &lt;code&gt;claude -p --output-format json&lt;/code&gt;, which is a good hint at how close the two are.&lt;/p&gt;
&lt;p&gt;If you build a product on it, Anthropic doesn&amp;#39;t let third-party apps offer claude.ai login or subscription rate limits unless they&amp;#39;ve been approved, so your users need to bring an &lt;a href=&quot;https://code.claude.com/docs/en/agent-sdk/quickstart&quot;&gt;API key&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;background-sessions-keep-going-without-a-terminal&quot;&gt;Background sessions keep going without a terminal&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://code.claude.com/docs/en/agent-view&quot;&gt;background session&lt;/a&gt; is a full Claude Code conversation that keeps running when no terminal is attached. You can walk away, open it later, reply, and leave again. This is the newest of the four. The screen that manages them, agent view, landed in &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;2.1.139&lt;/a&gt; in May 2026 and is still labeled a research preview.&lt;/p&gt;
&lt;p&gt;There are three ways in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;claude --bg &amp;quot;investigate the flaky settings test&amp;quot;&lt;/code&gt; starts one straight from your shell&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/bg&lt;/code&gt; (or &lt;code&gt;/background&lt;/code&gt;) inside a session you already have open sends it to the background&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude agents&lt;/code&gt; opens agent view, where each prompt you type starts a new background session&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent view lists every background session and whether it&amp;#39;s working, waiting on you, or done. Press &lt;code&gt;Space&lt;/code&gt; on a row to peek and reply, or &lt;code&gt;Enter&lt;/code&gt; to attach and get the full conversation back.&lt;/p&gt;
&lt;p&gt;A few things happen behind the scenes. When you start a session with &lt;code&gt;--bg&lt;/code&gt; or from agent view, Claude moves it into its own &lt;a href=&quot;https://code.claude.com/docs/en/worktrees&quot;&gt;git worktree&lt;/a&gt; before editing anything, so parallel sessions don&amp;#39;t overwrite each other&amp;#39;s files. A session you sent to the background with &lt;code&gt;/bg&lt;/code&gt; keeps editing where it already was. A small supervisor process keeps the sessions alive, and it&amp;#39;s local, so they stop if your machine shuts down. Each session also uses your subscription quota on its own, so ten at once burns through it about ten times as fast.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/sessions-background.svg&quot; alt=&quot;Background sessions run under a supervisor process, not your terminal. You attach and detach from agent view, and each session edits files in its own worktree.&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;claude -p --bg&lt;/code&gt; is an error, which surprises people. It sounds like &amp;quot;run this in the background without a chat,&amp;quot; but &lt;code&gt;-p&lt;/code&gt; never starts the interactive session that a background session is, so Claude Code refuses before it starts anything. Use &lt;code&gt;claude --bg &amp;quot;prompt&amp;quot;&lt;/code&gt; with the prompt as a plain argument.&lt;/p&gt;
&lt;p&gt;Background sessions come up a lot for me, and mostly Claude starts them, not me. I&amp;#39;ve tried agent view with limited success. It sounds cool, but I don&amp;#39;t find it that easy to make sense of. I like &lt;a href=&quot;/nested-sessions-in-claude-code-desktop/&quot;&gt;nested sessions&lt;/a&gt; in the desktop app a lot, but they&amp;#39;re a different tool for a different job.&lt;/p&gt;
&lt;h2 id=&quot;why-some-sessions-dont-show-up-when-you-resume&quot;&gt;Why some sessions don&amp;#39;t show up when you resume&lt;/h2&gt;
&lt;p&gt;Back to that docs heading. When you run &lt;code&gt;claude --resume&lt;/code&gt; or &lt;code&gt;claude --continue&lt;/code&gt;, Claude Code is looking for conversations you had. It deliberately skips the ones that weren&amp;#39;t conversations in that sense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sessions started with &lt;code&gt;-p&lt;/code&gt; or the Agent SDK are left out of the picker and out of &lt;code&gt;--continue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sessions whose first prompt was &lt;code&gt;/loop&lt;/code&gt; are left out too. Running &lt;code&gt;/loop&lt;/code&gt; later in a normal chat doesn&amp;#39;t hide it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--continue&lt;/code&gt; opens a background session that&amp;#39;s finished, but not one that&amp;#39;s still running. For a running one, attach from &lt;code&gt;claude agents&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are lost. You can open any of them with &lt;code&gt;claude --resume &amp;lt;session-id&amp;gt;&lt;/code&gt;, and &lt;code&gt;claude -p --continue&lt;/code&gt; does include &lt;code&gt;-p&lt;/code&gt;, SDK, and &lt;code&gt;/loop&lt;/code&gt; sessions. The logic makes sense once you see it. If your last ten sessions were cron jobs, you&amp;#39;d want &lt;code&gt;--continue&lt;/code&gt; to skip them and land on the chat you were actually having.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/sessions-resume.svg&quot; alt=&quot;The session picker and claude --continue skip -p, Agent SDK, and /loop-first sessions, but claude --resume with a session ID or claude -p --continue still opens them.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;which-one-to-start-with&quot;&gt;Which one to start with&lt;/h2&gt;
&lt;p&gt;If you&amp;#39;re new, start with background sessions. You&amp;#39;ll run into them anyway, because Claude starts them on its own, so it helps to know what you&amp;#39;re looking at and how to attach to one. Next, try &lt;code&gt;/loop&lt;/code&gt; the first time you catch yourself asking &amp;quot;is it done yet?&amp;quot; Reach for &lt;code&gt;-p&lt;/code&gt; when you want Claude inside a script. Leave the Agent SDK until you&amp;#39;re building something other people will use.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Details as of October 2026, Claude Code 2.1.306.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/sessions&quot;&gt;Manage sessions&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/scheduled-tasks&quot;&gt;Run prompts on a schedule&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/headless&quot;&gt;Run Claude Code programmatically&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/agent-sdk/overview&quot;&gt;Agent SDK overview&lt;/a&gt; and &lt;a href=&quot;https://code.claude.com/docs/en/agent-sdk/quickstart&quot;&gt;quickstart&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/agent-view&quot;&gt;Manage multiple agents with agent view&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/glossary&quot;&gt;Glossary&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;Claude Code changelog&lt;/a&gt;, versions 2.0.0, 2.1.71, and 2.1.139&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@anthropic-ai/claude-code&quot;&gt;@anthropic-ai/claude-code&lt;/a&gt; release dates, npm registry&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Claude Code now remembers where I work</title><link>https://emzimmer.com/saved-environments-in-claude-code-desktop/</link><guid>https://emzimmer.com/saved-environments-in-claude-code-desktop/</guid><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;Starting a Claude Code session in the desktop app used to mean the same small ritual every time. Pick local, SSH, or cloud. Pick the folder. Decide whether you want a worktree. Now you can save all of that as an environment and pick it in one click. An environment is a named preset for where Claude runs, and it shipped in mid-October alongside &lt;a href=&quot;/nested-sessions-in-claude-code-desktop/&quot;&gt;nested sessions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I work in a lot of local repos, one or more per client, and that ritual added up. Re-picking the folder and the worktree setting for every new session was friction I&amp;#39;d stopped noticing until it went away.&lt;/p&gt;
&lt;h2 id=&quot;what-shipped&quot;&gt;What shipped&lt;/h2&gt;
&lt;p&gt;Environments arrived in &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;Claude Desktop v2.42304.0&lt;/a&gt;, the same release that bundled Claude Code 2.1.299 and added nested sessions. The release note reads:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Added environments: save a folder, SSH host, cloud environment, or Remote Control machine, with a worktree and branch setting for each folder, and pick one when you start a session. &amp;quot;Save as environment&amp;quot; at the top of a session saves where it started (not yet in third-party deployments).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://alphasignal.ai/news/anthropic-s-claude-code-now-runs-nested-sessions-and-saves-dev-environments&quot;&gt;AlphaSignal&lt;/a&gt; covered it on October 14 and describes a saved environment as &amp;quot;a named preset.&amp;quot; That&amp;#39;s the clearest way to think about it. &amp;quot;Third-party deployments&amp;quot; means Desktop running against a company&amp;#39;s own model provider instead of a Claude account. Those users don&amp;#39;t get it yet.&lt;/p&gt;
&lt;h2 id=&quot;what-an-environment-holds&quot;&gt;What an environment holds&lt;/h2&gt;
&lt;p&gt;An environment answers &amp;quot;where does Claude run, and on what?&amp;quot; There are four kinds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local&lt;/strong&gt;: one or more folders on your own machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSH&lt;/strong&gt;: a remote machine you connect to, plus a folder on it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud&lt;/strong&gt;: an Anthropic-hosted environment, where sessions keep going after you close the app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote Control&lt;/strong&gt;: another computer of yours running Claude Code that you drive from Desktop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For local and SSH environments, the &lt;a href=&quot;https://code.claude.com/docs/en/desktop#create-a-saved-environment&quot;&gt;desktop docs&lt;/a&gt; say the environment &amp;quot;also holds the folders Claude works in,&amp;quot; so the folder picker disappears from the new-session row once you choose one. Each folder carries its own worktree setting. A worktree is a separate git checkout of the same repo, which lets two sessions edit the same project without stepping on each other. If you always want a worktree for one repo and never for another, you set that once.&lt;/p&gt;
&lt;p&gt;Environment variables live there too. An &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;earlier release&lt;/a&gt; (v2.31226.0) moved them onto saved environments, so &amp;quot;This computer&amp;quot; starts clean and only sessions started from a given environment get its variables. The docs suggest this as the fix for a long-standing annoyance, which is that Desktop launched from the Dock doesn&amp;#39;t pick up everything you export in &lt;code&gt;~/.zshrc&lt;/code&gt;. Add the variables to the environment instead:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;New environment&lt;/strong&gt; or &lt;strong&gt;Edit environment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Environment variables&lt;/strong&gt; and enter one &lt;code&gt;KEY=value&lt;/code&gt; per line.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Create environment&lt;/strong&gt; or &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I haven&amp;#39;t put variables in an environment yet, but I want to try it soon.&lt;/p&gt;
&lt;h2 id=&quot;making-one&quot;&gt;Making one&lt;/h2&gt;
&lt;p&gt;There are a few ways an environment gets created.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From the selector.&lt;/strong&gt; Open the environment selector under the prompt box and pick &lt;strong&gt;New environment&lt;/strong&gt; at the bottom (or press ⌥⌘0). The dialog has a tab for each kind. On the Local tab you give the environment a name and add folders. Each folder gets a &lt;strong&gt;Worktree&lt;/strong&gt; checkbox, and once it&amp;#39;s ticked a branch picker appears so you can choose which branch the worktree starts from. Select &lt;strong&gt;Create environment&lt;/strong&gt; (or &lt;strong&gt;Add environment&lt;/strong&gt; for cloud) and you&amp;#39;re done.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/saved-environments-dialog.png&quot; alt=&quot;The New environment dialog on the Local tab. A folder with Worktree ticked shows a branch picker for choosing which branch the worktree starts from.&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From a running session.&lt;/strong&gt; The changelog says &amp;quot;Save as environment&amp;quot; at the top of a session saves wherever that session started. That&amp;#39;s the version I&amp;#39;d want, since you often only realize a setup is worth keeping after you&amp;#39;ve used it. I couldn&amp;#39;t find the button in my sessions, though, so it may still be rolling out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatically.&lt;/strong&gt; The first time you open the Code tab with the new layout, Desktop creates up to eight environments for you, based on the local and SSH folders you used most in the last month. If you open the selector and find entries you don&amp;#39;t remember making, that&amp;#39;s where they came from. Hover and click the gear icon to edit or delete them.&lt;/p&gt;
&lt;h2 id=&quot;where-they-show-up&quot;&gt;Where they show up&lt;/h2&gt;
&lt;p&gt;Environments now run through the whole Code tab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The New session page has a row under the message box for choosing where Claude runs, plus a card of recent environments. The picker lists local environments first, with keyboard shortcuts (⌥⌘1, ⌥⌘2, and so on), then Cloud and SSH.&lt;/li&gt;
&lt;li&gt;Each session has an Environment card on the new session rail to the right of the conversation, showing the environment it started from, its folder, branch, and Remote Control switch.&lt;/li&gt;
&lt;li&gt;The sidebar can group sessions by environment (Group by &amp;gt; Environment). Sessions with no saved environment fall back to grouping by folder or repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/saved-environments-picker.png&quot; alt=&quot;The environment picker under the message box. Local environments get keyboard shortcuts, and New environment is ⌥⌘0.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-couple-of-rough-edges&quot;&gt;A couple of rough edges&lt;/h2&gt;
&lt;p&gt;The docs and the changelog don&amp;#39;t quite agree on timing. The docs say saved local and SSH environments need Desktop v2.37337.0 or later, while the changelog announces them in v2.42304.0. My guess is a staged rollout, with the feature in the code before it was turned on for everyone. If your selector still sits above the prompt box, you have what the docs call the earlier layout, and updating should fix it.&lt;/p&gt;
&lt;p&gt;Remote Control is the odd one out. The changelog says you can save a Remote Control machine, but the Remote Control tab has no form to fill in. It tells you to run &lt;code&gt;claude rc&lt;/code&gt; on the machine you want to code from, with a link to the &lt;a href=&quot;https://code.claude.com/docs/en/remote-control&quot;&gt;Remote Control docs&lt;/a&gt;. &lt;a href=&quot;https://wmedia.es/en/tips/claude-code-desktop-cloud-environments&quot;&gt;Wmedia&amp;#39;s walkthrough&lt;/a&gt; describes the same thing. My read is that the machine appears in the picker once it&amp;#39;s connected, rather than being something you set up from Desktop.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/saved-environments-remote-control.png&quot; alt=&quot;The Remote Control tab in the New environment dialog. Instead of a form, it says to run claude rc on your machine.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;my-take&quot;&gt;My take&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s a handy shortcut. Most of my sessions start with a client task, and an environment means I&amp;#39;m not digging for the right folder before I can describe the work. I&amp;#39;m still deciding whether I want one environment per repo or one per client. Per repo keeps the worktree setting exact, and per client matches how my work actually arrives.&lt;/p&gt;
&lt;p&gt;I&amp;#39;d be careful with the environment variables. Variables on a shared environment are shared, and the app even shows a message telling you not to put secrets in them. That&amp;#39;s probably fine if you work solo or in a silo, but on a team I&amp;#39;d keep keys somewhere else.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;Claude Desktop changelog&lt;/a&gt; (v2.42304.0 and v2.31226.0)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Claude Code docs: Desktop application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alphasignal.ai/news/anthropic-s-claude-code-now-runs-nested-sessions-and-saves-dev-environments&quot;&gt;AlphaSignal: Anthropic&amp;#39;s Claude Code now runs nested sessions and saves dev environments&lt;/a&gt; (October 14, 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wmedia.es/en/tips/claude-code-desktop-cloud-environments&quot;&gt;Wmedia: Claude Code Desktop environments&lt;/a&gt; (October 14, 2026)&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Claude artifacts can talk back to your session</title><link>https://emzimmer.com/claude-artifacts/</link><guid>https://emzimmer.com/claude-artifacts/</guid><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;Artifacts are amazing! An artifact is a page Claude makes for you (a doc, a deck, a design, a dashboard) that you keep, share, and come back to. The part that surprised me most is that an artifact can talk back. Put a button on the page, click it, and the Claude session it&amp;#39;s open beside gets the message. Open the same artifact on its own and the button has nobody to talk to.&lt;/p&gt;
&lt;p&gt;I got hooked building a dashboard for managing tasks across my Claude sessions. It&amp;#39;s part tool and part dashboard, with resources and notes I can edit as I go, and because artifacts can keep data in a database, all of it sticks around between visits. I&amp;#39;ve also used one to plan the jump from v1 to v2 of an app. Every v1 feature got its own row with a toggle to keep it or skip it, which mattered because v1 was a prototype full of proofs of concept.&lt;/p&gt;
&lt;p&gt;I made an example of each type so you can see them instead of reading about them. They&amp;#39;re linked as we go.&lt;/p&gt;
&lt;h2 id=&quot;five-types&quot;&gt;Five types&lt;/h2&gt;
&lt;p&gt;As of October 2026 there are five kinds of artifact you can start from, each with its own template. &lt;a href=&quot;https://claude.com/resources/articles/dashboards-and-motion&quot;&gt;Docs, Slides, and Design left beta on October 8&lt;/a&gt; and are on every plan, Free included. Dashboards and Motion launched the same day in beta.&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it&amp;#39;s for&lt;/th&gt;
&lt;th&gt;Plans&lt;/th&gt;
&lt;th&gt;Exports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Docs&lt;/td&gt;
&lt;td&gt;Writing you edit together with Claude and other people&lt;/td&gt;
&lt;td&gt;All, including Free&lt;/td&gt;
&lt;td&gt;Word, PDF, Markdown, Google Docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slides&lt;/td&gt;
&lt;td&gt;16:9 decks to present or download&lt;/td&gt;
&lt;td&gt;All, including Free&lt;/td&gt;
&lt;td&gt;PowerPoint, PDF, Google Slides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;Artboards on a canvas: screens, posters, social cards&lt;/td&gt;
&lt;td&gt;All, including Free&lt;/td&gt;
&lt;td&gt;.zip, PDF, PPTX, HTML, Google Slides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboards (beta)&lt;/td&gt;
&lt;td&gt;Charts, numbers, and tables, with sources&lt;/td&gt;
&lt;td&gt;Pro, Max, Team, Enterprise&lt;/td&gt;
&lt;td&gt;None listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motion (beta)&lt;/td&gt;
&lt;td&gt;Animated video&lt;/td&gt;
&lt;td&gt;Team, Enterprise&lt;/td&gt;
&lt;td&gt;MP4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Design looks and feels a lot like Figma: a canvas of artboards you can pan around, comment on, and export. It started life as &lt;a href=&quot;https://www.anthropic.com/news/claude-design-anthropic-labs&quot;&gt;Claude Design, an Anthropic Labs research preview&lt;/a&gt; in April, moved into every conversation in September, and the standalone claude.ai/design site &lt;a href=&quot;https://support.claude.com/en/articles/14604416-get-started-with-claude-design&quot;&gt;closes on December 14&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I made my design example with one simple prompt, asking Design to show off what Design can do. Panning across artboards, editing components, and leaving comments right on the canvas all feel like Figma.&lt;/p&gt;
&lt;p&gt;My examples, all made by Claude from one prompt each:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A doc: &lt;a href=&quot;https://claude.ai/artifact/W17MMfAuXW1epzDzEhPShi&quot;&gt;Artifact capabilities cheat sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A deck: &lt;a href=&quot;https://claude.ai/artifact/NX1wRPDhLYc2Mg8D9SK3QQ&quot;&gt;Claude artifacts in 7 slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A design: &lt;a href=&quot;https://claude.ai/artifact/EkRwg4yvwfojf8hv8kazCz&quot;&gt;emzimmer.com post designs&lt;/a&gt;, with a share card, a phone mockup of this post, and a button in three states&lt;/li&gt;
&lt;li&gt;A dashboard: &lt;a href=&quot;https://claude.ai/artifact/VgZRaq4gkYPjyFfmivTaq1&quot;&gt;Claude artifact types at a glance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of them are shared publicly, but they don&amp;#39;t all behave the same signed out. The deck and the design open for anyone, the dashboard loads but asks you to sign in to see its data, and the doc needs a Claude account to open at all.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#39;t make a Motion example because it isn&amp;#39;t on my plan. There&amp;#39;s also no Sheets type, which I half expected. Spreadsheets only show up through the Google Sheets connector.&lt;/p&gt;
&lt;p&gt;You can also skip the templates and have Claude write a plain HTML page. That&amp;#39;s what the two talk-back examples below are.&lt;/p&gt;
&lt;h2 id=&quot;what-a-page-can-do&quot;&gt;What a page can do&lt;/h2&gt;
&lt;p&gt;A plain artifact is a web page, so it can do whatever a page can. The interesting part is what Claude adds on top. According to &lt;a href=&quot;https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them&quot;&gt;Anthropic&amp;#39;s help center&lt;/a&gt; and the &lt;a href=&quot;https://code.claude.com/docs/en/artifacts&quot;&gt;Claude Code docs&lt;/a&gt;, an artifact can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;call Claude with no API key, with usage counted against the viewer&amp;#39;s plan, not yours&lt;/li&gt;
&lt;li&gt;use your connectors (Google Drive, Notion, and so on), running as whoever is viewing&lt;/li&gt;
&lt;li&gt;keep data between visits, up to 20 MB per artifact&lt;/li&gt;
&lt;li&gt;take comments, and in a doc you can mention @Claude to ask for an edit&lt;/li&gt;
&lt;li&gt;in Claude Code, keep every publish as a version you can switch between&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Claude Code these are called capabilities, and a page asks for them by name when it&amp;#39;s published. My &lt;a href=&quot;https://claude.ai/artifact/W17MMfAuXW1epzDzEhPShi&quot;&gt;cheat sheet&lt;/a&gt; lists all eleven.&lt;/p&gt;
&lt;h2 id=&quot;sharing&quot;&gt;Sharing&lt;/h2&gt;
&lt;p&gt;Artifacts start private. On Pro and Max you can keep one to yourself or share it with anyone who has the link. Team and Enterprise add &amp;quot;only people invited&amp;quot; and &amp;quot;anyone at your org&amp;quot;, and public links stay off until an owner turns on external sharing, per the &lt;a href=&quot;https://support.claude.com/en/articles/9547008-publishing-remixing-and-sharing-artifacts&quot;&gt;sharing article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One rule matters for anything clever. An artifact that uses your connectors or calls Claude &lt;a href=&quot;https://support.claude.com/en/articles/16994751-artifacts-admin-guide-for-team-and-enterprise-plans&quot;&gt;can&amp;#39;t be shared with &amp;quot;anyone with the link&amp;quot;&lt;/a&gt;. That makes sense, since it would run on the viewer&amp;#39;s account, but it means the most interesting artifacts are the hardest to show off.&lt;/p&gt;
&lt;h2 id=&quot;talking-back-to-the-session&quot;&gt;Talking back to the session&lt;/h2&gt;
&lt;p&gt;This is the really cool part. A page can hand data to the Claude conversation it&amp;#39;s open beside, using a function called &lt;code&gt;sendToClaudeSession&lt;/code&gt;. It isn&amp;#39;t in the public docs yet. I found it in the type definitions that ship with Claude Code (runtime contract 0.2.85), and the public &lt;a href=&quot;https://code.claude.com/docs/en/artifacts&quot;&gt;artifacts page&lt;/a&gt; only suggests a &amp;quot;Copy as prompt&amp;quot; button you paste from.&lt;/p&gt;
&lt;p&gt;It works in two modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stage&lt;/code&gt; (the default) drops the data in your message box as an attachment, and nothing reaches Claude until you send a message of your own&lt;/li&gt;
&lt;li&gt;&lt;code&gt;send&lt;/code&gt; shows you what the page wants to send and asks you to confirm, then starts Claude&amp;#39;s turn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my test only &lt;code&gt;stage&lt;/code&gt; worked. &lt;code&gt;send&lt;/code&gt; failed with &lt;code&gt;claude_unavailable&lt;/code&gt;, even though the call ran straight from the click. The definitions say that happens on a browser that can&amp;#39;t prove the viewer&amp;#39;s click for a send, so for now I&amp;#39;d build buttons that stage.&lt;/p&gt;
&lt;p&gt;Either way, the click has to come from you. In the type definitions&amp;#39; own words, &amp;quot;There is no way for a page to start Claude&amp;#39;s turn by itself.&amp;quot; Claude also gets the data framed as coming from the page, never as your words or as instructions. Those two rules are what make it safe to put a button like this on a page someone else might open.&lt;/p&gt;
&lt;p&gt;The code is short. The page asks for the &lt;code&gt;room&lt;/code&gt; capability when it&amp;#39;s published, then:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const room = await claude.use(&amp;quot;room&amp;quot;); // null when this view can&amp;#39;t use it

button.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {
  // Call it straight from the click, with nothing awaited first
  room.sendToClaudeSession(
    { label: &amp;quot;Explain this page&amp;quot;, request: &amp;quot;explain&amp;quot; },
    { deliver: &amp;quot;stage&amp;quot; }
  );
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Try it with my &lt;a href=&quot;https://claude.ai/artifact/CpAEXB8sttveaGz59Lyaa2&quot;&gt;talk-back demo&lt;/a&gt;. Pick a request, press a button, and watch it land in your conversation.&lt;/p&gt;
&lt;h3 id=&quot;why-it-fails-when-you-open-it-on-its-own&quot;&gt;Why it fails when you open it on its own&lt;/h3&gt;
&lt;p&gt;When I opened the same artifact by itself from the artifacts panel in the desktop app, the button failed silently. No error, no message. The type definitions explain why. Before sending, a page can call &lt;code&gt;canSendToClaudeSession()&lt;/code&gt;, and when no conversation is open beside it, the answer is &lt;code&gt;no_session&lt;/code&gt;. The data needs somewhere to go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/artifacts-talk-back.svg&quot; alt=&quot;Open beside a Claude session, an artifact&amp;#39;s sendToClaudeSession call puts data in your message box and reaches Claude when you send it. Opened on its own, the same call finds no session.&quot;&gt;&lt;/p&gt;
&lt;p&gt;My demo shows the answer live, so you can see which state you&amp;#39;re in. If you open it from a public link, you&amp;#39;ll see &lt;code&gt;off&lt;/code&gt;, because sending to Claude is never offered there. The definitions also list states where the platform will route a &amp;quot;send&amp;quot; to one of your sessions that already has the artifact, or open a new chat for it. I haven&amp;#39;t seen those happen myself.&lt;/p&gt;
&lt;h2 id=&quot;can-a-dashboard-run-all-your-sessions&quot;&gt;Can a dashboard run all your sessions?&lt;/h2&gt;
&lt;p&gt;Not yet, at least not on my account. Here&amp;#39;s what I tried.&lt;/p&gt;
&lt;p&gt;My first idea for reaching a particular session was webhooks. Claude Code&amp;#39;s cloud sessions do have one, a tool called &lt;code&gt;watch_url&lt;/code&gt;, but its signing secret is sealed so that only the artifact service can use it. It wakes a session when an artifact it watches gets republished, which is useful but isn&amp;#39;t a way for your page to call a session. &lt;a href=&quot;https://code.claude.com/docs/en/routines&quot;&gt;Routines&lt;/a&gt; also accept a webhook, and each one starts a brand new session rather than messaging an existing one.&lt;/p&gt;
&lt;p&gt;The better route is the connector. Cloud sessions in Claude Code come with a Claude Code Remote connector that can &lt;a href=&quot;https://code.claude.com/docs/en/self-hosted-environments-configuration&quot;&gt;start and steer other sessions&lt;/a&gt;, including listing them and sending one a message. An artifact can call your connectors as you. On paper, putting those together lets a page list your sessions and message any of them, one at a time or all at once.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/artifacts-reach.svg&quot; alt=&quot;Three ways a page reaches a session: a button reaches only the session beside it, a connector call to message your sessions is blocked by policy, and the session webhook only fires when the artifact service signs a republish.&quot;&gt;&lt;/p&gt;
&lt;p&gt;So I built it: a Session Switchboard with a row per session, a message box on each, and a broadcast box for the ones you tick. It never got that far. When I opened it, the connector refused with &lt;code&gt;blocked_by_policy&lt;/code&gt; and offered the page no tools at all. The runtime&amp;#39;s type definitions describe that code as organization policy blocking the tool for this viewer. The artifact&amp;#39;s permissions panel showed both tools allowed, and Claude Code Remote doesn&amp;#39;t appear in the connector settings at all, so there was nothing for me to switch on. So for now, at least on my account, an artifact can&amp;#39;t message your other sessions. The button beside a session is the only way back in.&lt;/p&gt;
&lt;h2 id=&quot;my-take&quot;&gt;My take&lt;/h2&gt;
&lt;p&gt;Start with persistent data. Ask Claude for a small tracker (tasks, reading list, whatever you&amp;#39;d otherwise keep in a note) that saves its data in the artifact&amp;#39;s database. It&amp;#39;s the feature my own task dashboard depends on. Once you have one, add a button that sends the current item to Claude, and open it beside a session.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/resources/articles/dashboards-and-motion&quot;&gt;Dashboards and Motion launch post&lt;/a&gt;, Anthropic, October 8, 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/17153992-what-are-artifacts-and-how-do-i-use-them&quot;&gt;What are artifacts and how do I use them?&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/9547008-publishing-remixing-and-sharing-artifacts&quot;&gt;Publishing, remixing, and sharing artifacts&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/16994751-artifacts-admin-guide-for-team-and-enterprise-plans&quot;&gt;Artifacts admin guide for Team and Enterprise plans&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/14604416-get-started-with-claude-design&quot;&gt;Get started with Claude Design&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/16923645-get-started-with-claude-docs&quot;&gt;Get started with Claude Docs&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/17454997-get-started-with-claude-motion&quot;&gt;Get started with Claude Motion&lt;/a&gt;, Claude Help Center&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/claude-design-anthropic-labs&quot;&gt;Introducing Claude Design&lt;/a&gt;, Anthropic, April 17, 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/artifacts&quot;&gt;Artifacts in Claude Code&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/routines&quot;&gt;Routines&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/self-hosted-environments-configuration&quot;&gt;Self-hosted environments configuration&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/build-artifacts&quot;&gt;Build and share AI-powered artifacts&lt;/a&gt;, Anthropic&lt;/li&gt;
&lt;li&gt;Artifact runtime type definitions (&lt;code&gt;room.d.ts&lt;/code&gt;, contract 0.2.85), bundled with Claude Code 2.1.302&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Git for people who started with Claude Code</title><link>https://emzimmer.com/git-for-claude-code-beginners/</link><guid>https://emzimmer.com/git-for-claude-code-beginners/</guid><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;If you came to Claude Code without a programming background, git is the thing you&amp;#39;re most likely to trip on. It shows up everywhere. The desktop app has a worktree toggle, sessions sit on branches with names like &lt;code&gt;worktree-bright-running-fox&lt;/code&gt;, Claude offers to commit and open a pull request, and the diff view counts lines in green and red. Claude will happily run all of it for you. But if you don&amp;#39;t know what a commit or a branch is, you can&amp;#39;t tell whether Claude did the right thing, and you can&amp;#39;t undo it when it didn&amp;#39;t. Five ideas cover almost all of it: repository, commit, branch, remote, and worktree. This post explains each one, then walks through setting up git and GitHub from nothing.&lt;/p&gt;
&lt;p&gt;Short version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git is a free program on your computer that keeps a history of a folder. GitHub is a website that hosts copies of those folders. You need git for Claude Code&amp;#39;s best features, and GitHub mostly for cloud sessions and team work.&lt;/li&gt;
&lt;li&gt;Commit early and often. A commit is a save point you can always get back to.&lt;/li&gt;
&lt;li&gt;Branches let you try things without touching the working version. Worktrees let several Claude sessions each have their own branch at the same time.&lt;/li&gt;
&lt;li&gt;Claude Code&amp;#39;s rewind feature is handy, but it isn&amp;#39;t a backup. Git is.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;git-and-github-arent-the-same-thing&quot;&gt;Git and GitHub aren&amp;#39;t the same thing&lt;/h2&gt;
&lt;p&gt;Git is version control, a program that tracks changes to files. It was written in 2005 by Linus Torvalds and the Linux kernel community, after they lost free use of the tool they&amp;#39;d been using (&lt;a href=&quot;https://git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git&quot;&gt;Pro Git&lt;/a&gt;, &lt;a href=&quot;https://github.blog/open-source/git/git-turns-20-a-qa-with-linus-torvalds/&quot;&gt;GitHub&amp;#39;s 20th anniversary Q&amp;amp;A with Torvalds&lt;/a&gt;). It runs entirely on your machine. Every copy of a project carries the full history, so you don&amp;#39;t need an account, a server, or an internet connection to use it.&lt;/p&gt;
&lt;p&gt;GitHub &amp;quot;builds on Git by hosting your Git projects&amp;quot; (&lt;a href=&quot;https://docs.github.com/en/get-started/start-your-journey/about-github-and-git&quot;&gt;GitHub Docs&lt;/a&gt;) and adds the collaboration layer on top: pull requests, issues, code review, and automation. It isn&amp;#39;t the only host. GitLab, Bitbucket, and Codeberg do the same job, and all three have free tiers.&lt;/p&gt;
&lt;p&gt;So when does Claude Code need GitHub? Locally, it doesn&amp;#39;t. The docs say Claude Code &amp;quot;works in any directory,&amp;quot; git repo or not (&lt;a href=&quot;https://code.claude.com/docs/en/common-workflows&quot;&gt;Common workflows&lt;/a&gt;). A few features do need git, though. Worktrees need a git repository, and so do the desktop app&amp;#39;s session isolation and the &lt;code&gt;/diff&lt;/code&gt; view (&lt;a href=&quot;https://code.claude.com/docs/en/worktrees&quot;&gt;Worktrees&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Desktop&lt;/a&gt;). GitHub specifically comes in for cloud sessions on claude.ai/code, where &amp;quot;repository cloning and pull request creation require GitHub&amp;quot; (&lt;a href=&quot;https://code.claude.com/docs/en/claude-code-on-the-web&quot;&gt;Claude Code on the web&lt;/a&gt;), and for the &lt;code&gt;@claude&lt;/code&gt; GitHub app.&lt;/p&gt;
&lt;p&gt;Make every Claude Code project a git repo, even a folder of notes. It costs nothing and gives you an undo button for everything.&lt;/p&gt;
&lt;h2 id=&quot;a-repository-is-a-folder-with-a-memory&quot;&gt;A repository is a folder with a memory&lt;/h2&gt;
&lt;p&gt;A repository (repo) is a normal folder with a hidden &lt;code&gt;.git&lt;/code&gt; folder inside it. That hidden folder holds the entire history of the project. You make one in two ways.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init                 # turn the current folder into a repo
git clone &amp;lt;url&amp;gt;          # copy an existing repo, history and all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F&quot;&gt;Pro Git&lt;/a&gt; describes three places your work can live. The working tree is the files you see and edit. The staging area (git also calls it the index) is a holding area for changes you&amp;#39;ve picked for the next save. The &lt;code&gt;.git&lt;/code&gt; folder is the permanent history. Most confusion about git comes from forgetting which of those three you&amp;#39;re looking at.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/git-three-areas.svg&quot; alt=&quot;Your edits start in the working tree, git add moves them to the staging area, and git commit saves them permanently in the .git history.&quot;&gt;&lt;/p&gt;
&lt;p&gt;When you start Claude Code in a repo, it reads your git state when the conversation starts: the current branch, uncommitted changes, and recent commits (&lt;a href=&quot;https://code.claude.com/docs/en/how-claude-code-works&quot;&gt;How Claude Code works&lt;/a&gt;). That&amp;#39;s how it knows what you were in the middle of.&lt;/p&gt;
&lt;h2 id=&quot;a-commit-is-a-save-point&quot;&gt;A commit is a save point&lt;/h2&gt;
&lt;p&gt;A commit is a snapshot of your project at a moment in time. Git stores whole snapshots, not lists of edits. Each commit records who made it, a message describing it, a pointer to the commit before it, and an ID. The ID is a 40-character hash like &lt;code&gt;24b9da6552252987aa493b52f8696cd6d3b00373&lt;/code&gt; (&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell&quot;&gt;Pro Git&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Making one by hand takes two steps.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status                       # what changed?
git add notes.md                 # stage this file for the next commit
git commit -m &amp;quot;Add meeting notes&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;git add&lt;/code&gt; step trips people up. It means &amp;quot;add precisely this content to the next commit&amp;quot; (&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository&quot;&gt;Pro Git&lt;/a&gt;). If you edit the file again after adding it, you add it again.&lt;/p&gt;
&lt;p&gt;Pro Git&amp;#39;s advice is to &amp;quot;make each commit a logically separate changeset,&amp;quot; with a short first line in the imperative (&amp;quot;Fix login bug,&amp;quot; not &amp;quot;fixed stuff&amp;quot;) (&lt;a href=&quot;https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project&quot;&gt;Pro Git&lt;/a&gt;). Small commits are easy to review and easy to undo one at a time. A commit that bundles a day&amp;#39;s work is all-or-nothing.&lt;/p&gt;
&lt;p&gt;With Claude Code you rarely type any of this. You say &amp;quot;commit my changes with a descriptive message&amp;quot; and it stages, writes the message, and commits (&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Overview&lt;/a&gt;). By default it adds a &lt;code&gt;Co-Authored-By: Claude ...&lt;/code&gt; line to the message, which you can change with the &lt;code&gt;attribution&lt;/code&gt; setting (&lt;a href=&quot;https://code.claude.com/docs/en/settings-reference&quot;&gt;Settings&lt;/a&gt;). Most commits on this blog have one.&lt;/p&gt;
&lt;p&gt;How often you have Claude commit depends on the work. Each rhythm has its uses.&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When Claude commits&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;th&gt;Trade-off&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;After every change&lt;/td&gt;
&lt;td&gt;Risky or exploratory work, where you want to step back one edit at a time&lt;/td&gt;
&lt;td&gt;A long, noisy history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;At the end of each task&lt;/td&gt;
&lt;td&gt;Most day-to-day work. One commit per finished piece reads cleanly later&lt;/td&gt;
&lt;td&gt;Mid-task mistakes are harder to undo on their own&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only when you ask&lt;/td&gt;
&lt;td&gt;Learning git, or when you want to review everything before it&amp;#39;s saved&lt;/td&gt;
&lt;td&gt;Easy to forget, and uncommitted work has no safety net&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;a-branch-is-a-parallel-version&quot;&gt;A branch is a parallel version&lt;/h2&gt;
&lt;p&gt;A branch is &amp;quot;a lightweight movable pointer&amp;quot; to a commit (&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell&quot;&gt;Pro Git&lt;/a&gt;). That&amp;#39;s all it is. When you commit on a branch, the pointer moves forward to the new commit. Other branches stay where they were.&lt;/p&gt;
&lt;p&gt;This is what makes experiments safe. Your working version lives on &lt;code&gt;main&lt;/code&gt;. You make a branch, try something, and if it works you merge it back. If it doesn&amp;#39;t, you throw the branch away and &lt;code&gt;main&lt;/code&gt; never knew.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git switch -c try-new-layout     # create a branch and move to it
# ...edit and commit...
git switch main                  # go back
git merge try-new-layout         # bring the work in
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/images/git-branch-merge.svg&quot; alt=&quot;Commits made on the try-new-layout branch leave main unchanged until git merge brings them back into main.&quot;&gt;&lt;/p&gt;
&lt;p&gt;A note on names. GitHub has called the default branch &lt;code&gt;main&lt;/code&gt; since October 2020 (&lt;a href=&quot;https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/&quot;&gt;GitHub changelog&lt;/a&gt;). Git itself still calls it &lt;code&gt;master&lt;/code&gt; when you run &lt;code&gt;git init&lt;/code&gt;, and the docs say &amp;quot;this will change to &lt;code&gt;main&lt;/code&gt; when Git 3.0 is released&amp;quot; (&lt;a href=&quot;https://git-scm.com/docs/git-init&quot;&gt;git-init&lt;/a&gt;). Set it once (see setup below) so your local repos match GitHub.&lt;/p&gt;
&lt;p&gt;Sometimes a merge hits a conflict, when the same lines changed differently on both branches. Git stops and writes both versions into the file between &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;=======&lt;/code&gt;, and &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; markers. You (or Claude) pick what to keep, delete the markers, then &lt;code&gt;git add&lt;/code&gt; and &lt;code&gt;git commit&lt;/code&gt; (&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging&quot;&gt;Pro Git&lt;/a&gt;). It looks scarier than it is.&lt;/p&gt;
&lt;h2 id=&quot;a-remote-is-the-copy-somewhere-else&quot;&gt;A remote is the copy somewhere else&lt;/h2&gt;
&lt;p&gt;A remote is a copy of the repo hosted elsewhere, usually GitHub. When you clone, git names it &lt;code&gt;origin&lt;/code&gt; automatically (&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes&quot;&gt;Pro Git&lt;/a&gt;). Three commands move work between your machine and the remote.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; uploads your commits.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git fetch&lt;/code&gt; downloads new commits but doesn&amp;#39;t change your files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; downloads and merges in one step.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your commits live only on your machine until you push. If your laptop dies before then, they&amp;#39;re gone.&lt;/p&gt;
&lt;p&gt;On GitHub, the standard way to merge a branch is a pull request (PR), a &amp;quot;proposal to merge code changes into a project&amp;quot; (&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests&quot;&gt;GitHub Docs&lt;/a&gt;). &lt;a href=&quot;https://docs.github.com/en/get-started/using-github/github-flow&quot;&gt;GitHub flow&lt;/a&gt; is the simple loop most teams use.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a branch.&lt;/li&gt;
&lt;li&gt;Make changes and commit them.&lt;/li&gt;
&lt;li&gt;Push and open a pull request.&lt;/li&gt;
&lt;li&gt;Review and address comments.&lt;/li&gt;
&lt;li&gt;Merge, then delete the branch.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Claude Code opens PRs with GitHub&amp;#39;s &lt;code&gt;gh&lt;/code&gt; command-line tool (&lt;a href=&quot;https://code.claude.com/docs/en/common-workflows&quot;&gt;Common workflows&lt;/a&gt;), so ask it to &amp;quot;create a PR for my changes&amp;quot; and it&amp;#39;ll push the branch and open one. Even when you work alone, a PR gives you one page showing everything Claude changed before it lands on &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;a-worktree-is-a-second-desk&quot;&gt;A worktree is a second desk&lt;/h2&gt;
&lt;p&gt;Claude Code leans on git hardest with worktrees. Normally a repo has one folder, and that folder is on one branch at a time. If two Claude sessions work in the same folder, they edit the same files and step on each other.&lt;/p&gt;
&lt;p&gt;A worktree fixes that. Git lets one repository &amp;quot;support multiple working trees, allowing you to check out more than one branch at a time&amp;quot; (&lt;a href=&quot;https://git-scm.com/docs/git-worktree&quot;&gt;git-worktree&lt;/a&gt;). Each worktree is a separate folder with its own branch, but they all share one history. Commit in one and the others can see it. The one rule is that a branch can only be checked out in one worktree at a time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/git-worktrees.svg&quot; alt=&quot;Two Claude sessions in one folder edit the same files. With worktrees, each session gets its own folder and branch, and both commit to one shared history.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Claude Code wraps this up for you. In the terminal, &lt;code&gt;claude --worktree feature-auth&lt;/code&gt; (or &lt;code&gt;-w&lt;/code&gt;) creates a worktree at &lt;code&gt;.claude/worktrees/feature-auth/&lt;/code&gt; on a branch called &lt;code&gt;worktree-feature-auth&lt;/code&gt;, and starts the session there (&lt;a href=&quot;https://code.claude.com/docs/en/worktrees&quot;&gt;Worktrees&lt;/a&gt;). Leave off the name and Claude makes one up. In the desktop app it&amp;#39;s the Worktree toggle on a new session (&lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Desktop&lt;/a&gt;). Subagents can get their own worktree too, with &lt;code&gt;isolation: worktree&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Two practical tips from the docs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;.claude/worktrees/&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; so the worktree folders don&amp;#39;t show up as changes in your main checkout.&lt;/li&gt;
&lt;li&gt;Files git ignores, like your secrets file, don&amp;#39;t get copied into a new worktree. List them in a &lt;code&gt;.worktreeinclude&lt;/code&gt; file (same syntax as &lt;code&gt;.gitignore&lt;/code&gt;) and Claude Code copies them in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the machinery behind running several sessions at once, which I wrote about in &lt;a href=&quot;/nested-sessions-in-claude-code-desktop/&quot;&gt;nested sessions&lt;/a&gt;. The parent session merges each child&amp;#39;s branch when it&amp;#39;s done.&lt;/p&gt;
&lt;p&gt;I learned this one the hard way. Before I used worktrees, I ran two sessions in the same folder and they overwrote each other&amp;#39;s edits.&lt;/p&gt;
&lt;h2 id=&quot;checkpoints-arent-git&quot;&gt;Checkpoints aren&amp;#39;t git&lt;/h2&gt;
&lt;p&gt;Claude Code has its own undo. Press &lt;code&gt;Esc&lt;/code&gt; twice or type &lt;code&gt;/rewind&lt;/code&gt; and you can roll back the code, the conversation, or both, to any earlier prompt (&lt;a href=&quot;https://code.claude.com/docs/en/checkpointing&quot;&gt;Checkpointing&lt;/a&gt;). It&amp;#39;s great for &amp;quot;no, not like that.&amp;quot;&lt;/p&gt;
&lt;p&gt;It&amp;#39;s not version control, and the docs say so plainly: &amp;quot;Checkpoints are designed for quick, session-level recovery. For permanent version history and collaboration, continue using version control, such as Git, for commits, branches, and long-term history.&amp;quot; Checkpoints only track edits Claude makes with its file tools. The same page says they don&amp;#39;t track &amp;quot;files modified by Bash commands,&amp;quot; so if Claude runs a script that rewrites files, or deletes something with &lt;code&gt;rm&lt;/code&gt;, rewind won&amp;#39;t bring it back. They also don&amp;#39;t cover your own edits, and they expire. A commit doesn&amp;#39;t expire.&lt;/p&gt;
&lt;h2 id=&quot;setting-it-up-from-scratch&quot;&gt;Setting it up from scratch&lt;/h2&gt;
&lt;p&gt;As of October 2026, the latest git is 2.56.0, released September 28 (&lt;a href=&quot;https://git-scm.com/install/mac&quot;&gt;git-scm.com&lt;/a&gt;, &lt;a href=&quot;https://github.com/git/git/tags&quot;&gt;git/git tags&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&quot;1-install-git&quot;&gt;1. Install git&lt;/h3&gt;
&lt;p&gt;On a Mac, the easiest route is Apple&amp;#39;s command line tools, which include git. Or use Homebrew if you have it (&lt;a href=&quot;https://git-scm.com/install/mac&quot;&gt;git-scm.com&lt;/a&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xcode-select --install
# or
brew install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Windows, install &lt;a href=&quot;https://git-scm.com/install/windows&quot;&gt;Git for Windows&lt;/a&gt;, or run &lt;code&gt;winget install --id Git.Git -e --source winget&lt;/code&gt;. On Linux, use your package manager (&lt;code&gt;sudo apt-get install git&lt;/code&gt; or &lt;code&gt;sudo dnf install git&lt;/code&gt;). Check it worked with &lt;code&gt;git --version&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;2-tell-git-who-you-are&quot;&gt;2. Tell git who you are&lt;/h3&gt;
&lt;p&gt;Every commit carries your name and email, &amp;quot;immutably baked into the commits&amp;quot; (&lt;a href=&quot;https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup&quot;&gt;Pro Git&lt;/a&gt;). Set them once. The third line makes new repos start on &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &amp;quot;Your Name&amp;quot;
git config --global user.email you@example.com
git config --global init.defaultBranch main
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-make-a-github-account-and-sign-in-from-the-terminal&quot;&gt;3. Make a GitHub account and sign in from the terminal&lt;/h3&gt;
&lt;p&gt;Sign up at &lt;a href=&quot;https://github.com&quot;&gt;github.com&lt;/a&gt;. The free plan includes unlimited public and private repos and unlimited collaborators (&lt;a href=&quot;https://github.com/pricing&quot;&gt;GitHub pricing&lt;/a&gt;, &lt;a href=&quot;https://docs.github.com/en/get-started/learning-about-github/githubs-plans&quot;&gt;GitHub&amp;#39;s plans&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;GitHub stopped accepting passwords for git in August 2021 (&lt;a href=&quot;https://github.blog/changelog/2021-08-12-git-password-authentication-is-shutting-down/&quot;&gt;GitHub blog&lt;/a&gt;), so you need a token or an SSH key. Skip both and install the GitHub CLI, which handles it for you and is also what Claude Code uses to open PRs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install gh          # Mac; see cli.github.com for Windows and Linux
gh auth login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;gh auth login&lt;/code&gt; opens your browser, signs you in, and offers to set up git&amp;#39;s credentials so &lt;code&gt;git push&lt;/code&gt; just works (&lt;a href=&quot;https://cli.github.com/manual/gh_auth_login&quot;&gt;gh manual&lt;/a&gt;). If you&amp;#39;d rather click than type, &lt;a href=&quot;https://docs.github.com/en/desktop/overview/about-github-desktop&quot;&gt;GitHub Desktop&lt;/a&gt; is a free app for Mac and Windows that does the same.&lt;/p&gt;
&lt;h3 id=&quot;4-create-a-repo&quot;&gt;4. Create a repo&lt;/h3&gt;
&lt;p&gt;You can start on GitHub. Click &lt;strong&gt;+&lt;/strong&gt; then New repository, give it a name, pick public or private, and tick the boxes for a README and a &lt;code&gt;.gitignore&lt;/code&gt; template (&lt;a href=&quot;https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository&quot;&gt;GitHub Docs&lt;/a&gt;). Then clone it.&lt;/p&gt;
&lt;p&gt;Or start from a folder you already have. This turns it into a repo, makes a first commit, creates a private repo on GitHub, and pushes to it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd my-project
git init
git add .
git commit -m &amp;quot;First commit&amp;quot;
gh repo create my-project --private --source=. --remote=origin --push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or skip all of that and ask Claude Code to do it. Now that you know what each step is, you can read along as it does.&lt;/p&gt;
&lt;h3 id=&quot;5-keep-secrets-out&quot;&gt;5. Keep secrets out&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;.gitignore&lt;/code&gt; file lists files git should never track. Put your secrets file in it, along with things like &lt;code&gt;node_modules/&lt;/code&gt; and &lt;code&gt;.DS_Store&lt;/code&gt;, before your first commit. A &lt;code&gt;.gitignore&lt;/code&gt; doesn&amp;#39;t affect files git already tracks. You&amp;#39;d have to untrack them with &lt;code&gt;git rm --cached &amp;lt;file&amp;gt;&lt;/code&gt; (&lt;a href=&quot;https://git-scm.com/docs/gitignore&quot;&gt;gitignore docs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This matters because a committed secret stays in the history even after you delete the file. GitHub&amp;#39;s advice is to revoke and replace the key first, because cleaning history is hard and copies can survive in clones and forks (&lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository&quot;&gt;GitHub Docs&lt;/a&gt;). GitHub&amp;#39;s push protection blocks pushes containing known secrets to public repos by default, but not to private ones unless you turn it on (&lt;a href=&quot;https://docs.github.com/en/code-security/secret-scanning/introduction/about-push-protection&quot;&gt;GitHub Docs&lt;/a&gt;). Private by default is the safer habit.&lt;/p&gt;
&lt;h2 id=&quot;undo-and-what-claude-asks-first&quot;&gt;Undo, and what Claude asks first&lt;/h2&gt;
&lt;p&gt;The undo commands you&amp;#39;ll actually use:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Safe?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git restore &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Throws away uncommitted edits to a file&lt;/td&gt;
&lt;td&gt;Destroys those edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git restore --staged &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unstages a file, keeps your edits&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Makes a new commit that undoes an old one&lt;/td&gt;
&lt;td&gt;Yes, history is kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git stash&lt;/code&gt; / &lt;code&gt;git stash pop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets uncommitted work aside, then brings it back&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git reset --hard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Moves the branch back and discards local changes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The git docs warn about &lt;code&gt;reset --hard&lt;/code&gt; directly: &amp;quot;Do not do this if you have already given these commits to somebody else&amp;quot; (&lt;a href=&quot;https://git-scm.com/docs/git-reset&quot;&gt;git-reset&lt;/a&gt;). If you&amp;#39;re unsure, &lt;code&gt;revert&lt;/code&gt; is almost always the right answer, and you can ask Claude to do it.&lt;/p&gt;
&lt;p&gt;On permissions, read-only git commands like &lt;code&gt;git status&lt;/code&gt; and &lt;code&gt;git log&lt;/code&gt; run without asking. Everything else, including &lt;code&gt;git commit&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt;, prompts you by default unless you&amp;#39;ve allowed it (&lt;a href=&quot;https://code.claude.com/docs/en/permissions&quot;&gt;Permissions&lt;/a&gt;). In auto mode, Claude blocks force pushes, &lt;code&gt;git reset --hard&lt;/code&gt;, and similar destructive commands on its own. But auto mode allows &amp;quot;pushing to any branch of the repository you&amp;#39;re working in, including the default branch,&amp;quot; without a prompt (&lt;a href=&quot;https://code.claude.com/docs/en/permission-modes&quot;&gt;Permission modes&lt;/a&gt;). If you want a human check before anything reaches GitHub, add &lt;code&gt;Bash(git push *)&lt;/code&gt; to your &lt;code&gt;permissions.ask&lt;/code&gt; rules.&lt;/p&gt;
&lt;h2 id=&quot;how-id-start&quot;&gt;How I&amp;#39;d start&lt;/h2&gt;
&lt;p&gt;I run auto mode and let Claude commit and push. If you&amp;#39;re new to all of this, the one habit that pays off is committing before you ask Claude for anything big. Then whatever happens, &lt;code&gt;git status&lt;/code&gt; shows you what changed and &lt;code&gt;git restore&lt;/code&gt; gets you back. Everything else in this post you can learn when you need it.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/en/v2&quot;&gt;Pro Git book&lt;/a&gt; (history, what git is, recording changes, branching, remotes, first-time setup, contributing)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-init&quot;&gt;git-init&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/docs/git-worktree&quot;&gt;git-worktree&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/docs/git-reset&quot;&gt;git-reset&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/docs/git-restore&quot;&gt;git-restore&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/docs/gitignore&quot;&gt;gitignore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/install/mac&quot;&gt;Install git: macOS&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/install/windows&quot;&gt;Windows&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/install/linux&quot;&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/git/git/tags&quot;&gt;git/git tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/open-source/git/git-turns-20-a-qa-with-linus-torvalds/&quot;&gt;Git turns 20: a Q&amp;amp;A with Linus Torvalds&lt;/a&gt;, GitHub blog, April 2025&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/get-started/start-your-journey/about-github-and-git&quot;&gt;About GitHub and Git&lt;/a&gt;, GitHub Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pricing&quot;&gt;GitHub pricing&lt;/a&gt; and &lt;a href=&quot;https://docs.github.com/en/get-started/learning-about-github/githubs-plans&quot;&gt;GitHub&amp;#39;s plans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/changelog/2021-08-12-git-password-authentication-is-shutting-down/&quot;&gt;Git password authentication is shutting down&lt;/a&gt;, GitHub changelog, August 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/&quot;&gt;The default branch for newly created repositories is now main&lt;/a&gt;, GitHub changelog, October 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/get-started/using-github/github-flow&quot;&gt;GitHub flow&lt;/a&gt; and &lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests&quot;&gt;About pull requests&lt;/a&gt;, GitHub Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository&quot;&gt;Creating a new repository&lt;/a&gt;, GitHub Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cli.github.com/manual/gh_auth_login&quot;&gt;gh auth login&lt;/a&gt; and &lt;a href=&quot;https://cli.github.com/manual/gh_repo_create&quot;&gt;gh repo create&lt;/a&gt;, GitHub CLI manual&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/desktop/overview/about-github-desktop&quot;&gt;About GitHub Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository&quot;&gt;Removing sensitive data from a repository&lt;/a&gt; and &lt;a href=&quot;https://docs.github.com/en/code-security/secret-scanning/introduction/about-push-protection&quot;&gt;About push protection&lt;/a&gt;, GitHub Docs&lt;/li&gt;
&lt;li&gt;Claude Code docs: &lt;a href=&quot;https://code.claude.com/docs/en/common-workflows&quot;&gt;Common workflows&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Overview&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/how-claude-code-works&quot;&gt;How Claude Code works&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/worktrees&quot;&gt;Worktrees&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/checkpointing&quot;&gt;Checkpointing&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Desktop&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/claude-code-on-the-web&quot;&gt;Claude Code on the web&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/settings-reference&quot;&gt;Settings&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/permissions&quot;&gt;Permissions&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/permission-modes&quot;&gt;Permission modes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>I keep my Claude Code sidebar strict</title><link>https://emzimmer.com/keeping-claude-code-sessions-tidy/</link><guid>https://emzimmer.com/keeping-claude-code-sessions-tidy/</guid><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;If you run a lot of Claude Code sessions in the Claude desktop app, the sidebar turns into a junk drawer fast. I keep it in check with three habits. I name every session with the same pattern, I file each one into a section based on its status, and I archive anything that&amp;#39;s finished. None of it is clever. Being strict about it is what makes the difference.&lt;/p&gt;
&lt;p&gt;The sidebar fills up quicker than it used to. &lt;a href=&quot;/nested-sessions-in-claude-code-desktop/&quot;&gt;Nested sessions&lt;/a&gt; let one session spin off half a dozen children, and every one of them is a session you might need to find again next week.&lt;/p&gt;
&lt;h2 id=&quot;name-your-sessions&quot;&gt;Name your sessions&lt;/h2&gt;
&lt;p&gt;The app titles each session for you, and the &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;changelog&lt;/a&gt; shows it generating titles from the conversation. They&amp;#39;re fine in the moment and useless a week later, when five sessions are all called something like &amp;quot;Fix form validation.&amp;quot;&lt;/p&gt;
&lt;p&gt;To rename one, open it and &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;click the session title in the title bar&lt;/a&gt;. The session&amp;#39;s right-click menu has Rename too. I use one pattern for everything:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WXX: YYY - Short task description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;WXX&lt;/code&gt; is the week number, &lt;code&gt;YYY&lt;/code&gt; is the client or ticket identifier, and the rest is a few words about the task. So a session from this week might be &lt;code&gt;W42: ACME01 - Fix donation form validation&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The week number tells me how stale a session is at a glance. The identifier groups a client&amp;#39;s work together when I sort or search. The description is for me, so it only has to make sense to me. It&amp;#39;s a small thing, but a consistent prefix means I can find any session in a couple of seconds.&lt;/p&gt;
&lt;h2 id=&quot;sort-sessions-into-sections&quot;&gt;Sort sessions into sections&lt;/h2&gt;
&lt;p&gt;The sidebar lets you make your own groups, which the app now calls sections. They got that name in &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;v2.42304.0&lt;/a&gt;, the same release that shipped nested sessions. To make one, right-click an empty spot in the sidebar and pick New section. To file a session, right-click it, choose Move to group, and pick a section (or make a new one right there).&lt;/p&gt;
&lt;p&gt;I group by status, not by client, since the naming convention already covers clients. My sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pinned&lt;/strong&gt; is for focus time. Pin is on the session menu, and pinned sessions get their own list in the sidebar. Whatever I&amp;#39;m working on right now goes here, and nothing else does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waiting/Hold&lt;/strong&gt; is for sessions blocked on someone else, usually a client&amp;#39;s approval. They&amp;#39;re not done, but there&amp;#39;s nothing for me to do until I hear back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Past Due&lt;/strong&gt; is for task sessions that have slipped past their due date. Having a section for it means I can&amp;#39;t pretend it isn&amp;#39;t happening.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case Closed&lt;/strong&gt; is where a session goes when the work is done and Claude is running a retrospective on it. Nothing&amp;#39;s needed from me, so the session is closed in all but name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recents&lt;/strong&gt; is everything else. It&amp;#39;s the default spot for sessions that aren&amp;#39;t in a section, so new sessions land there until I file them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The app&amp;#39;s &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Group and sort&lt;/a&gt; menu shows up when you hover over a section heading. It also lets you group by folder, repository, or (since v2.42304.0) environment. I tried those, but status is what I actually need to know when I open the app.&lt;/p&gt;
&lt;h2 id=&quot;archive-whats-closed&quot;&gt;Archive what&amp;#39;s closed&lt;/h2&gt;
&lt;p&gt;Once a session has its retro and nothing else is pending, I archive it. Hover over the session, open its menu, and pick Archive. If your sessions end in pull requests, there&amp;#39;s a setting called &amp;quot;Auto-archive after PR merge or close&amp;quot; in Settings &amp;gt; Claude Code (&lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;docs&lt;/a&gt;). I&amp;#39;ve never used it. I prefer archiving by hand. You can also ask Claude to tidy up. The docs give &amp;quot;archive the sessions whose PRs have merged&amp;quot; as an example.&lt;/p&gt;
&lt;p&gt;Archiving isn&amp;#39;t deleting. Archived sessions live under View all &amp;gt; Archived, and you can unarchive one from there. One thing to know first is what happens to the session&amp;#39;s worktree (the separate git checkout the session works in). For a local session, the worktree stays on disk with its changes, and the app removes it &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;about 30 days&lt;/a&gt; after you archive the session or last open it, whichever is later. If there&amp;#39;s uncommitted work you care about, commit it before you archive.&lt;/p&gt;
&lt;h2 id=&quot;why-bother&quot;&gt;Why bother&lt;/h2&gt;
&lt;p&gt;Partly it&amp;#39;s for me. When I open the app in the morning, the sidebar tells me what&amp;#39;s in focus, what&amp;#39;s blocked, and what&amp;#39;s late, without opening a single session.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s also a practical side. Lots of open sessions cost something. Anthropic has &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;fixed sessions stalling &amp;quot;when many sessions are open&amp;quot;&lt;/a&gt; (v2.7032.0), and there are open GitHub issues about the desktop app eating memory with several sessions running, like &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/101710&quot;&gt;this one&lt;/a&gt; on a 32 GB Windows laptop. There&amp;#39;s no official number for how many sessions is too many. Speed wasn&amp;#39;t why I started archiving, and I&amp;#39;m not claiming it fixes performance. For me it&amp;#39;s about finding things, and a smaller pile doesn&amp;#39;t hurt.&lt;/p&gt;
&lt;p&gt;The setup has rough edges. Since the Recents change, the Recents section &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/103008&quot;&gt;expands itself every time you start a session&lt;/a&gt;. Search can also archive a session by accident. The ⌘K results &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/100949&quot;&gt;mix in actions like Archive and Delete&lt;/a&gt; for the session you have open, so read before you click.&lt;/p&gt;
&lt;h2 id=&quot;my-take&quot;&gt;My take&lt;/h2&gt;
&lt;p&gt;Sessions are cheap to start, so you&amp;#39;ll start a lot of them. The sidebar is the only place that knows about all of them at once, and it only stays useful if you keep it in order. Name it when you start it, move it when its status changes, and archive it when it&amp;#39;s closed. It takes a few seconds per session, and it&amp;#39;s worth doing every time.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Claude Code desktop docs&lt;/a&gt;: renaming, archiving, auto-archive, worktree cleanup, Group and sort.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;Claude desktop release notes&lt;/a&gt;: v2.42304.0 (sections, Group and sort, environment grouping), v2.2553.0 (Pinned list), v2.7032.0 (many-sessions fix).&lt;/li&gt;
&lt;li&gt;GitHub issues on anthropics/claude-code: &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/78796&quot;&gt;#78796&lt;/a&gt; (session menu items), &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/100949&quot;&gt;#100949&lt;/a&gt; (search actions), &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/101710&quot;&gt;#101710&lt;/a&gt; (memory), &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/103008&quot;&gt;#103008&lt;/a&gt; (Recents behavior).&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Nested sessions turn one Claude Code session into a switchboard</title><link>https://emzimmer.com/nested-sessions-in-claude-code-desktop/</link><guid>https://emzimmer.com/nested-sessions-in-claude-code-desktop/</guid><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;The Claude desktop app can now hand a task to a whole new Claude Code session that lives under the one you&amp;#39;re in. Anthropic calls these nested sessions. The parent can message its children, the children report back, and each child is a full session you can open and talk to yourself. That last part is what makes them different from subagents. It means I can use one session as an orchestration layer and still stay in the loop on every task it spins off.&lt;/p&gt;
&lt;p&gt;I found this by accident. A suggested task showed up in a conversation, I clicked it, and instead of the usual worktree session I got a child session tucked under the parent in the sidebar.&lt;/p&gt;
&lt;h2 id=&quot;what-shipped&quot;&gt;What shipped&lt;/h2&gt;
&lt;p&gt;Nested sessions arrived in &lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;Claude Desktop v2.42304.0&lt;/a&gt; on October 15, 2026, which bundles Claude Code 2.1.299. The release note says Claude &amp;quot;can start a task in a separate session, which appears under the original session in the sidebar and reports back to it.&amp;quot; &lt;a href=&quot;https://alphasignal.ai/news/anthropic-s-claude-code-now-runs-nested-sessions-and-saves-dev-environments&quot;&gt;AlphaSignal&amp;#39;s writeup&lt;/a&gt; from the day before describes the same thing: a parent splits work into child sessions, and each child &amp;quot;reports the result to the parent when finished.&amp;quot;&lt;/p&gt;
&lt;p&gt;A few details from the release notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It works in local and SSH sessions in the desktop app&amp;#39;s Code tab. Cloud sessions don&amp;#39;t get it, and neither do third-party deployments yet.&lt;/li&gt;
&lt;li&gt;Suggested tasks now appear inline in the conversation instead of above the message box.&lt;/li&gt;
&lt;li&gt;Settings &amp;gt; Claude Code has a new option for what happens when you ask for something unrelated to the current task.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;/h2&gt;
&lt;p&gt;Suggested tasks aren&amp;#39;t new. The &lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;desktop docs&lt;/a&gt; describe them as task chips. When Claude notices something worth fixing that&amp;#39;s out of scope, it offers the work as a chip, and clicking it starts the work in a new session &amp;quot;with its own worktree&amp;quot; while Claude carries on in the current one. A worktree is a separate git checkout of the same repo, so two sessions can edit files without stepping on each other.&lt;/p&gt;
&lt;p&gt;What&amp;#39;s new is where that session goes and what it can do once it&amp;#39;s there. Clicking &amp;quot;create a new session, do it there&amp;quot; opens an options box where you choose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;whether to use a worktree (the docs only mention worktrees, but you can switch it off and run in the parent&amp;#39;s folder)&lt;/li&gt;
&lt;li&gt;the model&lt;/li&gt;
&lt;li&gt;the effort level&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The session that starts sits under its parent in the sidebar. If it outgrows that spot, you can detach it and promote it to a top-level session. Nesting only goes one level deep for now. When a child tries to spawn its own task, the new session shows up as a sibling, not a grandchild.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/nested-sessions-one-level.svg&quot; alt=&quot;Nesting goes one level deep. When a child session spawns a task, the new session appears as a sibling under the same parent, not as a grandchild.&quot;&gt;&lt;/p&gt;
&lt;p&gt;You don&amp;#39;t have to wait for Claude to notice something, either. You can ask the parent to suggest tasks, and it&amp;#39;ll lay out a set of cards that you can accept one at a time or all at once. I haven&amp;#39;t hit a limit on how many children a parent can have. Yesterday I had one session with six nested tasks under it.&lt;/p&gt;
&lt;p&gt;That session was for one client with several asks. The parent held the direction and did the orchestration. Each nested session took one piece of the work in its own worktree, and the parent merged the commits from each child. I could check in on any child&amp;#39;s progress whenever I wanted. When something new came up mid-task, I told the parent, and it passed the update to all six children at once.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/nested-sessions-orchestrator.svg&quot; alt=&quot;The parent session holds the plan and spawns a child per piece of work, each in its own worktree. New information goes to the parent once and it updates every child. Children report commits back, the parent merges them, and you can check in on any child directly.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-parent-can-talk-to-its-children&quot;&gt;The parent can talk to its children&lt;/h2&gt;
&lt;p&gt;The parent-to-child link runs on &lt;a href=&quot;https://code.claude.com/docs/en/cross-session-messaging&quot;&gt;cross-session messaging&lt;/a&gt;, which has been in Claude Code since v2.1.224. Claude finds sessions with a &lt;code&gt;ListAgents&lt;/code&gt; tool and sends with &lt;code&gt;SendMessage&lt;/code&gt;. You don&amp;#39;t call either one yourself. You just say &amp;quot;tell the payments session the schema changed&amp;quot; and Claude writes the message.&lt;/p&gt;
&lt;p&gt;A few things from the docs that matter in practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Replies work both ways.&lt;/strong&gt; The receiving Claude can answer, and the answer comes back to the sender.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing is interrupted.&lt;/strong&gt; If the receiving session is mid-task, the message waits until the current work finishes. If it&amp;#39;s idle, the message starts a new turn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messages carry no authority.&lt;/strong&gt; A message from another session can&amp;#39;t approve a permission prompt or change settings. Each session keeps its own permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;#39;s plain text.&lt;/strong&gt; A message is text that one Claude writes to another. It never includes the sender&amp;#39;s conversation history or files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#39;s also an idle notice. The parent can ask a child to send a single notice when it next goes idle, which is handy for a long migration or test run. And the desktop app lets Claude list, read, rename, and archive your other Code tab sessions, so the parent can tidy up children whose PRs have merged.&lt;/p&gt;
&lt;h2 id=&quot;how-this-differs-from-the-other-ways-to-run-agents&quot;&gt;How this differs from the other ways to run agents&lt;/h2&gt;
&lt;p&gt;Claude Code now has a lot of ways to run work in parallel. The &lt;a href=&quot;https://code.claude.com/docs/en/agents&quot;&gt;docs&amp;#39; comparison page&lt;/a&gt; lists five of them, and that&amp;#39;s before nested sessions. I covered one of them, &lt;a href=&quot;/dynamic-workflows-in-claude-code/&quot;&gt;dynamic workflows&lt;/a&gt;, last week. Here&amp;#39;s where nested sessions fit:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Who coordinates&lt;/th&gt;
&lt;th&gt;Can you talk to a worker directly?&lt;/th&gt;
&lt;th&gt;Isolation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Subagents&lt;/td&gt;
&lt;td&gt;Claude, inside one session&lt;/td&gt;
&lt;td&gt;No, they return a summary&lt;/td&gt;
&lt;td&gt;Own context, optional worktree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent teams&lt;/td&gt;
&lt;td&gt;A lead session, using a shared task list&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No worktrees, so you split up the files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent view&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Its own worktree before it edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested sessions&lt;/td&gt;
&lt;td&gt;The parent session, with you approving each spawn&lt;/td&gt;
&lt;td&gt;Yes, each one is a full session&lt;/td&gt;
&lt;td&gt;Worktree or the parent&amp;#39;s folder, your choice&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Subagents are the closest comparison. Both are delegated work that reports back. The difference is that a subagent is a black box that hands back a summary, while a nested session is a real session with its own history. I can open it, read what it did, correct it, and send it back to work. It&amp;#39;s a subagent I can manage. Agent teams are still experimental and off by default, and they lean toward Claude running the show. Nested sessions keep me as the one who says yes to each task.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/nested-sessions-vs-subagent.svg&quot; alt=&quot;A subagent works inside one session and hands back a summary. A nested session is spawned by the parent and reports back to it, but it&amp;#39;s a full session you can open and steer yourself.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-i-use-them-for&quot;&gt;What I use them for&lt;/h2&gt;
&lt;p&gt;My main use is complex work where I need to stay in the loop on each item. The parent holds the overall plan and acts as the orchestration layer. Each item becomes a nested session that I can check, steer, and approve on its own. That keeps the parent&amp;#39;s context focused on coordination instead of filling up with the details of six different tasks. Sometimes I open a child and redirect it while it&amp;#39;s running. Sometimes the parent reviews a child&amp;#39;s result before I approve it. I&amp;#39;m sure there are plenty of other ways to set it up.&lt;/p&gt;
&lt;h3 id=&quot;setting-up-the-orchestrator-pattern&quot;&gt;Setting up the orchestrator pattern&lt;/h3&gt;
&lt;p&gt;Here&amp;#39;s how I&amp;#39;d set up the version from my client session. The prompts are examples, so word them however you like.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start the parent in the project folder on the branch you want the work to land on. The parent does the merging, so it should sit where the merges go.&lt;/li&gt;
&lt;li&gt;Give it the whole job and ask for tasks. Something like &amp;quot;Here are the client&amp;#39;s asks. Break them into separate pieces of work and suggest a task for each.&amp;quot;&lt;/li&gt;
&lt;li&gt;Accept the cards, all at once or one by one. Turn the worktree on for any child that might touch the same files as another, and pick a model and effort level per task.&lt;/li&gt;
&lt;li&gt;When something changes, tell the parent, not each child. &amp;quot;The client wants the banner in blue now. Let every task that touches the header know.&amp;quot;&lt;/li&gt;
&lt;li&gt;As children finish, have the parent review and merge. &amp;quot;Child 2 reported back. Check its commits and merge them if they look right.&amp;quot;&lt;/li&gt;
&lt;li&gt;Clean up. Ask the parent to archive the finished children. You&amp;#39;ll get an approval card first unless you&amp;#39;re in Auto or Bypass permissions mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&amp;#39;s also a setting for this. In Settings &amp;gt; Claude Code, you can choose what happens when you ask for a task unrelated to the current one.&lt;/p&gt;
&lt;p&gt;Some other uses that fit well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The out-of-scope fix.&lt;/strong&gt; This is the original purpose of suggested tasks. Claude spots a bug that has nothing to do with the current work, and you send it off to a child session instead of derailing the conversation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearing a backlog.&lt;/strong&gt; Paste in a list of small issues, ask the parent to suggest a task for each one, and accept them all at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Matching the model to the job.&lt;/strong&gt; Since each child gets its own model and effort setting, routine chores can run on a cheaper model at low effort while the hard task gets the big one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-running jobs.&lt;/strong&gt; Put a migration or a slow test suite in a child and have the parent ask to be told when it goes idle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trying two approaches.&lt;/strong&gt; Spin off two children in separate worktrees, each with a different approach, and compare them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;costs-and-rough-edges&quot;&gt;Costs and rough edges&lt;/h2&gt;
&lt;p&gt;Every child is a full session, so the tokens add up. The docs say plainly that &amp;quot;running several sessions or subagents at once multiplies token usage,&amp;quot; and every delivered cross-session message counts toward usage like a prompt you typed. Six children means six sessions&amp;#39; worth of usage.&lt;/p&gt;
&lt;p&gt;The messaging also has limits. Messages are plain text, a single message to a session on the same machine is capped at about a million characters, and a receiving session queues at most 50 messages. Those limits mostly exist to stop two sessions from messaging each other in a loop.&lt;/p&gt;
&lt;p&gt;I haven&amp;#39;t hit a real problem yet. The only awkward part was the first time, which went roughly &amp;quot;huh?&amp;quot; then &amp;quot;oh, cool,&amp;quot; and then a while of wondering how to make the most of it.&lt;/p&gt;
&lt;h2 id=&quot;my-take&quot;&gt;My take&lt;/h2&gt;
&lt;p&gt;This is the multi-agent setup I&amp;#39;ve wanted. Subagents are great when I don&amp;#39;t care how the work gets done. Agent teams and workflows are great when I want Claude to run the whole thing. Most of my real work sits in between. I want help splitting it up and keeping track of it, but I want to make the call on each piece. Nested sessions handle that middle ground, and since they show up as chips you can click, there&amp;#39;s almost nothing to learn.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re on the desktop app, update it, then ask your next session to suggest tasks for whatever you&amp;#39;re working on. Turn off the worktree for small tasks in the same folder and keep it on for anything that edits the same files as the parent.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/docs/cowork/changelog&quot;&gt;Claude Desktop release notes&lt;/a&gt;, v2.42304.0 (October 15, 2026) and v2.31226.0 (October 8, 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/desktop&quot;&gt;Use Claude Code Desktop&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/cross-session-messaging&quot;&gt;Message your other Claude Code sessions&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/agents&quot;&gt;Run agents in parallel&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alphasignal.ai/news/anthropic-s-claude-code-now-runs-nested-sessions-and-saves-dev-environments&quot;&gt;Anthropic&amp;#39;s Claude Code now runs nested sessions and saves dev environments&lt;/a&gt;, AlphaSignal, October 14, 2026&lt;/li&gt;
&lt;li&gt;My own use of the Claude desktop app, October 2026&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Claude Code is also an MCP server. What!?</title><link>https://emzimmer.com/claude-code-is-also-an-mcp-server/</link><guid>https://emzimmer.com/claude-code-is-also-an-mcp-server/</guid><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;Claude Code can run as an MCP server. One command, &lt;code&gt;claude mcp serve&lt;/code&gt;, lets any app that speaks MCP (Claude Desktop, Cursor, or a script you write) use Claude Code&amp;#39;s tools: reading and editing files, running shell commands, searching the web, and, as of a few weeks ago, handing off a whole task to a Claude Code agent. It also does no permission checks of its own, so the app on the other end has to be the one that asks before anything runs.&lt;/p&gt;
&lt;p&gt;I stumbled on this in the &lt;a href=&quot;https://code.claude.com/docs/en/mcp#use-claude-code-as-an-mcp-server&quot;&gt;Claude Code MCP docs&lt;/a&gt; and had no idea what to do with it. So I poked at it until I did.&lt;/p&gt;
&lt;h2 id=&quot;flipping-the-usual-direction&quot;&gt;Flipping the usual direction&lt;/h2&gt;
&lt;p&gt;MCP (Model Context Protocol) is the standard way AI apps connect to outside tools. Usually Claude Code is the client. You add a server, say for GitHub or a database, and Claude Code calls its tools.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;claude mcp serve&lt;/code&gt; turns that around. Claude Code becomes the server, and some other app is the client. That app gets Claude Code&amp;#39;s toolbox without having to build its own file editor or shell runner.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/mcp-serve-flip.svg&quot; alt=&quot;Normally Claude Code is the MCP client and calls other servers. With claude mcp serve, another app calls Claude Code&amp;#39;s tools over stdio, Claude Code&amp;#39;s own MCP servers aren&amp;#39;t passed through, and the calling app has to do the permission checks.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;setting-it-up&quot;&gt;Setting it up&lt;/h2&gt;
&lt;p&gt;Start it like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;claude mcp serve
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing happens. No banner, no prompt, just a terminal that looks frozen. That&amp;#39;s correct. The &lt;a href=&quot;https://code.claude.com/docs/en/mcp#use-claude-code-as-an-mcp-server&quot;&gt;docs&lt;/a&gt; explain that a stdio server talks over standard input and output, so it sits there waiting for a client to connect. You won&amp;#39;t normally run it by hand anyway. The client app starts it for you.&lt;/p&gt;
&lt;p&gt;For Claude Desktop, add this to &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;claude-code&amp;quot;: {
      &amp;quot;type&amp;quot;: &amp;quot;stdio&amp;quot;,
      &amp;quot;command&amp;quot;: &amp;quot;claude&amp;quot;,
      &amp;quot;args&amp;quot;: [&amp;quot;mcp&amp;quot;, &amp;quot;serve&amp;quot;],
      &amp;quot;env&amp;quot;: {}
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If Desktop can&amp;#39;t find &lt;code&gt;claude&lt;/code&gt; on its PATH, you&amp;#39;ll get &lt;code&gt;spawn claude ENOENT&lt;/code&gt;. Run &lt;code&gt;which claude&lt;/code&gt; and put the full path in &lt;code&gt;command&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;The server runs in whatever directory the client launches it from. In my test, &lt;code&gt;pwd&lt;/code&gt; returned the folder I started it in, and every file path is relative to that.&lt;/p&gt;
&lt;h2 id=&quot;what-it-actually-exposes&quot;&gt;What it actually exposes&lt;/h2&gt;
&lt;p&gt;The docs say it exposes &amp;quot;Claude Code&amp;#39;s tools&amp;quot; without listing them, so I asked it directly. A few lines of Python can speak MCP to it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import subprocess, json

p = subprocess.Popen([&amp;quot;claude&amp;quot;, &amp;quot;mcp&amp;quot;, &amp;quot;serve&amp;quot;], stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE, text=True)

def send(msg):
    p.stdin.write(json.dumps(msg) + &amp;quot;\n&amp;quot;)
    p.stdin.flush()

send({&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;initialize&amp;quot;,
      &amp;quot;params&amp;quot;: {&amp;quot;protocolVersion&amp;quot;: &amp;quot;2025-06-18&amp;quot;, &amp;quot;capabilities&amp;quot;: {},
                 &amp;quot;clientInfo&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;probe&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0&amp;quot;}}})
p.stdout.readline()
send({&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;notifications/initialized&amp;quot;})
send({&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 2, &amp;quot;method&amp;quot;: &amp;quot;tools/list&amp;quot;})

for tool in json.loads(p.stdout.readline())[&amp;quot;result&amp;quot;][&amp;quot;tools&amp;quot;]:
    print(tool[&amp;quot;name&amp;quot;])
p.kill()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On Claude Code 2.1.296 I got 24 tools back. The ones that matter most:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Write&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, and &lt;code&gt;NotebookEdit&lt;/code&gt; for files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bash&lt;/code&gt; for shell commands&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WebSearch&lt;/code&gt; and &lt;code&gt;WebFetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Skill&lt;/code&gt;, so a client can run your Claude Code skills&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Workflow&lt;/code&gt;, and &lt;code&gt;SendMessage&lt;/code&gt; for delegating work to subagents&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CronCreate&lt;/code&gt; and friends for scheduling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your list will differ. Mine included tools tied to my own setup, like &lt;code&gt;Artifact&lt;/code&gt; and &lt;code&gt;DesignSync&lt;/code&gt;. What it doesn&amp;#39;t include is any of the MCP servers Claude Code itself is connected to. My Gmail, Notion, and Figma connectors were nowhere in the list. There&amp;#39;s no passthrough, which &lt;a href=&quot;https://www.ksred.com/claude-code-as-an-mcp-server-an-interesting-capability-worth-understanding/&quot;&gt;Kyle Redelinghuys also found&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-it-flew-under-the-radar&quot;&gt;Why it flew under the radar&lt;/h2&gt;
&lt;p&gt;For most of its life this was a remote file editor and shell. Useful, but most MCP clients can already get that from a dedicated filesystem server.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Agent&lt;/code&gt; tool is what makes it interesting, and it barely worked until recently. The &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;changelog&lt;/a&gt; for 2.1.288 says it &amp;quot;fixed the Agent tool in &lt;code&gt;claude mcp serve&lt;/code&gt; always reporting no available agents and rejecting every subagent_type.&amp;quot; Before that fix, a client couldn&amp;#39;t actually hand Claude Code a task.&lt;/p&gt;
&lt;p&gt;Now it can. I sent an &lt;code&gt;Agent&lt;/code&gt; call asking a general-purpose subagent to read a file and tell me its contents. It came back in 4.3 seconds, ran on Opus 5.5, and reported using 33,825 tokens for that one tiny job. So a client can say &amp;quot;go refactor this module&amp;quot; and get a full Claude Code agent doing the work.&lt;/p&gt;
&lt;p&gt;A couple of other recent fixes point the same way. Version 2.1.271 added a progress update every 30 seconds so long commands don&amp;#39;t hit client timeouts. Version 2.1.295 made background Bash results include the output file path. It&amp;#39;s getting steady attention, even if it isn&amp;#39;t getting announcements.&lt;/p&gt;
&lt;h2 id=&quot;be-careful-with-it&quot;&gt;Be careful with it&lt;/h2&gt;
&lt;p&gt;The docs say it plainly. The server &amp;quot;only exposes Claude Code&amp;#39;s tools to your MCP client, so your own client is responsible for implementing user confirmation for individual tool calls.&amp;quot;&lt;/p&gt;
&lt;p&gt;I tested how far that goes. My &lt;code&gt;Bash&lt;/code&gt; and &lt;code&gt;Read&lt;/code&gt; calls ran instantly with no prompt. Then I added a project &lt;code&gt;.claude/settings.json&lt;/code&gt; with deny rules for &lt;code&gt;Bash(rm:*)&lt;/code&gt; and for reading a file called &lt;code&gt;secret.txt&lt;/code&gt;. In my test neither rule stopped anything. The client read the secret and deleted the other file. I only tried this on one machine and one version, so treat it as a warning rather than a spec, but don&amp;#39;t count on your Claude Code permissions to protect you here.&lt;/p&gt;
&lt;p&gt;So only connect a client that asks you before each tool call, and launch it in a folder you&amp;#39;re happy for it to touch.&lt;/p&gt;
&lt;h2 id=&quot;when-id-use-it&quot;&gt;When I&amp;#39;d use it&lt;/h2&gt;
&lt;p&gt;Kyle&amp;#39;s take is that &amp;quot;this isn&amp;#39;t revolutionary for day-to-day coding if your current tools work fine.&amp;quot; That&amp;#39;s fair. If you already live in Claude Code, you don&amp;#39;t need another app driving it.&lt;/p&gt;
&lt;p&gt;It earns its place when the other app is where you already are. Claude Desktop can now hand a coding task to a real Claude Code agent. Your own script or agent can borrow Claude Code&amp;#39;s tools, and your skills, without rebuilding them.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t have a real use for it yet. I mostly wanted to understand it, and I&amp;#39;ll keep using Claude Code directly. But now I know it&amp;#39;s there.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/mcp#use-claude-code-as-an-mcp-server&quot;&gt;Connect Claude Code to tools via MCP&lt;/a&gt;, Claude Code docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md&quot;&gt;Claude Code changelog&lt;/a&gt;, versions 2.1.271, 2.1.288, and 2.1.295&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ksred.com/claude-code-as-an-mcp-server-an-interesting-capability-worth-understanding/&quot;&gt;Claude Code MCP Server: Complete Setup Guide&lt;/a&gt;, Kyle Redelinghuys, October 2025&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oodle.ai/guides/mcp/claude-code&quot;&gt;Claude Code MCP Server: &lt;code&gt;claude mcp serve&lt;/code&gt; Explained&lt;/a&gt;, Oodle&lt;/li&gt;
&lt;li&gt;My own tests against Claude Code 2.1.296 on macOS, October 2026&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>How close does Workers AI get to the frontier? An October 2026 scorecard</title><link>https://emzimmer.com/workers-ai-frontier-scorecard/</link><guid>https://emzimmer.com/workers-ai-frontier-scorecard/</guid><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;For most of its life, Workers AI was where you went for embeddings, Whisper, and an 8B Llama for classification. Serious reasoning work went to a closed API. That changed in 2026. Since March, Cloudflare has been adding trillion-parameter open-weight models with million-token context windows, and it has been rebuilding its inference stack to serve them.&lt;/p&gt;
&lt;p&gt;So I wanted a direct answer to one question. If you build on Workers AI today, how far behind the frontier are you, and what does it cost you?&lt;/p&gt;
&lt;p&gt;The short version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workers AI lists 69 models. 35 of them are text-generation models.&lt;/li&gt;
&lt;li&gt;The best hosted LLM, GLM-5.3, scores 45 on the Artificial Analysis Intelligence Index. The leader, Claude Opus 5.5, scores 58. That puts the best Workers AI model at about 78% of the top score.&lt;/li&gt;
&lt;li&gt;GLM-5.3-Flash scores 42 and costs about 4% of what Opus 5.5 costs on the sample agent workload below.&lt;/li&gt;
&lt;li&gt;Cloudflare&amp;#39;s per-token prices for these models match the model makers&amp;#39; own APIs. You pay the same rate and get Cloudflare&amp;#39;s network, bindings, and billing.&lt;/li&gt;
&lt;li&gt;The large paid models are limited to 20 requests per minute per model per account (50 with prepaid AI Gateway credits). For many production agent fleets, this limit matters more than the benchmark gap.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All figures below were checked on October 9–11, 2026. Both the catalog and the leaderboard change monthly.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;two-catalogs-not-one&quot;&gt;Two catalogs, not one&lt;/h2&gt;
&lt;p&gt;There are two separate Cloudflare model lists, and they are easy to confuse.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI&lt;/a&gt; (69 models). These models run on Cloudflare&amp;#39;s own GPUs, have IDs like &lt;code&gt;@cf/zai-org/glm-5.3&lt;/code&gt;, and are billed in Neurons.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai/models/&quot;&gt;The unified AI catalog&lt;/a&gt; (241 models). This list adds third-party models such as Claude, GPT-6, Gemini, Grok, Seedance, and ElevenLabs. Requests go through AI Gateway, the provider runs inference, and you pay with the provider&amp;#39;s key or with prepaid Cloudflare credits.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So you can call Claude Opus 5.5 from a Worker, but Workers AI is not serving it. Comparing &amp;quot;Workers AI vs frontier&amp;quot; really means comparing Cloudflare-hosted open-weight models with closed models reachable through the same binding.&lt;/p&gt;
&lt;h3 id=&quot;whats-actually-hosted&quot;&gt;What&amp;#39;s actually hosted&lt;/h3&gt;
&lt;p&gt;Here is the Workers AI catalog by task type, taken from the models page (last updated August 12, 2026):&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Count&lt;/th&gt;
&lt;th&gt;Notable models&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Text generation&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;35&lt;/td&gt;
&lt;td&gt;&lt;code&gt;glm-5.3&lt;/code&gt;, &lt;code&gt;glm-5.3-flash&lt;/code&gt;, &lt;code&gt;deepseek-v4-pro-0813&lt;/code&gt;, &lt;code&gt;deepseek-v4-flash-0731&lt;/code&gt;, &lt;code&gt;kimi-k2.6&lt;/code&gt;, &lt;code&gt;kimi-k2.7-code&lt;/code&gt;, &lt;code&gt;qwen3.8-27b&lt;/code&gt;, &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;, &lt;code&gt;nemotron-3-120b-a12b&lt;/code&gt;, &lt;code&gt;gpt-oss-120b&lt;/code&gt;, Llama 3.x/4 Scout, Cloudflare&amp;#39;s own &lt;code&gt;clef&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text-to-image&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;10&lt;/td&gt;
&lt;td&gt;FLUX.2 dev / klein 4B / klein 9B, FLUX.1 schnell, Leonardo Lucid Origin and Phoenix, SDXL variants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text embeddings&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bge-m3&lt;/code&gt;, &lt;code&gt;bge-*-en-v1.5&lt;/code&gt;, &lt;code&gt;embeddinggemma-300m&lt;/code&gt;, &lt;code&gt;qwen3-embedding-0.6b&lt;/code&gt;, &lt;code&gt;plamo-embedding-1b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech recognition&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;5&lt;/td&gt;
&lt;td&gt;Deepgram &lt;code&gt;nova-3&lt;/code&gt; and &lt;code&gt;flux&lt;/code&gt;, Whisper large-v3-turbo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text-to-speech&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;4&lt;/td&gt;
&lt;td&gt;Deepgram Aura 1/2, MeloTTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classification / reranking&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bge-reranker-base&lt;/code&gt;, DistilBERT SST-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image-to-text&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;moondream3.1-9B-A2B&lt;/code&gt;, LLaVA 1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Translation&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2&lt;/td&gt;
&lt;td&gt;IndicTrans2, M2M100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image classification&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;1&lt;/td&gt;
&lt;td&gt;ResNet-50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice turn detection&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;1&lt;/td&gt;
&lt;td&gt;Pipecat &lt;code&gt;smart-turn-v2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;69&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;One model in that list has no outside equivalent. Clef is Cloudflare&amp;#39;s own 27B multimodal &amp;quot;decision model.&amp;quot; You give it a state (text, JSON, or images) and up to 64 typed questions (&lt;code&gt;noul&lt;/code&gt;, &lt;code&gt;choice&lt;/code&gt;, &lt;code&gt;score&lt;/code&gt;), and it returns a probability for every allowed answer. Input costs $0.24 per million tokens and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/clef/&quot;&gt;output tokens are free&lt;/a&gt;. It is built for routing, triage, and scoring, where people currently ask a chat model for JSON and hope it parses.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-scoreboard&quot;&gt;The scoreboard&lt;/h2&gt;
&lt;p&gt;To compare models, I used the &lt;a href=&quot;https://artificialanalysis.ai/leaderboards/models&quot;&gt;Artificial Analysis Intelligence Index&lt;/a&gt;. It is currently at v4.3.2 and is a weighted average of 10 evaluations that Artificial Analysis runs itself: agents (30%), coding with Terminal-Bench 4.0 and SciCode (20%), general knowledge and long-context (30%), and scientific reasoning with HLE and CritPt (20%). Full weights are in the &lt;a href=&quot;https://artificialanalysis.ai/methodology/intelligence-benchmarking&quot;&gt;methodology page&lt;/a&gt;. It is English-only and text-only, and it tells you nothing about speed on Cloudflare specifically. It is still the most consistent independent yardstick available.&lt;/p&gt;
&lt;p&gt;Each model is shown at its highest-effort setting:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Hosted where&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Index&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;% of #1&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Gap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;Anthropic (via Gateway)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;58&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;100%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;td&gt;Anthropic (via Gateway)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;56&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;97%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;−2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td&gt;OpenAI (via Gateway)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;53&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;91%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;−5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 4 Argon&lt;/td&gt;
&lt;td&gt;Google (not in Cloudflare&amp;#39;s catalog)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;53&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;91%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;−5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td&gt;OpenAI (via Gateway)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;52&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;90%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;−6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiMo-V2.6-Pro&lt;/td&gt;
&lt;td&gt;Xiaomi (not on Cloudflare)&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;46&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;79%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;−12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GLM-5.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−13&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GLM-5.3-Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;42&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;72%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−16&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek V4 Pro 0813&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;62%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−22&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen3.8 27B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;34&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;59%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kimi K2.7 Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;26&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;45%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−32&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 26B A4B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;17&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;29%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−41&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nemotron 3 Super&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;22%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−45&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gpt-oss-120b&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;12&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;21%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−46&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Scout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;14%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−50&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 3.3 70B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Workers AI&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;14%&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;−50&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The open-weight frontier is on Cloudflare, with one exception. GLM-5.3 is the #2 open-weight model on the board, one point behind Xiaomi&amp;#39;s MiMo-V2.6-Pro (46), which Workers AI doesn&amp;#39;t host. Kimi K3 (44) isn&amp;#39;t on Workers AI either, though you can reach it as a third-party model through the unified catalog. Within the open-weight field, Cloudflare is close to the top.&lt;/p&gt;
&lt;p&gt;The closed lead is about 13 points, and it is real. A 45 lands around the level of Claude Haiku 5.5 at max effort (43) and GPT-5.6 Terra at max (42). That is a strong model. It is not Opus.&lt;/p&gt;
&lt;p&gt;The models people already have in their code are far behind. If your Worker still calls &lt;code&gt;llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;, you are running a model that scores 8. Changing one string to &lt;code&gt;glm-5.3-flash&lt;/code&gt; gets you to 42.&lt;/p&gt;
&lt;p&gt;Two caveats before you trust a column of numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effort settings differ. GLM-5.3 defaults to &lt;code&gt;max&lt;/code&gt; on Workers AI, so the score above is what you get by default. DeepSeek V4 Pro &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-v4-pro-0813/&quot;&gt;defaults to &lt;code&gt;high&lt;/code&gt;&lt;/a&gt;, while the 36 was measured at &lt;code&gt;max&lt;/code&gt;. Set &lt;code&gt;reasoning_effort: &amp;quot;max&amp;quot;&lt;/code&gt; if you want that number.&lt;/li&gt;
&lt;li&gt;Same weights, different stack. Artificial Analysis benchmarks these models on the makers&amp;#39; own APIs. Cloudflare serves the same weights on its own engine, with its own quantization and kernels. Artificial Analysis lists Cloudflare as a provider only for gpt-oss, Gemma 4, Llama 4 Scout, and Llama 3.3, and &lt;a href=&quot;https://artificialanalysis.ai/leaderboards/providers&quot;&gt;publishes no speed figures for it&lt;/a&gt;. Treat the hosted scores as very likely, not guaranteed.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-it-costs&quot;&gt;What it costs&lt;/h2&gt;
&lt;p&gt;Workers AI bills in Neurons at $0.011 per 1,000, with 10,000 free Neurons per day on both plans (&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;). For LLMs, Cloudflare also publishes per-token equivalents, so you can ignore Neurons and compare dollars directly.&lt;/p&gt;
&lt;p&gt;Cloudflare charges the same per-token rates as the model makers&amp;#39; own APIs.&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Workers AI (in / out per 1M)&lt;/th&gt;
&lt;th&gt;First-party API (in / out)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;GLM-5.3&lt;/td&gt;
&lt;td&gt;$1.40 / $4.40&lt;/td&gt;
&lt;td&gt;$1.40 / $4.40 (Z.ai)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-5.3-Flash&lt;/td&gt;
&lt;td&gt;$0.15 / $0.50&lt;/td&gt;
&lt;td&gt;$0.15 / $0.50 (Z.ai)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro 0813&lt;/td&gt;
&lt;td&gt;$1.32 / $3.96&lt;/td&gt;
&lt;td&gt;$1.32 / $3.96 (DeepSeek)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;First-party prices are as reported on the Artificial Analysis model pages for &lt;a href=&quot;https://artificialanalysis.ai/models/glm-5-3&quot;&gt;GLM-5.3&lt;/a&gt;, &lt;a href=&quot;https://artificialanalysis.ai/models/glm-5-3-flash&quot;&gt;GLM-5.3-Flash&lt;/a&gt;, and &lt;a href=&quot;https://artificialanalysis.ai/models/deepseek-v4-pro&quot;&gt;DeepSeek V4 Pro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For comparison, closed models through the same binding:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Input&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Cached input&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$4.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$0.20&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$20.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$10.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$1.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$2.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$0.10&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$10.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Prices come from &lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing&quot;&gt;Anthropic pricing&lt;/a&gt;; GPT-6 prices from &lt;a href=&quot;https://artificialanalysis.ai/models/gpt-6-astra&quot;&gt;Artificial Analysis&lt;/a&gt; and &lt;a href=&quot;https://www.eesel.ai/blog/gpt-6-astra-pricing&quot;&gt;eesel.ai&amp;#39;s summary of OpenAI&amp;#39;s pricing page&lt;/a&gt;. AI Gateway passes these through &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;with no markup, plus a 5% fee on credit purchases&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;a-worked-example-with-an-agent-fleet&quot;&gt;A worked example with an agent fleet&lt;/h3&gt;
&lt;p&gt;List prices mislead for agent workloads because most input tokens are cache hits. So I priced a concrete day:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;50M input tokens, 80% cache hits&lt;/li&gt;
&lt;li&gt;2M output tokens&lt;/li&gt;
&lt;li&gt;Uncached input, cached input, and output each billed at the rates above. Models without a published cached price pay full input.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Index&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;$/day&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;$/30 days&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;vs Opus 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;53&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$240.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$7,200&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2.7× more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;58&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$88.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$2,640&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;1.0×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;52&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$44.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$1,320&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2.0× cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-5.3&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;45&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$33.20&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$996&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2.7× cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.8 27B&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;34&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$28.90&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$867&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;3.0× cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;36&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$22.88&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$686&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;3.8× cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-120b&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;12&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$19.00&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$570&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;4.6× cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GLM-5.3-Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;42&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;$3.70&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;$111&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;&lt;strong&gt;23.8× cheaper&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;What the table shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GLM-5.3 is only 1.3× cheaper than GPT-6.1 Sol on this workload and scores 7 points lower, because caching narrows the gap. GLM-5.3&amp;#39;s cached input costs $0.26 per million on Workers AI, while Sol&amp;#39;s costs $0.10 and Opus&amp;#39;s costs $0.20. Once 80% of input is cached, the big list-price gap mostly disappears. If your workload is heavily cached, the flagship open model is not the bargain its sticker price suggests.&lt;/li&gt;
&lt;li&gt;GLM-5.3-Flash is the real value story. It scores 42 at $3.70 a day, which is 9× cheaper than GLM-5.3 for 3 fewer points. It is also 5× cheaper than gpt-oss-120b, which has no cached-input discount and scores 12.&lt;/li&gt;
&lt;li&gt;Artificial Analysis&amp;#39;s own cost to run the full index tells the same story: $5.98 for Opus 5.5, $2.01 for GLM-5.3, and $0.25 for GLM-5.3-Flash. Per point of index score, Flash comes out about 17× ahead of Opus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudflare&amp;#39;s own numbers point the same way. When it launched Kimi K2.5 in March, Cloudflare said an internal security-review agent processing over 7 billion tokens a day would have cost about $2.4M a year on a mid-tier proprietary model, and that &lt;a href=&quot;https://blog.cloudflare.com/workers-ai-large-models/&quot;&gt;moving it to Workers AI cut costs by 77%&lt;/a&gt;. That is a vendor estimate, but the direction matches the table.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-cloudflare-can-serve-trillion-parameter-models&quot;&gt;Why Cloudflare can serve trillion-parameter models&lt;/h2&gt;
&lt;p&gt;A year ago, a 1T-parameter model on Workers AI would have sounded like a mistake. A few infrastructure changes made it workable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infire, a Rust inference engine that replaced vLLM in Cloudflare&amp;#39;s stack. In Cloudflare&amp;#39;s &lt;a href=&quot;https://blog.cloudflare.com/cloudflares-most-efficient-ai-inference-engine/&quot;&gt;August 2025 benchmark&lt;/a&gt; on an H100 NVL, it served 17,224 tokens/s against 16,164 for vLLM 0.10.0 at 25% CPU instead of 140%. The CPU savings matter most because Cloudflare can run it bare-metal instead of under gVisor.&lt;/li&gt;
&lt;li&gt;Prefill/decode disaggregation. Prompt processing and token generation run on separate servers behind a token-aware load balancer. Cloudflare reports &lt;a href=&quot;https://blog.cloudflare.com/high-performance-llms/&quot;&gt;p90 inter-token latency falling from about 100 ms to 20–30 ms&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Session-affinity prompt caching. Send an &lt;code&gt;x-session-affinity&lt;/code&gt; header and your requests stick to the node holding your KV cache. Mooncake moves cache between nodes and spills it to NVMe. Internal heavy users raised their cache hit rate from 60% to 80% at peak.&lt;/li&gt;
&lt;li&gt;Speculative decoding with NVIDIA&amp;#39;s EAGLE-3 draft model, which helps most on predictable output like tool calls and JSON.&lt;/li&gt;
&lt;li&gt;Unweight, Cloudflare&amp;#39;s lossless weight compression, which it says &lt;a href=&quot;https://infoq.com/news/2026/05/cloudflare-llm-infrastructure&quot;&gt;cuts model size by about 15–22%&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kimi K2.5 alone is about 560 GB of weights and needs at least eight H100s just to load. Cloudflare says it now starts in under 20 seconds and runs about 3× faster than at launch.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-fine-print-that-bites&quot;&gt;The fine print that bites&lt;/h2&gt;
&lt;h3 id=&quot;rate-limits&quot;&gt;Rate limits&lt;/h3&gt;
&lt;p&gt;This is the one most likely to stop a project. Workers AI&amp;#39;s general LLM limit is 300 requests per minute. The paid-only models (GLM-5.2, GLM-5.3, GLM-5.3-Flash, Kimi K2.6, Kimi K2.7 Code, DeepSeek V4 Flash, and DeepSeek V4 Pro) are limited to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/limits/&quot;&gt;20 requests per minute per model per account&lt;/a&gt;, or 50 if you pay through AI Gateway credits. That is at most 28,800 requests a day at 20 RPM. That is fine for a coding agent but limiting for a consumer chat app. Higher limits require a form.&lt;/p&gt;
&lt;h3 id=&quot;paid-plan-only&quot;&gt;Paid plan only&lt;/h3&gt;
&lt;p&gt;Those same models require Workers Paid or prepaid Gateway credits. The free 10,000 Neurons per day is worth $0.11 and is meant for small models.&lt;/p&gt;
&lt;h3 id=&quot;context-windows-arent-always-what-the-model-card-says&quot;&gt;Context windows aren&amp;#39;t always what the model card says&lt;/h3&gt;
&lt;p&gt;GLM-5.3 and DeepSeek V4 Pro get the full ~1M tokens on Workers AI. But &lt;code&gt;llama-3.3-70b-instruct-fp8-fast&lt;/code&gt; is capped at &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/llama-3.3-70b-instruct-fp8-fast/&quot;&gt;24,000 tokens&lt;/a&gt;, compared with 128k upstream, and its default &lt;code&gt;max_tokens&lt;/code&gt; is 256. Check the model page, not the Hugging Face card.&lt;/p&gt;
&lt;h3 id=&quot;you-cant-turn-glm-5-3s-reasoning-off&quot;&gt;You can&amp;#39;t turn GLM-5.3&amp;#39;s reasoning off&lt;/h3&gt;
&lt;p&gt;It supports &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt;. Legacy values like &lt;code&gt;none&lt;/code&gt; and &lt;code&gt;medium&lt;/code&gt; are silently mapped to &lt;code&gt;max&lt;/code&gt;, which is the most expensive setting. If you are porting code that sends &lt;code&gt;reasoning_effort: &amp;quot;none&amp;quot;&lt;/code&gt;, your bill will go up.&lt;/p&gt;
&lt;h3 id=&quot;models-get-retired&quot;&gt;Models get retired&lt;/h3&gt;
&lt;p&gt;Cloudflare deprecated &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/&quot;&gt;18 models on May 30, 2026&lt;/a&gt;. &lt;code&gt;kimi-k2.5&lt;/code&gt; became an alias for the more expensive K2.6. Pin versions where Cloudflare offers dated IDs (&lt;code&gt;-0813&lt;/code&gt;, &lt;code&gt;-0731&lt;/code&gt;) and watch the changelog.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-id-actually-build&quot;&gt;What I&amp;#39;d actually build&lt;/h2&gt;
&lt;p&gt;The setup that makes sense today is a router. Start on the cheap hosted model and escalate to a frontier model when needed, through the same &lt;code&gt;env.AI&lt;/code&gt; binding:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;export interface Env {
  AI: Ai;
}

export default {
  async fetch(req: Request, env: Env): Promise&amp;lt;Response&amp;gt; {
    const { prompt, hard } = await req.json&amp;lt;{ prompt: string; hard?: boolean }&amp;gt;();

    // Default: Cloudflare-hosted, index 42, $0.15 / $0.50 per 1M tokens
    if (!hard) {
      const r = await env.AI.run(&amp;quot;@cf/zai-org/glm-5.3-flash&amp;quot;, {
        messages: [{ role: &amp;quot;user&amp;quot;, content: prompt }],
      });
      return Response.json(r);
    }

    // Escalation: Claude Opus 5.5 via the unified catalog, index 58
    const r = await env.AI.run(&amp;quot;anthropic/claude-opus-5.5&amp;quot;, {
      max_tokens: 2048,
      messages: [{ role: &amp;quot;user&amp;quot;, content: prompt }],
    });
    return Response.json(r);
  },
} satisfies ExportedHandler&amp;lt;Env&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clef is a natural fit for deciding &lt;code&gt;hard&lt;/code&gt;. It returns calibrated probabilities instead of free text, and output tokens are free.&lt;/p&gt;
&lt;p&gt;My picks by job:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;glm-5.3-flash&lt;/code&gt; is my default workhorse. It scores 42, costs very little, has 1M context, and accepts images.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;glm-5.3&lt;/code&gt; handles the hardest open-weight jobs, but price it against GPT-6.1 Sol if your workload is heavily cached.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clef&lt;/code&gt; or &lt;code&gt;clef-flash&lt;/code&gt; handles classification, routing, and triage.&lt;/li&gt;
&lt;li&gt;Opus 5.5 or GPT-6.1 Sol through AI Gateway covers anything at the frontier. You still get one binding and one bill.&lt;/li&gt;
&lt;li&gt;Retire the Llama 3.x and gpt-oss calls in existing code now. For general reasoning, they are a generation behind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The gap between Workers AI and the frontier is about 13 index points. The gap between the Workers AI models people use and the ones Cloudflare now offers is about 34. For most teams, the second gap is the one to close first.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;method&quot;&gt;Method&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The catalog comes from the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI models page&lt;/a&gt;, all 69 entries extracted and de-duplicated.&lt;/li&gt;
&lt;li&gt;Scores come from the &lt;a href=&quot;https://artificialanalysis.ai/leaderboards/models&quot;&gt;Artificial Analysis leaderboard&lt;/a&gt;, Intelligence Index v4.3.2, checked October 9 and 11, 2026. Scores from older index versions were not mixed in. Kimi K2.6, GLM-5.2, and DeepSeek V4 Flash 0731 are hosted on Workers AI but not on the current board.&lt;/li&gt;
&lt;li&gt;Prices come from Cloudflare&amp;#39;s pricing page (updated October 9, 2026), Anthropic&amp;#39;s pricing docs, and Artificial Analysis model pages. GPT-6 prices were confirmed against a second source that cites OpenAI&amp;#39;s page. Gemini 4 Argon&amp;#39;s price was only available from Artificial Analysis, so it is left out of the cost tables.&lt;/li&gt;
&lt;li&gt;All ratios and the workload table come from a script, not mental math.&lt;/li&gt;
&lt;li&gt;I didn&amp;#39;t measure latency or throughput on Cloudflare&amp;#39;s network, or the quality of the image and speech models.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI models&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/ai/models/&quot;&gt;Unified AI catalog&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;Workers AI pricing&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/limits/&quot;&gt;Workers AI limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-08-28-glm-5.3-workers-ai/&quot;&gt;GLM-5.3 on Workers AI&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-08-26-glm-5.3-flash-workers-ai/&quot;&gt;GLM-5.3-Flash on Workers AI&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/&quot;&gt;Planned model deprecations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;AI Gateway unified billing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/workers-ai-large-models/&quot;&gt;Powering the agents: Workers AI now runs large models&lt;/a&gt; · &lt;a href=&quot;https://blog.cloudflare.com/high-performance-llms/&quot;&gt;Building the foundation for running extra-large language models&lt;/a&gt; · &lt;a href=&quot;https://blog.cloudflare.com/cloudflares-most-efficient-ai-inference-engine/&quot;&gt;Infire&lt;/a&gt; · &lt;a href=&quot;https://infoq.com/news/2026/05/cloudflare-llm-infrastructure&quot;&gt;InfoQ coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://artificialanalysis.ai/leaderboards/models&quot;&gt;Artificial Analysis leaderboard&lt;/a&gt; · &lt;a href=&quot;https://artificialanalysis.ai/methodology/intelligence-benchmarking&quot;&gt;Methodology&lt;/a&gt; · &lt;a href=&quot;https://artificialanalysis.ai/leaderboards/providers&quot;&gt;Provider leaderboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing&quot;&gt;Anthropic API pricing&lt;/a&gt; · &lt;a href=&quot;https://www.eesel.ai/blog/gpt-6-astra-pricing&quot;&gt;GPT-6 Astra pricing (eesel.ai)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>Dynamic workflows in Claude Code move the plan out of the context window</title><link>https://emzimmer.com/dynamic-workflows-in-claude-code/</link><guid>https://emzimmer.com/dynamic-workflows-in-claude-code/</guid><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;Dynamic workflows are simply the most interesting change to Claude Code this year. Claude stops being the orchestrator and starts writing one. Instead of juggling subagents turn by turn, Claude writes a short JavaScript program, a runtime runs it in the background, and only the final answer comes back into the conversation. That makes big agent jobs something you can read, rerun, and resume, like ordinary code.&lt;/p&gt;
&lt;p&gt;I found them by accident. I manage a lot of projects, and I&amp;#39;d asked Claude to go through all their project directories, audit each &lt;code&gt;CLAUDE.md&lt;/code&gt; file, and bring them in line with one standard (limits and formatting to save tokens), while keeping whatever was unique to each project. Then the background tasks window popped open and a couple dozen agents were working at once, each project going through its own audit, rewrite, and verify phases. It was amazing to watch, so I went and figured out what had just happened.&lt;/p&gt;
&lt;p&gt;Every multi-agent setup eventually hits the same wall. The orchestrator is itself an LLM conversation. Each subagent result lands in its context, every &amp;quot;what next?&amp;quot; decision costs a turn, and somewhere around a few dozen delegations the coordinator starts losing the thread.&lt;/p&gt;
&lt;p&gt;Workflows &lt;a href=&quot;https://claude.com/blog/introducing-dynamic-workflows-in-claude-code&quot;&gt;shipped as a research preview on May 28, 2026&lt;/a&gt; and are now generally available. Loops, branching, retries, and intermediate results live in script variables, not in Claude&amp;#39;s context.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/workflow-orchestration.svg&quot; alt=&quot;Turn by turn, every subagent result lands in Claude&amp;#39;s context. In a workflow, Claude writes a script; the runtime spawns agents, keeps results in script variables, and returns only the final answer.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Below, I cover how to trigger one, what the script looks like, how resume and caching work, what it costs, and where I think it does and doesn&amp;#39;t fit.&lt;/p&gt;
&lt;h2 id=&quot;where-workflows-sit&quot;&gt;Where workflows sit&lt;/h2&gt;
&lt;p&gt;Claude Code now has several ways to run work in parallel. The distinction I find most useful, and the one &lt;a href=&quot;https://code.claude.com/docs/en/agents&quot;&gt;the docs draw&lt;/a&gt;, is who holds the plan:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Subagents&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;th&gt;Agent teams&lt;/th&gt;
&lt;th&gt;Workflows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Who decides what runs next&lt;/td&gt;
&lt;td&gt;Claude, turn by turn&lt;/td&gt;
&lt;td&gt;Claude, following a prompt&lt;/td&gt;
&lt;td&gt;A lead agent, turn by turn&lt;/td&gt;
&lt;td&gt;The script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where intermediate results live&lt;/td&gt;
&lt;td&gt;Claude&amp;#39;s context&lt;/td&gt;
&lt;td&gt;Claude&amp;#39;s context&lt;/td&gt;
&lt;td&gt;Shared task list&lt;/td&gt;
&lt;td&gt;Script variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What&amp;#39;s repeatable&lt;/td&gt;
&lt;td&gt;Worker definition&lt;/td&gt;
&lt;td&gt;Instructions&lt;/td&gt;
&lt;td&gt;Team definition&lt;/td&gt;
&lt;td&gt;The orchestration itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical scale&lt;/td&gt;
&lt;td&gt;A few tasks per turn&lt;/td&gt;
&lt;td&gt;Same as subagents&lt;/td&gt;
&lt;td&gt;A handful of peers&lt;/td&gt;
&lt;td&gt;Dozens to hundreds of agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On interruption&lt;/td&gt;
&lt;td&gt;Turn restarts&lt;/td&gt;
&lt;td&gt;Turn restarts&lt;/td&gt;
&lt;td&gt;Teammates keep going&lt;/td&gt;
&lt;td&gt;Resumable in-session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The last two rows are the ones that matter. Because the plan is code, it&amp;#39;s deterministic, diffable, rerunnable, and checkpointable. That also means &lt;a href=&quot;/agent-quality-patterns/&quot;&gt;quality patterns like fan-out-then-verify, adversarial review, and judge panels&lt;/a&gt; get baked into the script, instead of hoping the model remembers them on turn 40.&lt;/p&gt;
&lt;h2 id=&quot;how-to-start-one&quot;&gt;How to start one&lt;/h2&gt;
&lt;p&gt;There are five ways in.&lt;/p&gt;
&lt;p&gt;The keyword, per task. Put &lt;code&gt;ultracode&lt;/code&gt; anywhere in your prompt, or just ask in plain English (&amp;quot;use a workflow&amp;quot;). Claude Code highlights the keyword, and Claude writes a script instead of working turn by turn.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ultracode: audit every API endpoint under src/routes/ for missing auth checks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Changed your mind? &lt;code&gt;Option+W&lt;/code&gt; (macOS) or &lt;code&gt;Alt+W&lt;/code&gt; (Windows/Linux) dismisses the highlight for that prompt, and you can turn the keyword off entirely in &lt;code&gt;/config&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ultracode, per session. &lt;code&gt;/effort ultracode&lt;/code&gt; tells Claude to plan a workflow for every substantive task, so one request can become a chain of workflows: one to understand the code, one to change it, and one to verify. Start a session this way with &lt;code&gt;claude --effort ultracode&lt;/code&gt; (which also sets effort to &lt;code&gt;xhigh&lt;/code&gt;), persist it with the &lt;code&gt;ultracode&lt;/code&gt; setting, and turn it off with &lt;code&gt;/effort ultracode off&lt;/code&gt;. Ultracode is a toggle, not an effort level. It needs a model that supports &lt;code&gt;xhigh&lt;/code&gt;, and it disappears if workflows are disabled (&lt;a href=&quot;https://code.claude.com/docs/en/model-config&quot;&gt;model config docs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The bundled workflow. &lt;code&gt;/deep-research &amp;lt;question&amp;gt;&lt;/code&gt; fans out web searches across several angles, cross-checks the sources, votes on each claim, and returns a cited report with refuted claims removed. Claims the verifiers couldn&amp;#39;t check (rate limits, API errors) are listed as unverified rather than counted as false. It&amp;#39;s the fastest way to watch the machinery run.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve only used it briefly, and it&amp;#39;s pretty great. For some subjects it&amp;#39;s heavier than the question needs, so it depends on what you&amp;#39;re researching.&lt;/p&gt;
&lt;p&gt;Saved workflows. When a run does what you wanted, open &lt;code&gt;/workflows&lt;/code&gt;, select it, and press &lt;code&gt;s&lt;/code&gt;. It becomes a &lt;code&gt;/&amp;lt;name&amp;gt;&lt;/code&gt; command, saved to &lt;code&gt;.claude/workflows/&lt;/code&gt; (shared through the repo) or &lt;code&gt;~/.claude/workflows/&lt;/code&gt; (personal). Saved workflows take input through an &lt;code&gt;args&lt;/code&gt; global, so &lt;code&gt;Run /triage-issues on 1024, 1025, and 1030&lt;/code&gt; passes a real array. No string parsing.&lt;/p&gt;
&lt;p&gt;Plugins. Drop scripts in a plugin&amp;#39;s &lt;code&gt;workflows/&lt;/code&gt; directory and they ship namespaced. A &lt;code&gt;release-audit&lt;/code&gt; workflow in plugin &lt;code&gt;acme-tools&lt;/code&gt; runs as &lt;code&gt;/acme-tools:release-audit&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;upgrade-if-you-run-claude-code-on-untrusted-text&quot;&gt;Upgrade if you run Claude Code on untrusted text&lt;/h3&gt;
&lt;p&gt;As of v2.1.210, the &lt;code&gt;ultracode&lt;/code&gt; keyword only counts when you typed it, whether at the interactive prompt, in an IDE panel, through Remote Control, or in an SDK app that marks input as human. It no longer triggers from &lt;code&gt;-p&lt;/code&gt; prompts, scheduled tasks, webhook payloads, or PR comments relayed into the session. Before that version, a PR comment containing the word could launch a fan-out. If you point Claude Code at text other people write, upgrade.&lt;/p&gt;
&lt;h2 id=&quot;what-the-script-looks-like&quot;&gt;What the script looks like&lt;/h2&gt;
&lt;p&gt;You&amp;#39;ll rarely write these by hand, but you should be able to read one. Here&amp;#39;s a sketch of a fix-until-green loop using the primitives &lt;a href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;the docs&lt;/a&gt; describe:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;export const meta = {
  name: &amp;#39;fix-types&amp;#39;,
  description: &amp;#39;Run tsc and fix errors until clean or stalled&amp;#39;,
}

let stalls = 0
let lastCount = Infinity

while (stalls &amp;lt; 2) {
  phase(&amp;#39;Check&amp;#39;)
  const report = await agent(&amp;#39;Run `npx tsc --noEmit` and list every error by file.&amp;#39;, {
    schema: {
      type: &amp;#39;object&amp;#39;,
      required: [&amp;#39;errors&amp;#39;],
      properties: {
        errors: {
          type: &amp;#39;array&amp;#39;,
          items: {
            type: &amp;#39;object&amp;#39;,
            required: [&amp;#39;file&amp;#39;, &amp;#39;message&amp;#39;],
            properties: { file: { type: &amp;#39;string&amp;#39; }, message: { type: &amp;#39;string&amp;#39; } },
          },
        },
      },
    },
  })

  if (report.errors.length === 0) return &amp;#39;Type check passes.&amp;#39;
  stalls = report.errors.length &amp;gt;= lastCount ? stalls + 1 : 0
  lastCount = report.errors.length

  phase(&amp;#39;Fix&amp;#39;)
  const byFile = Object.groupBy(report.errors, e =&amp;gt; e.file)
  await pipeline(Object.keys(byFile), file =&amp;gt;
    agent(`Fix these type errors in ${file}:\n${byFile[file].map(e =&amp;gt; e.message).join(&amp;#39;\n&amp;#39;)}`, { label: file }),
  )
}

return `Stopped: no progress for two rounds (${lastCount} errors remain).`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The API is small:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent(prompt, opts)&lt;/code&gt; spawns one subagent. Pass a JSON &lt;code&gt;schema&lt;/code&gt; and you get validated JSON back instead of prose. Failing outputs are retried (five attempts by default, tunable with &lt;code&gt;MAX_STRUCTURED_OUTPUT_RETRIES&lt;/code&gt;), and self-contradictory schemas are rejected before the agent starts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipeline(items, fn)&lt;/code&gt; runs one agent per item. &lt;code&gt;parallel(...)&lt;/code&gt; runs a set and waits for all of them.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phase(title)&lt;/code&gt; groups agents in the progress view, and &lt;code&gt;log()&lt;/code&gt; prints above the phases.&lt;/li&gt;
&lt;li&gt;A stopped or failed agent resolves to &lt;code&gt;null&lt;/code&gt;, which is why scripts tend to end with &lt;code&gt;.filter(Boolean)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The constraints are deliberate, and I think they&amp;#39;re the right ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No filesystem or shell in the script. Agents do the work; the script only coordinates.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;import()&lt;/code&gt;. Library work happens inside an agent&amp;#39;s task.&lt;/li&gt;
&lt;li&gt;No nondeterminism. &lt;code&gt;Date.now()&lt;/code&gt;, &lt;code&gt;Math.random()&lt;/code&gt;, and a bare &lt;code&gt;new Date()&lt;/code&gt; throw, so pass timestamps in through &lt;code&gt;args&lt;/code&gt;. This is what lets resume replay the same &lt;code&gt;agent()&lt;/code&gt; calls.&lt;/li&gt;
&lt;li&gt;No mid-run user input. If you need to sign off between stages, make each stage its own workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;runtime-behavior-worth-knowing&quot;&gt;Runtime behavior worth knowing&lt;/h2&gt;
&lt;p&gt;Concurrency and caps. Up to 16 agents run at once by default (fewer on CPU-limited machines), adjustable from 1 to 256 with &lt;code&gt;CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS&lt;/code&gt;. A single &lt;code&gt;parallel()&lt;/code&gt; or &lt;code&gt;pipeline()&lt;/code&gt; call takes at most 4,096 items and errors past that rather than silently truncating. A whole run is capped at 1,000 agents to stop runaway loops.&lt;/p&gt;
&lt;p&gt;Shared prompt cache. Agents with the same model, effort, agent type, tools, schema, and working directory build the same prompt prefix. In a fan-out, the runtime holds back all but the first matching agent until its response starts (up to 5 seconds, set by &lt;code&gt;CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MS&lt;/code&gt;), then releases the rest so they read a warm cache instead of each paying for the prefix. Workflow agents get a 5-minute cache TTL by default. For long runs, set &lt;code&gt;subagentPromptCacheTtl&lt;/code&gt; to &lt;code&gt;1h&lt;/code&gt; and accept the higher write rate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/workflow-cache.svg&quot; alt=&quot;The first agent writes the shared prefix to cache; matching agents are held up to 5 seconds until its response starts, then read the warm cache.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Resume is replay. Relaunching a stopped run replays agents in the order they started. Completed agents return saved results, up to the first agent whose prompt differs from the previous run; after that, everything reruns. A failed agent reruns along with every agent that started after it, even completed ones. So if A, B, C, and D start in order and B fails, a relaunch reuses A and reruns B, C, and D. Design long fan-outs so failures are absorbed (inside &lt;code&gt;pipeline()&lt;/code&gt;, a failure becomes &lt;code&gt;null&lt;/code&gt; and the run continues) rather than awaited directly, which ends the run.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/workflow-resume.svg&quot; alt=&quot;A, B, C, D start in order and B fails. On relaunch only A is reused; B reruns, and so do C and D because they started after B.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Stalls fix themselves. An agent that goes quiet too long restarts from the same prompt, up to five times. Files it already changed stay changed. Lengthen the window per agent with &lt;code&gt;stallMs&lt;/code&gt;, or globally with &lt;code&gt;CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Usage limits pause the run instead of failing it. On an interactive subscription session (v2.1.271+), agents that hit your usage limit wait for the reset and the run carries on. There are limits to that. Resets more than 24 hours out, and a third limit hit, still fail the agent.&lt;/p&gt;
&lt;p&gt;The script is a file, at least according to the docs. Every run writes its script under &lt;code&gt;~/.claude/projects/&lt;/code&gt;, where you can read it, diff it against the last run, edit it, and ask Claude to relaunch from your edit. I went looking for mine and couldn&amp;#39;t find it, so I can&amp;#39;t vouch for that part yet. Saving a run from &lt;code&gt;/workflows&lt;/code&gt; as a reusable command works, and that&amp;#39;s the part I care about.&lt;/p&gt;
&lt;h2 id=&quot;watching-and-steering-a-run&quot;&gt;Watching and steering a run&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/workflows&lt;/code&gt; lists runs and opens a progress view with per-phase agent counts and live token usage. Open any agent to see its prompt, recent tool calls, and result. The keys you&amp;#39;ll use: &lt;code&gt;p&lt;/code&gt; pauses and resumes, &lt;code&gt;x&lt;/code&gt; stops an agent or the whole run, &lt;code&gt;r&lt;/code&gt; restarts a running agent, &lt;code&gt;f&lt;/code&gt; filters by status, and &lt;code&gt;s&lt;/code&gt; saves the script as a command. A one-line summary also sits in the task panel under the input box.&lt;/p&gt;
&lt;h2 id=&quot;permissions&quot;&gt;Permissions&lt;/h2&gt;
&lt;p&gt;How a launch gets approved depends on your permission mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In auto mode, you&amp;#39;re asked on the first launch only, and not at all with ultracode on. Anthropic recommends auto mode for workflows.&lt;/li&gt;
&lt;li&gt;In manual or accept-edits mode, you&amp;#39;re asked every run, with the planned phases shown and an option to view the raw script (&lt;code&gt;Ctrl+G&lt;/code&gt; opens it in your editor). Bundled, saved, and plugin workflows can be set to &amp;quot;don&amp;#39;t ask again&amp;quot; per project.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude -p&lt;/code&gt; and the Agent SDK never prompt, because the &lt;code&gt;Workflow&lt;/code&gt; tool goes through normal permission evaluation. Allow &lt;code&gt;Workflow&lt;/code&gt; (all) or &lt;code&gt;Workflow(&amp;lt;name&amp;gt;)&lt;/code&gt; (one saved workflow), or approve through auto mode, a &lt;code&gt;PreToolUse&lt;/code&gt; hook, or &lt;code&gt;canUseTool&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The agents themselves get no special treatment. They follow the same permission rules and the same sandboxing. To keep a long run from stalling on prompts, add the tools it needs to your allow rules before you start. One subtle point: in auto mode, prompts a script passes to &lt;code&gt;agent()&lt;/code&gt; are marked as script-computed, so the classifier doesn&amp;#39;t treat them as instructions from you.&lt;/p&gt;
&lt;h2 id=&quot;cost-is-the-part-to-take-seriously&quot;&gt;Cost is the part to take seriously&lt;/h2&gt;
&lt;p&gt;Workflows burn a lot more tokens than doing the same task in conversation, and on a subscription that counts against your limits. The guardrails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &amp;quot;Large workflow&amp;quot; warning appears when a run schedules more than 25 agents or projects past 1.5M tokens. It&amp;#39;s advisory and doesn&amp;#39;t stop anything.&lt;/li&gt;
&lt;li&gt;A size guideline (&lt;code&gt;workflowSizeGuideline&lt;/code&gt; or &lt;code&gt;/config&lt;/code&gt;) nudges how many agents Claude plans: &lt;code&gt;small&lt;/code&gt; (under 5), &lt;code&gt;medium&lt;/code&gt; (under 10, the default), &lt;code&gt;large&lt;/code&gt; (under 50), or &lt;code&gt;unrestricted&lt;/code&gt;. Pro defaults to &lt;code&gt;small&lt;/code&gt; on v2.1.271+. It&amp;#39;s advice to Claude, not a hard cap.&lt;/li&gt;
&lt;li&gt;You can pick the model per stage. Agents default to your session model; ask Claude to put mechanical stages on a smaller one, or set &lt;code&gt;CLAUDE_CODE_SUBAGENT_MODEL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pilot on a slice. Run it on one directory first, watch the token column in &lt;code&gt;/workflows&lt;/code&gt;, then scale up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultracode deliberately removes the large-run warning and the concurrent-subagent limit, because turning it on counts as consent to big runs. I&amp;#39;d leave it off for routine work.&lt;/p&gt;
&lt;p&gt;For a sense of scale, my &lt;code&gt;CLAUDE.md&lt;/code&gt; audit took my session usage on the Pro plan from about 11% to 48%. I knew it would cost something, and the amount still surprised me a little. It didn&amp;#39;t come close to my weekly limit, and it was completely worth it.&lt;/p&gt;
&lt;h2 id=&quot;the-big-case-study-is-buns-move-from-zig-to-rust&quot;&gt;The big case study is Bun&amp;#39;s move from Zig to Rust&lt;/h2&gt;
&lt;p&gt;The launch post&amp;#39;s showcase was Jarred Sumner&amp;#39;s port of Bun from Zig to Rust. It produced roughly 750,000 lines of Rust, passed 99.8% of the existing test suite, and took eleven days from first commit to merge. It&amp;#39;s a chain of workflows with one job each. One mapped the correct Rust lifetime for every struct field. The next ported each &lt;code&gt;.zig&lt;/code&gt; file to a behavior-identical &lt;code&gt;.rs&lt;/code&gt; file, using hundreds of agents and two reviewers per file. A fix loop then drove the build and tests until both were clean. An overnight workflow afterward hunted for unnecessary copies and opened a PR per fix.&lt;/p&gt;
&lt;p&gt;Sumner&amp;#39;s own write-up, via &lt;a href=&quot;https://simonwillison.net/b/9540&quot;&gt;Simon Willison&lt;/a&gt;, and &lt;a href=&quot;https://eu.36kr.com/en/p/3888115354515972&quot;&gt;later coverage&lt;/a&gt; fill in the details: around 50 workflows over the 11 days, a &lt;code&gt;PORTING.md&lt;/code&gt; mapping Zig idioms to Rust plus a lifetimes table as the key inputs, and a peak of four concurrent workflows at 16 agents each, which is 64 agents in parallel across separate worktrees. He describes watching the runs, reading outputs, and having Claude adjust the loops as problems surfaced. Claude Code itself has shipped on the Rust build of Bun since v2.1.181.&lt;/p&gt;
&lt;p&gt;It isn&amp;#39;t an uncontested success. &lt;a href=&quot;https://www.theregister.com/a/5270743&quot;&gt;The Register reported&lt;/a&gt; the run cost about $165,000 at API pricing. &lt;a href=&quot;https://infoq.com/news/2026/09/bun-AI-rewrite-zig-rust-4-months&quot;&gt;InfoQ noted&lt;/a&gt; the mechanical translation introduced 19 subtle regressions, where Zig and Rust code looked alike but behaved differently. And Zig creator Andrew Kelley publicly criticized the rewrite, asking how a test suite that missed bugs in Zig would catch them in machine-written Rust. I read the case study as a demonstration of scale, and of how much verification you&amp;#39;ll need, not as proof the output is correct.&lt;/p&gt;
&lt;p&gt;Other early users reported smaller wins. Klarna&amp;#39;s engineering team used workflows to find dead code and cleanup opportunities that static analysis missed, and CyberAgent described them as filling the gap between a single subagent and a full agent team.&lt;/p&gt;
&lt;h2 id=&quot;when-id-reach-for-one&quot;&gt;When I&amp;#39;d reach for one&lt;/h2&gt;
&lt;p&gt;Good fits are work that&amp;#39;s wide, repetitive, or needs independent checking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The same audit across many files (auth checks, input validation, unsafe patterns), with each finding adversarially verified&lt;/li&gt;
&lt;li&gt;Large migrations, with each file transformed in an isolated copy&lt;/li&gt;
&lt;li&gt;Fix-until-green loops on a type checker, linter, or test suite&lt;/li&gt;
&lt;li&gt;Search-until-saturated jobs, like a flaky-test hunt that stops after two rounds find nothing new&lt;/li&gt;
&lt;li&gt;Research where sources need to be checked against each other&lt;/li&gt;
&lt;li&gt;High-stakes plans you want drafted from several angles and compared&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poor fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small tasks that fit comfortably in one context. You pay the fan-out overhead for nothing.&lt;/li&gt;
&lt;li&gt;Anything that needs your judgment mid-run. Split it into separate workflows instead.&lt;/li&gt;
&lt;li&gt;Work where you can&amp;#39;t verify the output. More agents just produce more unverified code, faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you already have orchestration built another way, like a folder of subagent prompts or a skill that fans out, you can point Claude at it and ask for an equivalent workflow.&lt;/p&gt;
&lt;h2 id=&quot;availability-and-off-switches&quot;&gt;Availability and off switches&lt;/h2&gt;
&lt;p&gt;Workflows need Claude Code v2.1.154+ and are available on Pro, Max, Team, and Enterprise, through the Anthropic API, and on Amazon Bedrock, Google Cloud, and Microsoft Foundry. They&amp;#39;re on by default except on Pro, where you turn on the Dynamic workflows row in &lt;code&gt;/config&lt;/code&gt;. They run in the CLI, the Desktop app (progress shows in the Background tasks pane), IDE extensions, &lt;code&gt;claude -p&lt;/code&gt;, and the Agent SDK.&lt;/p&gt;
&lt;p&gt;To turn them off, use the toggle in &lt;code&gt;/config&lt;/code&gt;, set &lt;code&gt;&amp;quot;disableWorkflows&amp;quot;: true&lt;/code&gt;, or export &lt;code&gt;CLAUDE_CODE_DISABLE_WORKFLOWS=1&lt;/code&gt;. Admins can enforce the same through managed settings or the Claude Code admin page. Disabling workflows also removes ultracode and &lt;code&gt;/deep-research&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;my-take&quot;&gt;My take&lt;/h2&gt;
&lt;p&gt;Orchestration moved out of a model&amp;#39;s turn-by-turn judgment and into a program the model writes, which you can read, edit, rerun, save, and resume. That makes agent work at codebase scale look a lot more like normal engineering: a script, a progress view, a cost meter, and a verification step you can inspect.&lt;/p&gt;
&lt;p&gt;If you want to try it, start with &lt;code&gt;/deep-research&lt;/code&gt; to watch it run, then try &lt;code&gt;ultracode:&lt;/code&gt; on one scoped audit, and save the first workflow that earns its tokens.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;Orchestrate subagents at scale with dynamic workflows (Claude Code docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/introducing-dynamic-workflows-in-claude-code&quot;&gt;Introducing dynamic workflows in Claude Code (Claude blog)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/agents&quot;&gt;Run agents in parallel (Claude Code docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/model-config&quot;&gt;Model configuration, effort, and ultracode (Claude Code docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/b/9540&quot;&gt;Rewriting Bun in Rust (Simon Willison)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://infoq.com/news/2026/09/bun-AI-rewrite-zig-rust-4-months&quot;&gt;Bun rewrites 535K lines of Zig into Rust (InfoQ)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.theregister.com/a/5270743&quot;&gt;Zig creator calls Bun&amp;#39;s Claude Rust rewrite &amp;#39;unreviewed slop&amp;#39; (The Register)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://eu.36kr.com/en/p/3888115354515972&quot;&gt;Bun Rust rewrite coverage (36Kr)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description></item>
<item><title>What the research says about fan-out-then-verify, adversarial review, and judge panels</title><link>https://emzimmer.com/agent-quality-patterns/</link><guid>https://emzimmer.com/agent-quality-patterns/</guid><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;In my &lt;a href=&quot;/dynamic-workflows-in-claude-code/&quot;&gt;post on dynamic workflows&lt;/a&gt; I wrote that workflows let you bake quality patterns like fan-out-then-verify, adversarial review, and judge panels into a script. I then went and read the research behind those three patterns, because &amp;quot;more agents checking each other&amp;quot; sounds like it should work and I wanted to know if it does.&lt;/p&gt;
&lt;p&gt;Mostly it does, but not for the reasons the names suggest. The gains come from two places. The first is sampling several independent answers and voting. The second is a checker that knows something the generator doesn&amp;#39;t, such as a test suite, a different model, or a reviewer with a fresh context. Agents arguing with each other and panels of judges that share a base model mostly cost tokens.&lt;/p&gt;
&lt;p&gt;The short version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generating more attempts is cheap and reliably finds more right answers. Picking the right one is the hard part, and an imperfect checker caps how good the result can get.&lt;/li&gt;
&lt;li&gt;Majority voting explains most of what&amp;#39;s been credited to multi-agent debate. At equal compute, plain voting usually wins.&lt;/li&gt;
&lt;li&gt;Asking a model to critique its own answer, with no outside signal, often makes the answer worse.&lt;/li&gt;
&lt;li&gt;Judge panels beat a single judge mainly when the judges come from different model families. Even then, nine judges behaved like about two independent votes in a 2026 study.&lt;/li&gt;
&lt;li&gt;In Claude Code, you can get all of this with a one-line prompt, a saved workflow, a reviewer subagent on a different model, or a &lt;code&gt;Stop&lt;/code&gt; hook that runs your tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All papers below were checked against their full text in October 2026, and I looked for peer reviews or replications where they exist.&lt;/p&gt;
&lt;h2 id=&quot;generating-is-easy-picking-is-hard&quot;&gt;Generating is easy, picking is hard&lt;/h2&gt;
&lt;p&gt;The cleanest evidence comes from inference-time scaling, which means spending more compute when you run a model rather than when you train it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2407.21787&quot;&gt;Large Language Monkeys&lt;/a&gt; (Brown et al., 2024) measured &amp;quot;coverage,&amp;quot; the share of problems where at least one of many attempts is correct. On SWE-bench Lite, DeepSeek-Coder-V2-Instruct solved 15.9% of problems with one attempt and 56% with 250 attempts. The best single-attempt result at the time was 43%. So the right answer was usually somewhere in the pile.&lt;/p&gt;
&lt;p&gt;Getting it out of the pile was the problem. Without an automatic checker like unit tests, the paper found that majority voting and reward models &amp;quot;plateau beyond approximately 100 samples&amp;quot; while coverage keeps climbing. (The abstract says &amp;quot;several hundred&amp;quot;; the body says about 100.) The paper was rejected at ICLR 2025, with &lt;a href=&quot;https://openreview.net/forum?id=0xUEBQV54B&quot;&gt;reviewers arguing&lt;/a&gt; the coverage curves are what you&amp;#39;d expect mathematically. That&amp;#39;s fair, and it doesn&amp;#39;t change the gap between finding and picking.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2411.17501&quot;&gt;Stroebl, Kapoor, and Narayanan&lt;/a&gt; put a hard number on why. If your checker ever accepts a wrong answer, resampling can&amp;#39;t push that error rate down, so there&amp;#39;s a ceiling &amp;quot;regardless of compute budget.&amp;quot; On coding benchmarks with thin unit tests, they found &amp;quot;optimal sampling attempts are often fewer than 10.&amp;quot; It was accepted at ICLR 2026 as a borderline poster; &lt;a href=&quot;https://openreview.net/forum?id=j8H84v6AZ1&quot;&gt;reviewers worried&lt;/a&gt; it generalizes too much from coding.&lt;/p&gt;
&lt;p&gt;Checkers also get fooled in embarrassing ways. &lt;a href=&quot;https://arxiv.org/abs/2507.08794&quot;&gt;One Token to Fool LLM-as-a-Judge&lt;/a&gt; (Zhao et al., 2025) sent judges answers that contained no reasoning at all, just a colon or the words &amp;quot;Thought process:&amp;quot;, and counted how often the judge marked them correct. Averaged across their ten &amp;quot;master key&amp;quot; responses and five benchmarks:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Judge&lt;/th&gt;
&lt;th&gt;Average false-positive rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;GPT-o1&lt;/td&gt;
&lt;td&gt;6.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude-4 Sonnet&lt;/td&gt;
&lt;td&gt;12.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4o&lt;/td&gt;
&lt;td&gt;14.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen2.5-72B&lt;/td&gt;
&lt;td&gt;66.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLaMA3-70B&lt;/td&gt;
&lt;td&gt;80.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;A lone &amp;quot;:&amp;quot; got Claude-4 to accept 53.6% of answers on MATH. The paper was &lt;a href=&quot;https://openreview.net/forum?id=cXMZbIBR1T&quot;&gt;rejected at ICLR 2026&lt;/a&gt;, partly because reviewers saw it as another form of reward hacking and the judges weren&amp;#39;t the newest. I still find it a useful warning. A judge that only reads the answer can be fooled by its shape.&lt;/p&gt;
&lt;h2 id=&quot;fan-out-then-verify&quot;&gt;Fan-out-then-verify&lt;/h2&gt;
&lt;p&gt;This is the pattern with the strongest evidence. Fan out several attempts, check them, and keep what survives.&lt;/p&gt;
&lt;p&gt;The simplest version is voting. &lt;a href=&quot;https://arxiv.org/abs/2203.11171&quot;&gt;Self-consistency&lt;/a&gt; (Wang et al., ICLR 2023) samples 40 reasoning paths and takes the most common answer. On the GSM8K math benchmark it lifted PaLM-540B from 56.5% to 74.4%, a gain of 17.9 points. &lt;a href=&quot;https://arxiv.org/abs/2402.05120&quot;&gt;More Agents Is All You Need&lt;/a&gt; (Li et al., TMLR 2024) found the same effect across model sizes. With 15 samples and a vote, Llama2-13B matched a single Llama2-70B on GSM8K. Voting has limits, though. &lt;a href=&quot;https://arxiv.org/abs/2403.02419&quot;&gt;Chen et al.&lt;/a&gt; showed that past a point, more calls can make voting worse, because extra samples help on easy questions and hurt on hard ones.&lt;/p&gt;
&lt;p&gt;A trained checker does better than a vote. OpenAI&amp;#39;s &lt;a href=&quot;https://arxiv.org/abs/2110.14168&quot;&gt;GSM8K paper&lt;/a&gt; (Cobbe et al., 2021) sampled 100 solutions per problem and let a trained verifier pick one. They said this gave &amp;quot;approximately the same performance boost as a 30x model size increase.&amp;quot; The same paper also found the verifier got worse past about 400 samples, because more samples meant more wrong answers good enough to fool it. &lt;a href=&quot;https://arxiv.org/abs/2305.20050&quot;&gt;Let&amp;#39;s Verify Step by Step&lt;/a&gt; (Lightman et al., ICLR 2024) compared checking each step against checking only the final answer, picking the best of 1,860 attempts on MATH problems:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selection method&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Majority vote&lt;/td&gt;
&lt;td&gt;69.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks final answer only&lt;/td&gt;
&lt;td&gt;72.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks every step&lt;/td&gt;
&lt;td&gt;78.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The authors say the two checkers were trained on different data and &amp;quot;are not directly comparable,&amp;quot; and &lt;a href=&quot;https://openreview.net/forum?id=v8L0pN6EOi&quot;&gt;ICLR reviewers&lt;/a&gt; flagged reproducibility because the model sizes weren&amp;#39;t disclosed. A &lt;a href=&quot;https://arxiv.org/abs/2501.07301&quot;&gt;2025 Qwen paper&lt;/a&gt; also argues that best-of-N tests flatter step checkers, so treat the exact gap loosely.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/quality-verify-pipeline.svg&quot; alt=&quot;Fan-out-then-verify. Several independent attempts each go to a checker. Confirmed results go into the report, refuted ones are dropped, and ones the checker could not check are flagged as unverified rather than counted as refuted.&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is how Anthropic&amp;#39;s own tools are built. The &lt;a href=&quot;https://code.claude.com/docs/en/code-review&quot;&gt;Claude Code Review&lt;/a&gt; docs say &amp;quot;a verification step checks candidates against actual code behavior to filter out false positives.&amp;quot; The public &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/plugins/code-review/commands/code-review.md&quot;&gt;&lt;code&gt;code-review&lt;/code&gt; plugin&lt;/a&gt; shows the shape. Four reviewers run in parallel (two on Sonnet for CLAUDE.md rules, two on Opus for bugs), then a separate subagent validates each issue, and anything not validated is dropped. The built-in &lt;a href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;&lt;code&gt;/deep-research&lt;/code&gt;&lt;/a&gt; workflow &amp;quot;votes on each claim,&amp;quot; and when a verifier can&amp;#39;t check a claim, say after a rate limit, it lists the claim &amp;quot;as unverified instead of counting it as refuted.&amp;quot; I think that last rule matters more than it looks. A checker that fails is not a checker that disagrees.&lt;/p&gt;
&lt;h2 id=&quot;adversarial-review-and-debate&quot;&gt;Adversarial review and debate&lt;/h2&gt;
&lt;p&gt;Adversarial review means a second agent tries to break the first agent&amp;#39;s answer. Debate is the multi-round version, where agents read each other&amp;#39;s answers and revise.&lt;/p&gt;
&lt;p&gt;Debate had a strong start. &lt;a href=&quot;https://arxiv.org/abs/2305.14325&quot;&gt;Du et al.&lt;/a&gt; (ICML 2024) ran three GPT-3.5 agents for two rounds and got 85.0% on GSM8K, against 81.0% for a majority vote and 77.0% for a single agent. But debate used more model calls than the vote it beat, and each benchmark had only about 100 questions.&lt;/p&gt;
&lt;p&gt;When others matched the compute, the advantage went away.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2310.01798&quot;&gt;Huang et al.&lt;/a&gt; (ICLR 2024) re-ran debate on the full GSM8K set. With 9 responses, debate scored 83.0% and self-consistency scored 88.2%.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2311.17371&quot;&gt;Should we be going MAD?&lt;/a&gt; (Smit et al., ICML 2024) found debate didn&amp;#39;t reliably beat self-consistency or ensembling. On MMLU with GPT-3.5, self-consistency scored 0.78 and a debate setup scored 0.73.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2502.08788&quot;&gt;Stop Overvaluing Multi-Agent Debate&lt;/a&gt; (Zhang et al., 2025) tested 5 debate methods on 9 benchmarks with 4 models, and found no method beat plain chain-of-thought in more than 20% of the 36 settings. It&amp;#39;s a position paper, not peer-reviewed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2508.17536&quot;&gt;Debate or Vote&lt;/a&gt; (Choi, Zhu, and Li, a NeurIPS 2025 spotlight) concluded that majority voting &amp;quot;alone accounts for most of the performance gains typically attributed to&amp;quot; debate. They also proved that debate on its own is a martingale, meaning the expected accuracy doesn&amp;#39;t improve from round to round.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/quality-debate-vs-vote.svg&quot; alt=&quot;Average accuracy across seven tasks for Qwen2.5-7B with five agents. Majority vote scores highest at 0.769. Debate scores 0.738 after two rounds and 0.705 after five, below the single-agent baseline of 0.721.&quot;&gt;&lt;/p&gt;
&lt;p&gt;More rounds made it worse in that study. A big part of the reason is conformity. &lt;a href=&quot;https://arxiv.org/abs/2509.05396&quot;&gt;Talk Isn&amp;#39;t Always Cheap&lt;/a&gt; (Wynn, Satija, and Hadfield, an ICML 2025 workshop paper) found agents flip from right to wrong more often than wrong to right, and a correct agent is most likely to cave when it&amp;#39;s the only one holding that answer. Three Mistral agents on MMLU went from 33.6% before debate to 24.4% after.&lt;/p&gt;
&lt;p&gt;Self-critique without an outside signal has the same problem. Huang et al. asked models to review and fix their own answers with no new information. GPT-4 on GSM8K dropped from 95.5% to 89.0%, and GPT-3.5 on CommonSenseQA fell from 75.8% to 41.8%. The model mostly talked itself out of right answers.&lt;/p&gt;
&lt;p&gt;So where does adversarial review work? When the reviewer brings something new. &lt;a href=&quot;https://arxiv.org/abs/2503.13657&quot;&gt;Cemri et al.&amp;#39;s study&lt;/a&gt; of 1,642 multi-agent traces (NeurIPS 2025) found that verification problems, such as checking too little, checking wrongly, or stopping early, caused 23.5% of failures. Two 2026 security preprints show what a good adversarial checker looks like in practice.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2604.19049&quot;&gt;Refute-or-Promote&lt;/a&gt; (Agarwal) used &amp;quot;kill&amp;quot; agents to reject about 79% of 171 vulnerability candidates, leading to 4 CVEs. A critic from a different model family found problems in 3 of 19 fixes that same-family reviewers had approved. Its two failure stories are the most useful part. Ten agents unanimously endorsed a false finding that one empirical test killed, and one real vulnerability was unanimously killed and later became CVE-2026-41254.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2606.19149&quot;&gt;OpenAnt&lt;/a&gt; (Korda and Evron) had agents simulate an attacker against each finding, which cut 376 findings to 190. Of those 190, 144 (75.8%) produced working exploits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are single-team preprints with no ablation, so they show the pattern can work, not how much it adds. I looked for a controlled study comparing a &amp;quot;try to refute this&amp;quot; prompt against a neutral &amp;quot;check this&amp;quot; prompt at equal compute and didn&amp;#39;t find one, in more than ten targeted searches. The closest is &lt;a href=&quot;https://arxiv.org/abs/2608.18167&quot;&gt;Qiu and Gill&lt;/a&gt;, where making disagreement explicit raised F1 from 0.457 to 0.533 on 100 examples. If you know of a better study, I&amp;#39;d like to read it.&lt;/p&gt;
&lt;h2 id=&quot;judge-panels&quot;&gt;Judge panels&lt;/h2&gt;
&lt;p&gt;A judge panel has several models score the same output and combines their votes. It exists because single LLM judges have well-documented biases. The original &lt;a href=&quot;https://arxiv.org/abs/2306.05685&quot;&gt;MT-Bench paper&lt;/a&gt; (Zheng et al., NeurIPS 2023) found GPT-4 agreed with human raters 85% of the time, slightly more than humans agreed with each other (81%). But it also found:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Position bias. When the same answer pair was shown in swapped order, GPT-4 gave a consistent verdict only 65.0% of the time, and Claude-v1 23.8%.&lt;/li&gt;
&lt;li&gt;Verbosity bias. Padding an answer with a repetitive list fooled GPT-3.5 and Claude-v1 91.3% of the time (GPT-4, 8.7%), though only 23 answers were tested.&lt;/li&gt;
&lt;li&gt;A possible preference for its own answers, which the authors said they couldn&amp;#39;t confirm with their data. &lt;a href=&quot;https://arxiv.org/abs/2404.13076&quot;&gt;Panickssery, Bowman, and Feng&lt;/a&gt; (NeurIPS 2024) later showed GPT-4 could pick out its own summaries 73.5% of the time, and that self-preference rose with self-recognition. A &lt;a href=&quot;https://arxiv.org/abs/2504.03846&quot;&gt;2025 follow-up&lt;/a&gt; found much of that preference is earned, because the stronger model&amp;#39;s output really is better.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2504.14716&quot;&gt;Pairwise or Pointwise?&lt;/a&gt; (Tripathi et al., COLM 2025) adds a practical note. When distracting features were added to answers, pairwise &amp;quot;which is better&amp;quot; verdicts flipped in about 35% of cases, against about 9% for scoring each answer on its own.&lt;/p&gt;
&lt;p&gt;The case for panels comes mostly from &lt;a href=&quot;https://arxiv.org/abs/2404.18796&quot;&gt;Replacing Judges with Juries&lt;/a&gt; (Verga et al., Cohere, 2024). A panel of three smaller models from three families (Command R, Claude 3 Haiku, and GPT-3.5) agreed with human annotators more than GPT-4 alone on all three QA datasets tested and was &amp;quot;seven to eight times less expensive.&amp;quot; It has two caveats. Claude 3 Haiku alone beat the panel on one dataset. And when the authors gave GPT-4 a prompt that told it not to overthink, GPT-4 scored 0.725 on Natural Questions against the panel&amp;#39;s 0.699. I couldn&amp;#39;t find an independent replication or released code.&lt;/p&gt;
&lt;p&gt;The case against is correlated errors. &lt;a href=&quot;https://arxiv.org/abs/2506.07962&quot;&gt;Kim et al.&lt;/a&gt; (ICML 2025) compared hundreds of models and found that when two models both get a HELM question wrong, they pick the same wrong answer 60% of the time, against 33% by chance. Models from the same provider agree more, and more capable models agree more. &lt;a href=&quot;https://arxiv.org/abs/2502.04313&quot;&gt;Goel et al.&lt;/a&gt; (ICML 2025) found judges score models higher the more similar those models are to themselves, with an average correlation of 0.84.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2605.29800&quot;&gt;Nine Judges, Two Effective Votes&lt;/a&gt; (Kohli, 2026) measured this directly. Nine frontier judges from seven families behaved like 2.0 to 2.5 independent votes. The panel scored 8 to 22 points below what truly independent votes would have reached, and the best single judge matched or beat the panel on every dataset.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/quality-judge-panel.svg&quot; alt=&quot;Accuracy of the best single judge versus a nine-judge panel on three ChaosNLI datasets. The best single judge scores 71.8, 84.2, and 91.2; the panel scores 72.0, 77.7, and 88.7. Only on MNLI does the panel edge ahead, by 0.2 points.&quot;&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#39;s a single-author preprint on classification tasks that were picked for being ambiguous, and you&amp;#39;d need the answer key to know which judge is &amp;quot;best&amp;quot; in advance. But a &lt;a href=&quot;https://arxiv.org/abs/2609.21277&quot;&gt;follow-up with 32 judges&lt;/a&gt; reproduced the roughly two-vote result under the same measure, while showing other measures give between 2 and 6.5.&lt;/p&gt;
&lt;p&gt;I read the two sides as consistent. A panel helps when you can&amp;#39;t pick a strong single judge, when its members come from different families, and when the task has a reference answer. It helps much less when every judge shares the same blind spot. One note on a source people cite against panels. Anthropic&amp;#39;s &lt;a href=&quot;https://www.anthropic.com/engineering/multi-agent-research-system&quot;&gt;multi-agent research post&lt;/a&gt; says &amp;quot;a single LLM call with a single prompt&amp;quot; was more consistent than &amp;quot;multiple judges,&amp;quot; but its multiple judges were one per scoring criterion, not a panel of different models.&lt;/p&gt;
&lt;h2 id=&quot;how-to-build-these-in-claude-code&quot;&gt;How to build these in Claude Code&lt;/h2&gt;
&lt;p&gt;There are four levels, from least to most setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask in the prompt.&lt;/strong&gt; Any prompt with the word &lt;code&gt;ultracode&lt;/code&gt;, or one that says &amp;quot;use a workflow,&amp;quot; makes Claude write a &lt;a href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;workflow&lt;/a&gt; script for the task. The docs&amp;#39; own example of fan-out-then-verify is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;use a workflow to audit every route handler under src/routes/ for missing authentication checks, and adversarially verify each finding before reporting it
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For loop-until-dry, the docs suggest &amp;quot;stop once two rounds in a row find nothing new.&amp;quot; Since v2.1.210 the keyword only works in prompts you type, not in &lt;code&gt;-p&lt;/code&gt; runs or relayed PR comments. &lt;code&gt;/effort ultracode&lt;/code&gt; turns on workflow planning for every task in the session, and &lt;code&gt;/deep-research &amp;lt;question&amp;gt;&lt;/code&gt; runs the built-in research workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Save the script.&lt;/strong&gt; When a run does what you want, open &lt;code&gt;/workflows&lt;/code&gt;, select it, and press &lt;code&gt;s&lt;/code&gt;. It saves to &lt;code&gt;.claude/workflows/&lt;/code&gt; (shared with the repo) or &lt;code&gt;~/.claude/workflows/&lt;/code&gt; (just you) and runs as &lt;code&gt;/&amp;lt;name&amp;gt;&lt;/code&gt; afterward. Arguments reach the script as a global named &lt;code&gt;args&lt;/code&gt;. The adversarial check from the &lt;code&gt;/workflow-authoring&lt;/code&gt; reference looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const votes = await parallel(Array.from({length: 3}, () =&amp;gt; () =&amp;gt;
  agent(`Try to refute: ${claim}. Default to refuted=true if uncertain.`, {schema: VERDICT})))
const survives = votes.filter(Boolean).filter(v =&amp;gt; !v.refuted).length &amp;gt;= 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Given the research above, I&amp;#39;d change two things. Give each skeptic a different job instead of three copies of the same prompt, and give at least one of them a way to run something. Here&amp;#39;s my sketch of a judge panel that does both, with each judge on a different model and scoring answers one at a time instead of in pairs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const JUDGES = [
  {model: &amp;#39;opus&amp;#39;,   lens: &amp;#39;correctness: run the tests and check edge cases&amp;#39;},
  {model: &amp;#39;sonnet&amp;#39;, lens: &amp;#39;does it meet every requirement in the task?&amp;#39;},
  {model: &amp;#39;haiku&amp;#39;,  lens: &amp;#39;what would a maintainer object to?&amp;#39;},
]
const SCORE = {type: &amp;#39;object&amp;#39;, properties: {score: {type: &amp;#39;number&amp;#39;}, reason: {type: &amp;#39;string&amp;#39;}},
               required: [&amp;#39;score&amp;#39;, &amp;#39;reason&amp;#39;]}

const scored = await parallel(candidates.map((c, i) =&amp;gt; () =&amp;gt;
  parallel(JUDGES.map(j =&amp;gt; () =&amp;gt;
    agent(`Score this candidate from 0 to 10 on ${j.lens}. Do not compare it to others.\n\n${c}`,
          {model: j.model, schema: SCORE})))
    .then(vs =&amp;gt; ({i, total: vs.filter(Boolean).reduce((s, v) =&amp;gt; s + v.score, 0)}))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The per-agent &lt;code&gt;model&lt;/code&gt; option counts as the per-invocation model in the &lt;a href=&quot;https://code.claude.com/docs/en/sub-agents#choose-a-model&quot;&gt;subagent model order&lt;/a&gt;. All three are still Claude models, though. Claude Code &lt;a href=&quot;https://code.claude.com/docs/en/llm-gateway&quot;&gt;doesn&amp;#39;t route to non-Claude models&lt;/a&gt;, so a judge from another family has to come in through an MCP tool or an HTTP hook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use a reviewer subagent on a different model.&lt;/strong&gt; A file in &lt;code&gt;.claude/agents/&lt;/code&gt; with a &lt;code&gt;model&lt;/code&gt; field gives you a reviewer that doesn&amp;#39;t share the main session&amp;#39;s context or, if you choose, its model:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
name: skeptic
description: Tries to refute a claimed fix or finding. Use before reporting a bug or closing a task.
tools: Read, Grep, Glob, Bash
model: opus
---

Assume the claim is wrong. Reproduce it by running code or tests where you can.
Reply REFUTED, CONFIRMED, or UNVERIFIED with the evidence. If you couldn&amp;#39;t check it, say UNVERIFIED.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Make your tests the judge.&lt;/strong&gt; A &lt;a href=&quot;https://code.claude.com/docs/en/hooks-guide&quot;&gt;&lt;code&gt;Stop&lt;/code&gt; hook&lt;/a&gt; can block Claude from finishing until a check passes. This agent hook, straight from the docs, runs the test suite first (agent hooks are marked experimental):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;hooks&amp;quot;: {
    &amp;quot;Stop&amp;quot;: [
      {
        &amp;quot;hooks&amp;quot;: [
          {
            &amp;quot;type&amp;quot;: &amp;quot;agent&amp;quot;,
            &amp;quot;prompt&amp;quot;: &amp;quot;Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS&amp;quot;,
            &amp;quot;timeout&amp;quot;: 120
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For code review specifically, &lt;code&gt;/code-review&lt;/code&gt; takes an effort level from &lt;code&gt;low&lt;/code&gt; (fewer, more confident findings) to &lt;code&gt;max&lt;/code&gt;, and the &lt;a href=&quot;https://code.claude.com/docs/en/ultrareview&quot;&gt;ultra mode&lt;/a&gt; says &amp;quot;every reported finding is independently reproduced and verified.&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;what-it-costs&quot;&gt;What it costs&lt;/h3&gt;
&lt;p&gt;Verification is where the tokens go. Anthropic&amp;#39;s &lt;a href=&quot;https://www.anthropic.com/engineering/multi-agent-research-system&quot;&gt;research-system post&lt;/a&gt; says multi-agent systems use about 15 times the tokens of a chat. The best real-world number I found is in a public workflow script, &lt;a href=&quot;https://github.com/rosenfieldben/nyc-transit-live/blob/main/.claude/workflows/adversarial-review.js&quot;&gt;&lt;code&gt;adversarial-review.js&lt;/code&gt;&lt;/a&gt; in rosenfieldben/nyc-transit-live. Its header records a review that ran 6 finders with 3 verifiers per finding. It used 123 agents and about 8.3M tokens, and 117 of those agents were verifiers. Re-run with 29 agents and about 1.6M tokens, it still caught both critical bugs. The same script marks a finding UNVERIFIED rather than refuted when a verifier read the wrong commit, after that caused real bugs to be thrown out.&lt;/p&gt;
&lt;p&gt;Claude Code shows a &lt;code&gt;Large workflow&lt;/code&gt; warning when a run schedules more than 25 agents or is projected past 1.5 million tokens, and the default size guideline asks Claude to stay under 10 agents (under 5 on Pro). I&amp;#39;d start with one verifier per finding and only add more when the first round lets bad findings through.&lt;/p&gt;
&lt;h2 id=&quot;open-source-options&quot;&gt;Open-source options&lt;/h2&gt;
&lt;p&gt;If you don&amp;#39;t use Claude Code, or want to see how others built these, here&amp;#39;s what I found on GitHub. Stars and licenses were checked on October 11, 2026.&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stanfordnlp/dspy&quot;&gt;stanfordnlp/dspy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Best-of-N&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BestOfN&lt;/code&gt; reruns a module and keeps the highest-reward attempt; &lt;code&gt;Refine&lt;/code&gt; and &lt;code&gt;MultiChainComparison&lt;/code&gt; sit alongside it&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/EleutherAI/lm-evaluation-harness&quot;&gt;EleutherAI/lm-evaluation-harness&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Voting&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MajorityVoteFilter&lt;/code&gt; gives majority-vote accuracy over repeated samples&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/UKGovernmentBEIS/inspect_ai&quot;&gt;UKGovernmentBEIS/inspect_ai&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Judge panel&lt;/td&gt;
&lt;td&gt;The model-graded scorer accepts a list of grader models with a majority reducer&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/haizelabs/verdict&quot;&gt;haizelabs/verdict&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Judge panel with verification&lt;/td&gt;
&lt;td&gt;Chains judge, verify, and max-vote units; the quickstart builds 3 verified judges plus a vote&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/promptfoo/promptfoo&quot;&gt;promptfoo/promptfoo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Graders and red-teaming&lt;/td&gt;
&lt;td&gt;&lt;code&gt;llm-rubric&lt;/code&gt; takes a grader per assertion; &lt;code&gt;select-best&lt;/code&gt; picks among outputs; a separate red-team suite&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/confident-ai/deepeval&quot;&gt;confident-ai/deepeval&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Blind pairwise judging&lt;/td&gt;
&lt;td&gt;Arena G-Eval hides which model produced each answer&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/prometheus-eval/prometheus-eval&quot;&gt;prometheus-eval/prometheus-eval&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Open judge model&lt;/td&gt;
&lt;td&gt;Absolute (1 to 5) and pairwise grading with an open-weight judge&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/karpathy/llm-council&quot;&gt;karpathy/llm-council&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Judge panel&lt;/td&gt;
&lt;td&gt;Several models answer, rank each other&amp;#39;s anonymized answers, and a chairman writes the final one. The README calls it &amp;quot;99% vibe coded&amp;quot;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/composable-models/llm_multiagent_debate&quot;&gt;composable-models/llm_multiagent_debate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Debate&lt;/td&gt;
&lt;td&gt;The code from Du et al.&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Skytliang/Multi-Agents-Debate&quot;&gt;Skytliang/Multi-Agents-Debate&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adversarial debate&lt;/td&gt;
&lt;td&gt;One agent argues against another and a judge decides&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hamelsmu/claude-review-loop&quot;&gt;hamelsmu/claude-review-loop&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cross-model review&lt;/td&gt;
&lt;td&gt;A Claude Code stop hook sends the work to up to 4 parallel Codex reviewers before Claude can finish&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hurttlocker/o8&quot;&gt;hurttlocker/o8&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adversarial verify&lt;/td&gt;
&lt;td&gt;A 17-line saved workflow with three skeptics, each with a different lens (correctness, reachability, regression); a claim survives if 2 of 3 can&amp;#39;t refute it&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Anthropic&amp;#39;s &lt;a href=&quot;https://github.com/anthropics/claude-code/tree/main/plugins/code-review&quot;&gt;&lt;code&gt;code-review&lt;/code&gt; plugin&lt;/a&gt; is worth reading as a reference, but it isn&amp;#39;t open source; the repo&amp;#39;s license is &amp;quot;All rights reserved.&amp;quot; Its README also still describes an older 0 to 100 confidence filter that the current command file replaced with validation subagents. Licenses matter here because three of the most-starred projects in this list have none, which means you can read the code but not legally reuse it.&lt;/p&gt;
&lt;h2 id=&quot;what-id-do&quot;&gt;What I&amp;#39;d do&lt;/h2&gt;
&lt;p&gt;My own results with these patterns have been mixed. Verification has caught real problems for me, and it has also burned tokens confirming things that were already right. The research above explains both.&lt;/p&gt;
&lt;p&gt;My rules, after reading all of this, are short. Sample and vote before you reach for debate. Make the checker as independent as you can, preferably by running something, otherwise by using a different model or at least a fresh context. Treat &amp;quot;couldn&amp;#39;t check&amp;quot; as its own result, not as a rejection. And spend verification tokens on the findings you&amp;#39;re about to act on, not on every candidate.&lt;/p&gt;
&lt;p&gt;If you only set up one thing, save a review workflow that adversarially verifies its findings, and run it on every branch. Save it once, and the checking happens every time without you having to ask for it.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;p&gt;Papers (checked against full text, October 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wang et al., &lt;a href=&quot;https://arxiv.org/abs/2203.11171&quot;&gt;Self-Consistency Improves Chain of Thought Reasoning in Language Models&lt;/a&gt;, ICLR 2023&lt;/li&gt;
&lt;li&gt;Cobbe et al., &lt;a href=&quot;https://arxiv.org/abs/2110.14168&quot;&gt;Training Verifiers to Solve Math Word Problems&lt;/a&gt;, 2021&lt;/li&gt;
&lt;li&gt;Lightman et al., &lt;a href=&quot;https://arxiv.org/abs/2305.20050&quot;&gt;Let&amp;#39;s Verify Step by Step&lt;/a&gt;, ICLR 2024 (&lt;a href=&quot;https://openreview.net/forum?id=v8L0pN6EOi&quot;&gt;reviews&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Brown et al., &lt;a href=&quot;https://arxiv.org/abs/2407.21787&quot;&gt;Large Language Monkeys&lt;/a&gt;, 2024 (&lt;a href=&quot;https://openreview.net/forum?id=0xUEBQV54B&quot;&gt;reviews&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Li et al., &lt;a href=&quot;https://arxiv.org/abs/2402.05120&quot;&gt;More Agents Is All You Need&lt;/a&gt;, TMLR 2024&lt;/li&gt;
&lt;li&gt;Chen et al., &lt;a href=&quot;https://arxiv.org/abs/2403.02419&quot;&gt;Are More LLM Calls All You Need?&lt;/a&gt;, NeurIPS 2024&lt;/li&gt;
&lt;li&gt;Stroebl, Kapoor, and Narayanan, &lt;a href=&quot;https://arxiv.org/abs/2411.17501&quot;&gt;The Limits of Inference Scaling Through Resampling&lt;/a&gt;, ICLR 2026 (&lt;a href=&quot;https://openreview.net/forum?id=j8H84v6AZ1&quot;&gt;reviews&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Zhao et al., &lt;a href=&quot;https://arxiv.org/abs/2507.08794&quot;&gt;One Token to Fool LLM-as-a-Judge&lt;/a&gt;, 2025 (&lt;a href=&quot;https://openreview.net/forum?id=cXMZbIBR1T&quot;&gt;reviews&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Du et al., &lt;a href=&quot;https://arxiv.org/abs/2305.14325&quot;&gt;Improving Factuality and Reasoning in Language Models through Multiagent Debate&lt;/a&gt;, ICML 2024&lt;/li&gt;
&lt;li&gt;Huang et al., &lt;a href=&quot;https://arxiv.org/abs/2310.01798&quot;&gt;Large Language Models Cannot Self-Correct Reasoning Yet&lt;/a&gt;, ICLR 2024&lt;/li&gt;
&lt;li&gt;Smit et al., &lt;a href=&quot;https://arxiv.org/abs/2311.17371&quot;&gt;Should we be going MAD?&lt;/a&gt;, ICML 2024&lt;/li&gt;
&lt;li&gt;Zhang et al., &lt;a href=&quot;https://arxiv.org/abs/2502.08788&quot;&gt;Stop Overvaluing Multi-Agent Debate&lt;/a&gt;, 2025&lt;/li&gt;
&lt;li&gt;Choi, Zhu, and Li, &lt;a href=&quot;https://arxiv.org/abs/2508.17536&quot;&gt;Debate or Vote&lt;/a&gt;, NeurIPS 2025&lt;/li&gt;
&lt;li&gt;Wynn, Satija, and Hadfield, &lt;a href=&quot;https://arxiv.org/abs/2509.05396&quot;&gt;Talk Isn&amp;#39;t Always Cheap&lt;/a&gt;, ICML 2025 workshop&lt;/li&gt;
&lt;li&gt;Cemri et al., &lt;a href=&quot;https://arxiv.org/abs/2503.13657&quot;&gt;Why Do Multi-Agent LLM Systems Fail?&lt;/a&gt;, NeurIPS 2025&lt;/li&gt;
&lt;li&gt;Agarwal, &lt;a href=&quot;https://arxiv.org/abs/2604.19049&quot;&gt;Refute-or-Promote&lt;/a&gt;, 2026 preprint&lt;/li&gt;
&lt;li&gt;Korda and Evron, &lt;a href=&quot;https://arxiv.org/abs/2606.19149&quot;&gt;OpenAnt&lt;/a&gt;, 2026 preprint&lt;/li&gt;
&lt;li&gt;Qiu and Gill, &lt;a href=&quot;https://arxiv.org/abs/2608.18167&quot;&gt;Adversarial Review&lt;/a&gt;, 2026&lt;/li&gt;
&lt;li&gt;Zheng et al., &lt;a href=&quot;https://arxiv.org/abs/2306.05685&quot;&gt;Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena&lt;/a&gt;, NeurIPS 2023&lt;/li&gt;
&lt;li&gt;Panickssery, Bowman, and Feng, &lt;a href=&quot;https://arxiv.org/abs/2404.13076&quot;&gt;LLM Evaluators Recognize and Favor Their Own Generations&lt;/a&gt;, NeurIPS 2024&lt;/li&gt;
&lt;li&gt;Qwen team, &lt;a href=&quot;https://arxiv.org/abs/2501.07301&quot;&gt;The Lessons of Developing Process Reward Models in Mathematical Reasoning&lt;/a&gt;, 2025&lt;/li&gt;
&lt;li&gt;Chen et al., &lt;a href=&quot;https://arxiv.org/abs/2504.03846&quot;&gt;Do LLM Evaluators Prefer Themselves for a Reason?&lt;/a&gt;, 2025&lt;/li&gt;
&lt;li&gt;Tripathi et al., &lt;a href=&quot;https://arxiv.org/abs/2504.14716&quot;&gt;Pairwise or Pointwise?&lt;/a&gt;, COLM 2025&lt;/li&gt;
&lt;li&gt;Verga et al., &lt;a href=&quot;https://arxiv.org/abs/2404.18796&quot;&gt;Replacing Judges with Juries&lt;/a&gt;, 2024&lt;/li&gt;
&lt;li&gt;Kim et al., &lt;a href=&quot;https://arxiv.org/abs/2506.07962&quot;&gt;Correlated Errors in Large Language Models&lt;/a&gt;, ICML 2025&lt;/li&gt;
&lt;li&gt;Goel et al., &lt;a href=&quot;https://arxiv.org/abs/2502.04313&quot;&gt;Great Models Think Alike and this Undermines AI Oversight&lt;/a&gt;, ICML 2025&lt;/li&gt;
&lt;li&gt;Kohli, &lt;a href=&quot;https://arxiv.org/abs/2605.29800&quot;&gt;Nine Judges, Two Effective Votes&lt;/a&gt;, 2026 preprint&lt;/li&gt;
&lt;li&gt;Li, Yu, and Li, &lt;a href=&quot;https://arxiv.org/abs/2609.21277&quot;&gt;How Many Humans Are 32 LLM Judges Worth?&lt;/a&gt;, 2026 preprint&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docs and posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code docs: &lt;a href=&quot;https://code.claude.com/docs/en/workflows&quot;&gt;dynamic workflows&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/sub-agents&quot;&gt;subagents&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/hooks-guide&quot;&gt;hooks guide&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/code-review&quot;&gt;code review&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/ultrareview&quot;&gt;ultrareview&lt;/a&gt;, &lt;a href=&quot;https://code.claude.com/docs/en/llm-gateway&quot;&gt;LLM gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Anthropic, &lt;a href=&quot;https://www.anthropic.com/engineering/multi-agent-research-system&quot;&gt;How we built our multi-agent research system&lt;/a&gt;, June 2025&lt;/li&gt;
&lt;li&gt;Anthropic, &lt;a href=&quot;https://github.com/anthropics/claude-code/blob/main/plugins/code-review/commands/code-review.md&quot;&gt;&lt;code&gt;code-review&lt;/code&gt; plugin command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;rosenfieldben, &lt;a href=&quot;https://github.com/rosenfieldben/nyc-transit-live/blob/main/.claude/workflows/adversarial-review.js&quot;&gt;&lt;code&gt;adversarial-review.js&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description></item>
</channel></rss>
