
Three years ago "coding agent" meant an autocomplete plugin. Now it means a runtime that reads your repository, plans edits, runs tests and opens a pull request, and the interesting differences between products live in the runtime — the harness — not in the model they happen to call.
The category moved into the open this week: Earendil shipped Pi 1.0 as a "hardened, minimal, extensible agent harness", DeepSeek published a harness built around the idea that everything is a plugin, and Offrun positions itself as one workspace to manage every coding agent. Choosing between them is an architecture decision, so evaluate the architecture, not the demo.
01What a coding agent harness actually does
The model cannot read your files or run your tests. The harness does that and feeds the results back. In practice it owns four responsibilities:
- Context assembly — which files, diffs, logs and instructions enter the prompt, and what gets summarised or dropped when the window fills.
- Tool execution — the shell commands, file edits, searches and network calls the model can request.
- Permission enforcement — which of those calls run automatically, which need approval, and which are forbidden.
- Session state — what survives between turns, between sessions and between machines.
Everything else is packaging. When two harnesses feel drastically different on the same model, one of these four is why.
02The current options, honestly compared
| Harness | Shape | Evaluate it if | Ask before adopting |
|---|---|---|---|
| Pi 1.0 | Minimal, extensible, hardens slowly and deliberately | You want a small surface you can extend yourself | How much is built in versus expected from extensions? |
| DeepSeek Harness | Plugin-first | You want to compose capabilities in and out | What is the plugin trust model? |
| Offrun | Multi-agent workspace | You juggle several agents and models | Does centralising them centralise the risk? |
| Vendor CLI | Integrated with one model vendor | Setup speed beats portability | Can it point at a non-vendor or local model? |
The plugin-first designs are the most interesting and the hardest to assess, because once a harness loads third-party extensions, those extensions inherit its permissions. A plugin model is a supply-chain decision as much as a feature.
A plugin runs with the harness's permissions
An extension that can read files, run shell commands or call the network extends the blast radius of every model mistake. Treat the plugin registry like a dependency tree, not a theme store.
03Decide with seven questions
- Which model can it run? If the answer is one vendor only, you are choosing a model, not a harness. Portability matters most over a two-year horizon.
- How does it manage context? Ask how it handles a 200k-line monorepo: does it index, retrieve, summarise or blindly truncate?
- What is the permission model? Prefer per-tool, per-path and per-command rules over a single "allow everything" switch.
- Can it be sandboxed? Containers, read-only mounts and network egress rules turn an incident into an inconvenience.
- Where does session state live? Local files, a hosted service, or your own database — this decides your data posture.
- How do you review its work? A harness that produces reviewable diffs and logs fits a team; one that writes directly to the branch does not.
- What does extension cost? Count the plugins you will actually need before you commit to a plugin-first design.
04Self-host it without handing over the repository
The deployment shape matters as much as the feature list. A defensible baseline:
- Run the harness inside a container with the repository mounted read-write and nothing else mounted at all.
- Deny network egress by default, then allowlist the model endpoint and the package registries you actually use.
- Keep credentials out of the container; inject short-lived tokens at call time if the agent needs them.
- Require approval for
git push, package installs and anything that deletes files. - Capture the full transcript so a reviewer can see every command that ran, not only the final diff.
# Shape of a restrictive agent policy: specific paths, explicit denies first.
permissions:
read: ["src/**", "tests/**", "docs/**"]
write: ["src/**", "tests/**"]
shell:
allow: ["pnpm test", "pnpm lint", "git diff", "git status"]
deny: ["git push", "rm -rf", "curl"]
network: ["api.example.internal"]
Deny rules belong above allow rules, because a pattern like pnpm * would otherwise swallow pnpm publish. This configuration is ordinary YAML or JSON, so format and validate it like any other config in your repository.
05Point it at a model you control
Model-agnostic harnesses earn their keep here. A harness that speaks the OpenAI-compatible chat API can point at a hosted model today and a llama-server instance on localhost tomorrow, without changing the agent workflow. If you run a local endpoint, remember that a smaller model needs more scaffolding: tighter context, more explicit tool descriptions and a stricter review step.
The reverse also holds. The biggest model in the world will not rescue a harness that dumps the entire repository into every prompt, because context quality beats context quantity in almost every real task.
06Evaluate on a real task in one hour
Skip the vendor demo and give every candidate the same job: a non-trivial bug in your own repository with a test that reproduces it. Score four things.
| Signal | What to look for |
|---|---|
| Context handling | Did it find the right files without being told? |
| Permission friction | How many approvals did it need to do real work? |
| Recovery | When a test failed, did it read the error and correct itself? |
| Reviewability | Could a colleague understand the change from the transcript? |
The harness that wins is usually the one with the fewest surprises, not the one that finished fastest on a curated task.
07Common mistakes and fixes
| Mistake | Why it hurts | Fix |
|---|---|---|
| Choosing on benchmark demos | Demos use curated repositories | Test on your own code |
| One "allow all" permission mode | Any model error becomes an incident | Scope tools, paths and commands |
| Adopting a plugin-heavy harness immediately | Extensions enlarge the attack surface | Start with built-ins only |
| Running on the host machine | The agent can reach everything you can | Use a container with minimal mounts |
| No transcript retention | You cannot audit what ran | Log every tool call and its output |
The honest summary: the harness is now the product. Pick the one whose permission model, context strategy and extension surface you can live with, then verify it on your own worst repository rather than the vendor's best demo.
Frequently asked questions
What is a coding agent harness?
It is the software around a model that gives it a loop, a set of tools, a permission model and a way to see your repository. The model proposes actions; the harness decides which ones run.
How is a harness different from a coding agent?
The terms overlap. The agent is the model plus its strategy; the harness is the runtime that executes tool calls, manages context and enforces limits.
Should I self-host or use a vendor CLI?
Self-host when you need control over which model sees your code, how long sessions persist, or where data is stored. Use a vendor CLI when speed of setup matters more than those constraints.
What is the biggest risk of an agent harness?
Scope. A harness with broad filesystem, shell and network permissions can turn a model mistake into a real incident, so the permission model is the first thing to evaluate.
Which model should the harness use?
Whichever meets your quality bar within your privacy budget. Model-agnostic harnesses let you start with a hosted model and switch to a local endpoint without changing the workflow.
Related articles
- How to run an open-weight LLM locally
Serve the model your harness points at.
- How to verify packages suggested by AI assistants
The harness will install what the model suggests.
Related tools
- JSON Formatter
Read the JSON-shaped harness and tool config.
- JSON Validator
Validate agent and tool configuration before running.
- Diff Checker
Review the edits an agent produced before you commit.