<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Essay on Jaime Gago</title><link>https://jaimegago.dev/tags/essay/</link><description>Condensing systems from the vapor of data.</description><generator>Hugo</generator><language>en-us</language><managingEditor>(Jaime Gago)</managingEditor><copyright>&#169; 2026 Jaime Gago</copyright><lastBuildDate>Fri, 05 Jun 2026 08:37:59 +0000</lastBuildDate><atom:link href="https://jaimegago.dev/tags/essay/" rel="self" type="application/rss+xml"/><item><title>VS Code Shipped My Setup, Then I Read the Fine Print</title><link>https://jaimegago.dev/writing/vs-code-shipped-my-setup/</link><pubDate>Fri, 05 Jun 2026 00:30:00 +0200</pubDate><guid isPermaLink="true">https://jaimegago.dev/writing/vs-code-shipped-my-setup/</guid><description>VS Code's new Agents window looks like a productized version of my Claude-Code-as-orchestrator setup — until the fine print: it runs entirely on GitHub Copilot, models and billing included, with your Anthropic subscription invisible to the flow. Why I'm staying on the Claude Code extension, moving orchestration to Anthropic's desktop app, and what 'orchestration' actually decomposes into.</description><category>Essay</category><content:encoded><![CDATA[<p>I stopped using VS Code as an IDE months ago. I don&rsquo;t open files, I don&rsquo;t use the debugger, I barely touch the editor. My VS Code is a Claude Code UI: the extension panel is the whole experience, and I&rsquo;ve stripped the chrome around it accordingly. I write nothing by hand anymore; I draft specs in claude.ai, paste them into Claude Code, and review diffs.</p>
<p>I didn&rsquo;t arrive here by brand loyalty. Months back I ran a paid three-way bake-off in VS Code — GitHub Copilot, Gemini, and Claude Code, real subscriptions, real work on all three. Claude Code won decisively enough that I cancelled the other two. The interesting detail in hindsight: Copilot with Claude models selected still didn&rsquo;t feel as good as the Claude Code extension running the same models. The harness matters as much as the model — how the agent plans, reads the codebase, handles permissions, presents diffs. Same engine, different car.</p>
<p>So when Microsoft shipped the Agents window — a dedicated VS Code window where chat and a sessions list are the primary interface and the editor is demoted to a side concern — I paid attention. It looked like someone had productized my setup. Sessions across all your workspaces in one sidebar, a chat area in the center, a changes panel for diff review, an integrated terminal and browser for validation. No file tree dominating the screen. For someone running parallel Claude Code sessions across half a dozen repos, this is the obvious shape of the tool.</p>
<p>I opened it, and my existing Claude Code sessions were right there in the sidebar. Promising start.</p>
<h2 id="it-runs-on-copilot-all-the-way-down">It runs on Copilot, all the way down</h2>
<p>No detective work needed: the docs list GitHub Copilot as a prerequisite. What wasn&rsquo;t obvious until I poked at it is how deep that goes. My existing sessions appearing in the sidebar suggested the window might just be a viewer over Claude Code&rsquo;s on-disk state, Anthropic billing intact. Then I tried to start a new session: the model picker offered Haiku 4.5 and nothing else, while the Claude Code extension one window over — same machine, same Anthropic Max plan — gives me Sonnet and Opus. The &ldquo;Claude agent&rdquo; you launch from the Agents window is VS Code&rsquo;s own integration on the Claude Agent SDK, billed through your Copilot subscription; no paid Copilot plan, no advanced models. Your Anthropic subscription is invisible to the entire flow. The window reads your sessions for free, but the moment you act, you&rsquo;re a Copilot customer.</p>
<p>I don&rsquo;t think this decouples, either. The strategic logic runs the other way: GitHub positioning itself as the billing and identity layer for all coding agents — Anthropic&rsquo;s, OpenAI&rsquo;s, its own — is the point of the feature, not an implementation detail. Copilot Chat was folded into VS Code core this spring. The direction is more coupling, not less. If that holds, VS Code stops being a neutral host for AI tooling and becomes a Microsoft AI distribution channel that happens to include an editor. And note what&rsquo;s actually on offer even if I did pay: Claude through Copilot&rsquo;s harness, the exact configuration my bake-off already ranked below the Claude Code extension. I&rsquo;m not interested in renting a worse version of a model I already pay for, so I&rsquo;m out.</p>
<h2 id="anthropic-already-built-the-alternative">Anthropic already built the alternative</h2>
<p>Here&rsquo;s what makes leaving easy: Anthropic shipped its own answer in April. The redesigned Claude Code desktop app is the same idea — session sidebar across projects, side chat to ask questions without derailing a running agent, integrated terminal, diff viewer, file editor for spot edits, preview pane — running on your Anthropic plan with your existing settings, skills, and plugins, because it reads the same configuration the CLI and the extension do.</p>
<p>The shape is worth noticing. Google&rsquo;s Antigravity answered &ldquo;what should an agentic coding tool look like&rdquo; by forking VS Code: a full IDE with the agent inside. Anthropic answered with an orchestrator that has just enough editor bolted on for the review loop. If you still write code by hand, the IDE-with-agent shape makes sense. If you&rsquo;ve crossed over to writing specs and reviewing diffs — and I have, completely — the orchestrator shape is correct and the editor is dead weight. My stripped-down VS Code was me manually carving the orchestrator shape out of an IDE. The desktop app just starts there.</p>
<p>Going into this, I thought the desktop app forced a git worktree on every session — isolated checkout, no off switch — and counted it as a real mark against the tool. That belief came from one place: while working through the switch from VS Code with Claude, it cited a pile of GitHub issues asking for an opt-out, and I took it on faith without opening a single one. Then I opened the current version: worktree is a per-session checkbox now, opt-in, off by default. I guess the field just moves fast. The model handed me info that was a few weeks old and already stale, and I&rsquo;d nearly let it shape a real decision — without checking the one thing that would&rsquo;ve settled it, the running app itself, a click away the whole time.</p>
<h2 id="what-orchestration-actually-is">What orchestration actually is</h2>
<p>The reason I keep coming back to the word &ldquo;orchestrator&rdquo; is that this whole evaluation forced me to look at what I actually do all day, and it turns out to be two different jobs wearing one trenchcoat.</p>
<p>Job one is judgment: deciding that the authentication work ships before the runtime refactor, that the frontend waits until the backend contract is locked, that this repo matters this week and that one doesn&rsquo;t. This work happens in claude.ai conversations that carry months of project memory, and no tool on offer touches it.</p>
<p>Job two is relay: noticing a session finished, deciding what&rsquo;s unblocked, carrying output from one session into another&rsquo;s context, checking back later. This is a message bus with my attention as the transport. It requires no judgment at all, and it&rsquo;s most of my coordination time by volume.</p>
<p>Every multi-agent pitch right now — Claude Code&rsquo;s Agent Teams, the framework crowd, Antigravity&rsquo;s manager view — is selling automation of job two. Agent Teams gives you a lead agent that watches a shared task list, unblocks dependent tasks the moment dependencies complete, and routes messages between teammates. The lead is a foreman, not an architect: it executes a decomposition, it doesn&rsquo;t own the plan. Understood that way, it&rsquo;s genuinely useful, because the relay loop currently runs at the speed of me noticing things, and a foreman runs it in machine time, including while I&rsquo;m at tennis.</p>
<p>But there&rsquo;s a scoping catch the pitches skip. A team parallelizes within one goal in one repo. My relay work is mostly across streams — sequencing unrelated projects, and above all carrying specs across the boundary between claude.ai, where the thinking happens with memory, and Claude Code, where the execution happens with the codebase. No team lead sits at that junction. Nothing does, yet. The cross-stream layer stays human, and honestly that&rsquo;s the layer where my judgment lives anyway. The mistake would be confusing the two: the within-project handoffs are relay work dressed up as engineering, and those I&rsquo;m happy to hand to a foreman.</p>
<h2 id="the-trial">The trial</h2>
<p>So the plan: a week or two running real work in the Claude Code desktop app. Quick single-session tasks with the worktree toggle off, committing straight to main; parallel sessions on my main project with it on, to find out whether isolation finally lets me run frontend and backend streams concurrently instead of serializing them — which is the concrete bottleneck that started all this. Agent Teams is a separate, terminal-bound experiment for later, and only if the parallel sessions leave me doing manual relay between them.</p>
<p>VS Code earned years of my muscle memory by being a neutral, excellent host for whatever tooling I brought. The Agents window is the first VS Code feature that made me check who it actually works for. Results from the desktop app trial in the next post.</p>
<hr>
<p><em>Versions tested, June 4, 2026 — because everything above is a snapshot of fast-moving software: VS Code 1.123.0 (Universal, build 2026-06-03) with the Agents window in preview, Claude Code extension 2.1.162, latest Claude Code desktop app, macOS on Apple Silicon. If you&rsquo;re reading this even a month later, verify against your own running binaries before taking my word for any of it.</em></p>
]]></content:encoded></item><item><title>If LLMs Write Your Code, LLM Code Review Is the Wrong Loop</title><link>https://jaimegago.dev/writing/llm-code-review-wrong-loop/</link><pubDate>Tue, 12 May 2026 10:00:00 +0200</pubDate><guid isPermaLink="true">https://jaimegago.dev/writing/llm-code-review-wrong-loop/</guid><description>If you are using LLMs to write code, using LLMs to review the MRs is wrong. The writing-time model already had the best context for spotting errors; an MR-time bot is a weaker pass with less information. And the part of review that genuinely needed a second mind — team priors, incident history, intent — is exactly what a second LLM session cannot supply. Close the loop upstream at prompt time and downstream at behavior, not on the diff.</description><category>Essay</category><content:encoded><![CDATA[<p><strong>TL;DR</strong> — If you are using LLMs to write code, using LLMs to review the MRs is wrong. The writing-time model already had the best context for spotting errors; an MR-time bot is a weaker pass with less information. And the part of review that genuinely needed a second mind — team priors, incident history, intent — is exactly what a second LLM session cannot supply. Close the loop upstream at prompt time and downstream at behavior, not on the diff.</p>
<p>If you are using an LLM to write code, <strong>plugging another LLM into your MR pipeline to review the diff is doing the wrong thing at the wrong point</strong>. The form of code review survives. The substance evaporates.</p>
<p>Code review did several things at once. It caught bugs and inefficiencies a fresh pair of eyes could spot. It synchronized the author with priors the reviewer held — incident history, what the staff engineer keeps repeating, the refactor someone else has been threading through auth all quarter. And it audited the reasoning behind the diff, not just the diff itself. The artifact under review was a proxy for &ldquo;did you think the right things while writing this,&rdquo; and the reviewer&rsquo;s job was a mix of error-spotting and context-injection.</p>
<p>Replace the author with a prompter driving an LLM, and the picture shifts — provided the prompter does their part. A model writing code only has the full file context, the surrounding tests, and the repo&rsquo;s conventions if someone fed them in: CLAUDE.md, copilot-instructions.md, AGENTS.md, a well-scoped prompt, the right files in context, skills or rules that encode the team&rsquo;s standards. When that work is done, <strong>the writing-time model is the best-informed reviewer the diff will ever see</strong>, and review is happening continuously as the code is written. Bolting a second LLM session onto the MR after that is strictly a downgrade for error-spotting: a less-informed model, looking at a narrower slice, after the fact. The bugs and inefficiencies that pass the writing-time model are unlikely to be caught by a weaker pass at review time.</p>
<p>When the prompter has <em>not</em> done that work, the MR-time LLM is not catching up either. It is reviewing slop with the same lack of context that produced the slop. <strong>The fix is upstream</strong> — better prompts, better repo-level instructions, better scoping — not a second model downstream pretending to clean it up.</p>
<p>The second LLM also does not bring what made human review valuable in the first place. It does not know your incident history. It does not know your team decided last week to stop adding new gRPC services. It produces generic best-practice nagging against a stale snapshot of the codebase. The human reviewer who used to provide those priors is now expected to triage the bot&rsquo;s comments — or worse, to click approve once the bot has signed off, which is <strong>not a human in the loop, it is a human laundering a model&rsquo;s output</strong>.</p>
<p>The &ldquo;human in the loop at MR level&rdquo; justification is where the inefficiency hides. If the human is genuinely in the loop, the LLM review is noise. If the human is not, there is no loop, just two models passing an artifact between them while the ritual of review continues.</p>
<p>The deeper issue is that MR-as-checkpoint was designed for a world where writing code was the slow expensive step and reading it was cheap. That world is gone. <strong>Writing is cheap. Reading at scale is the bottleneck.</strong> The loop has to close where signal is highest, and the diff is not it.</p>
<p>Signal is highest in two places now: at prompt-and-plan time, where intent and constraints are set, and at integration time, where the code meets the running system — tests, evals, canaries, production telemetry. Evaluating behavior against scenarios is loop-closing on what the system does. Commenting on diffs is loop-closing on what the code looks like. Only one of those still earns its keep.</p>
]]></content:encoded></item></channel></rss>