Skip to main content

Comparing harnesses

Every harness runs the same loop. What separates them is where they run, what they will let the model do before asking you, and what you can bolt onto them. A demo will not tell you any of that. It comes out three weeks later, when the tool has to run in a pipeline, or point at a model the vendor did not sell you, or explain what it did to a file nobody expected it to touch.

The tabs at the foot of this page describe four of them: Claude Code, Codex, Gemini CLI, and Cursor. The summary table above the tabs adds Muse Code. What follows is the set of axes to compare any of them on, with what a difference on each axis costs.

Interface surface

Where the harness runs decides what is cheap.

A terminal program is one process with your shell, your credentials, and your repository already around it. Piping into it and out of it is free, so it composes with everything else you run. Reviewing a 400 line diff in a terminal is unpleasant.

An extension inside an editor trades that away. Diffs are reviewable, the file you have open is context the harness gets for nothing, and clicking through a change is fast. Running it from a cron job is not a thing you do.

A background or cloud runner has no terminal at all. It takes a task, works on a copy of the repository somewhere else, and hands back a branch or a pull request. That is the only surface that survives you closing your laptop. It is also the one where you cannot lean over and correct it mid-run.

A web surface removes the install. It also removes your local environment, so anything that needed your credentials or your unpushed branch is not there.

Most vendors now ship several of these against one engine, so the real question is which surface holds the configuration, and whether the others read the same files.

Four harness surfaces against where the code sits Four surfaces laid left to right along one axis. On the left, over a band marked "your working copy", sit a terminal program and an editor extension, drawn with a plain outline. A thick dashed vertical line labelled "past this line the harness works on a copy" divides the drawing. On the right, over a band marked "a clone the harness made", sit a web surface and a background or cloud runner, drawn with a heavier accented outline and each tagged "remote copy". Under each surface are two lines: what it gets for free and what it makes awkward. The terminal gets your shell, credentials and git for free and makes reading a long diff awkward. The editor extension gets the open file and inline diffs and makes running on a schedule awkward. The web surface gets no install and any device and makes your unpushed branch and local credentials unavailable. The cloud runner survives a closed laptop and makes correcting it mid-run awkward. Where the harness runs, and where the code is Terminal program Editor extension Web surface Cloud runner runs in your shell runs inside the editor remote copy, in a browser remote copy, in the background your working copy a clone the harness made past this line the harness works on a copy Free your shell, credentials, git, pipes into other tools the file you have open, inline diffs you can click no install, any device, a repo you never cloned survives a closed laptop, hands back a branch Awkward reading a 400 line diff running it on a schedule an unpushed branch, a local credential correcting it mid-run The awkward row is the one that decides it.
Pick the surface by where the work already is. A harness that runs where your code is not has to copy the code to itself first, and that copy is the part that goes wrong.

Model coupling

is how tightly the harness is bound to one vendor's models. There are three positions. A harness may call only its own vendor's models. It may call its vendor's models through several endpoints, such as a cloud marketplace or a base URL you set. Or it may point at any endpoint speaking a supported wire format.

This is the axis to check before any of the others, because it decides whether an LLM gateway is usable in front of the harness at all. A gateway exists to centralise keys, cap spend per team, and log every request. It works by being the endpoint the client calls. A harness with no way to change its endpoint cannot be put behind one, so the gateway you bought for governance covers everything except the tool your engineers use all day.

Coupling also decides your exit cost. Prompts, skills and permission rules written against one harness do not move to another, but the choice of model underneath is reversible if the harness lets you set the endpoint.

The permission model

The permission model runs from confirm-everything, through a sandbox with an allowlist of pre-approved commands, to fully unattended. Most harnesses offer a named mode at two or three points on that line, plus an allowlist and a denylist you configure.

The middle position matters most and is the hardest to build. Confirming every call is safe and slow enough that people stop using it. Unattended is fast and gives a language model shell access to your machine. The workable answer is an operating system sandbox around tool execution plus a list of commands that skip the prompt inside it, so npm test runs silently and curl to an unknown host does not.

This axis is what decides whether the harness can run in CI. A pipeline has nobody to confirm anything. If the only unattended mode is "skip all checks", then running it in CI means running it in a throwaway container, and if the harness cannot be sandboxed you are trusting the model with whatever credentials that container holds.

Extensibility

Which of skills, plugins, hooks, subagents and MCP the harness supports, and where that configuration lives. Nearly all of them speak MCP now. The rest vary a great deal.

Ask of each mechanism where the configuration lives. In the repository, so a new joiner gets it from a clone, or in a user directory, so everybody sets it up themselves? And can an administrator pin a setting so a project file cannot override it? Where it lives in a user directory, what the team really has is an onboarding document that each new joiner has to follow.

The instructions file

Several harnesses read a markdown file from the repository root at the start of every session and prepend it to the context. The industry has mostly settled on the name AGENTS.md for this, and a few harnesses read their own filename as well or instead. The generic term is an .

The file is the closest thing to a portable asset in this whole subject. Build commands, the test runner, directory conventions, things the last three people got wrong. Written in ordinary markdown, in the repository, under review like any other file. Switch harness and it carries over unchanged.

Context management

Whether the harness compacts automatically when the window fills, whether you can inspect what is in the window right now, and what it does at the limit.

Automatic compaction keeps a long run alive at the cost of detail you cannot get back. Where you can see the breakdown of the window, you can find out that an MCP server's tool definitions are eating 20,000 tokens of every request. A harness that stops dead at the limit instead is annoying, and honest about it.

Headless operation

is running the harness with no interactive session: one prompt in, a result out, exit code set, nothing to confirm. Usually a flag such as a print or exec mode, sometimes an SDK.

Without it the harness cannot go in a pipeline, which rules out the whole class of work that makes these things pay for themselves. Automated code review on every pull request, a nightly pass over failing tests, translating new strings when they land. Check what the output format is as well as whether the mode exists. A mode that emits structured output can be piped into something that decides what to do next; one that emits prose for a human cannot.

Checkpointing and undo

An agentic run edits files, which is the point of it and also the problem. is the harness snapshotting the working tree before each step so you can roll back to a point in the conversation.

Read the limits carefully, because they are usually narrower than the feature name suggests. A harness that snapshots edits made through its own file-editing tools has not captured the file a shell command deleted, or the edits a subagent made in a separate context. Version control has none of those gaps. Commit before you start a long run.

The transcript

Every message, every tool call, every result, written somewhere you can read it afterwards. Ask whether it is on disk or only in the scrollback, whether it survives a resume, and whether you can search it.

A run that went wrong is unreviewable without one. So is a run that went right and now has to be explained to somebody else. Some harnesses also expose the transcript as a structured event log, which is the version an automated policy check can read.

Choosing a harness

Match the surface to where the work already lives.

  1. Check model coupling first. Confirm the harness can call the endpoint you intend to use.
  2. Reject a harness that no gateway can sit in front of, if you need central spend control.
  3. Check that the unattended mode is safe enough for a pipeline before you plan any pipeline work.
  4. Put the instructions file in the repository. Keep it under review.
  5. Never grant unattended permissions in a workspace you cannot roll back.
  6. Commit your work before you start a long unattended run.

How to choose in one pass

Start from the shape of the work. It picks the surface, and the surface rules out more candidates than any feature list.

Terms introduced

  • Model coupling: how tightly a harness is bound to one vendor's models, and whether you can point it at another endpoint.
  • Agent instructions file: a markdown file in the repository that a harness reads into context at the start of every session.
  • Headless mode: running a harness non-interactively, one prompt in and a result out, with nothing to confirm.
  • Checkpointing: snapshotting the working tree as a run proceeds so a later step can be rolled back.

How providers do it

Five harnesses against the axes the page teaches. Four of them have a tab below; Muse Code, Meta's terminal coding agent, does not, so its rows carry an open question rather than a full answer.

HarnessSurfacesModel couplingUnattended mode
Claude CodeTerminal, VS Code, JetBrains, desktop, webClaude models, over five endpoints, base URL settable for a gatewaybypassPermissions, documented for isolated environments
CodexCLI, IDE extension, desktop, ChatGPT web, cloudAny provider you define, with a base_url and a wire protocolcodex exec, with --sandbox workspace-write recommended
Gemini CLITerminalGemini models. Custom endpoint not documented--approval-mode=yolo
CursorEditor, CLI, web, mobileMany vendors, plus its own models. Own key for four of themRun Everything, no sandbox and no classifier
Muse CodeTerminal and CImuse-spark-1.2 by default, --model to change it. Whether a non-Meta endpoint is reachable is unstatedmuse exec, with --disable-approval and --yolo as flags

Every row is confirmed against the vendor's own documentation except Muse Code, which is unconfirmed: the pages read document the flags and the default model but do not say whether the harness can call any model other than Meta's own, which is the question that decides whether a gateway can sit in front of it.

HarnessInstructions fileCompacts automaticallyCheckpoint or undo
Claude CodeCLAUDE.mdYes, plus /compact/rewind, last 100 checkpoints
CodexAGENTS.mdYes, at model_auto_compact_token_limitNone. The docs tell you to use git
Gemini CLIGEMINI.md, filename configurable/compress on demand. Automatic behaviour unstated--checkpointing and /restore
Cursor.cursor/rules/*.mdc or AGENTS.mdNot documented on the pages readCheckpoints, restored from the timeline
Muse CodeAGENTS.md, then CLAUDE.md, then .agents/AGENTS.md, then .claude/CLAUDE.mdNot stated on the pages readRewind a conversation, plus a replayable event log

Rows marked "not documented" or "unstated" are open questions. The rest is confirmed against the documentation named in each tab. Muse Code has no tab, so its rows were read on 2026-09-09 against https://dev.meta.ai/docs/muse-code/ and https://dev.meta.ai/docs/muse-code/configuration.

Only Codex documents pointing the harness at an endpoint you choose, so it is the one an LLM gateway sits in front of without argument. Every harness here reads a markdown file from the repository root, three of them under the same name, which makes that file the only asset that survives changing your mind about the rest of the table.

What this maps to: Claude Code. One engine behind several surfaces, with the repository's configuration shared across all of them.

QuestionAnswerStatus
What surfaces does it run on?Terminal CLI, VS Code and JetBrains extensions, a desktop app, and the web at claude.ai/code, plus the Claude mobile appconfirmed
Does the configuration follow the surface?Yes. Each surface connects to the same engine, so CLAUDE.md, settings and MCP servers work across all of themconfirmed
Which models can it call?Claude models, through the Anthropic API, Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform, or Microsoft Foundryconfirmed
Can it point at a custom endpoint?Yes, for an LLM gateway: ANTHROPIC_BASE_URL, plus ANTHROPIC_BEDROCK_BASE_URL, ANTHROPIC_AWS_BASE_URL, ANTHROPIC_VERTEX_BASE_URL and ANTHROPIC_FOUNDRY_BASE_URL. /status shows which one a session usedconfirmed
Can it call another vendor's model?Not documented on the pages read. Open questionunconfirmed
How do permissions work?allow, ask and deny rules in settings files, plus a mode: default, acceptEdits, plan, auto, dontAsk, bypassPermissionsconfirmed
What is the unattended mode?bypassPermissions, documented for isolated environments only. permissions.disableBypassPermissionsMode blocks it from managed settingsconfirmed
Is there an enforced sandbox?Yes, operating system level filesystem and network isolation for Bash commands, merged with the permission rulesconfirmed
Which extension mechanisms?Skills, plugins, hooks, subagents, slash commands, MCPconfirmed
Where does that configuration live?~/.claude/settings.json, .claude/settings.json, .claude/settings.local.json, managed-settings.json for an administrator, and .mcp.json in the repositoryconfirmed
Instructions fileCLAUDE.md at the repository root, read at the start of every session. Organisation-wide copies can also be deployed to system directoriesconfirmed
Does it compact automatically?Yes. /compact forces it, /context shows what is in the windowconfirmed
Headless modeclaude -p with --output-format json, or the Claude Agent SDK for Python and TypeScriptconfirmed
Checkpointing and undo/rewind, or double Escape. Snapshots taken before every user prompt, the 100 most recent kept per sessionconfirmed
What checkpointing missesFiles changed by Bash commands, most subagent edits, external edits, and symlinked or hard-linked pathsconfirmed
TranscriptSessions saved to disk and resumable, swept after cleanupPeriodDays, 30 days by defaultconfirmed

Their vocabulary

Standard termTheir term
Agent instructions fileCLAUDE.md, plus auto memory
Permission modelPermission modes and permission rules
Headless modePrint mode, -p
CheckpointingCheckpoints, restored with /rewind

Where to look

/status names the provider, base URL and proxy in force for the current session, which is the fastest way to check whether a gateway is actually in the path. /permissions shows the rules that are live.

Last verified: 2026-09-09 against https://code.claude.com/docs/en/overview and https://code.claude.com/docs/en/permissions and https://code.claude.com/docs/en/checkpointing and https://code.claude.com/docs/en/third-party-integrations and https://code.claude.com/docs/en/costs.


Check your understanding

0 of 4 answered

  1. A team is told to switch from one harness to another next quarter. Which of their work carries over unchanged?
  2. An organisation has bought an LLM gateway to cap spend per team and log every request. Which property of a harness decides whether the gateway can cover it?
  3. A harness advertises checkpointing. What should you check before relying on it to undo a long run?
  4. A harness runs in the terminal. What does that surface make cheap, and what does it make awkward?