TL;DR

The short version

"It's not the model, it's the harness" is the line of 2026, and almost no one defines the harness. Claire Vo does: it's code wrapped around an AI agent to make it better at one specific job — with specific context, specific tools, and specific outcomes.

She builds one live to triage Sentry bugs on the Claude Agent SDK. The payoff over a raw coding tool is control: baked-in intent, gated tools, and outcomes that happen every time. From How I AI.

Built on the 8 Jul 2026 episode of How I AI with Claire Vo, who builds a custom bug-triage harness on the Claude Agent SDK.

The word everyone uses and no one explains

"It's not the model, it's the harness" is the line of 2026. But as Claire Vo points out on How I AI, almost no one says what a harness actually is. So here's the whole definition, stripped of mystique.

A harness is just code around an AI agent that makes it more effective.

Claire Vo, How I AI

That's it. It has three parts — specific context, specific actions it can take, and specific outcomes it produces. Cursor is a harness. Claude Code and Codex are harnesses — just complex, general-purpose ones. The move for an operator is building a small, opinionated harness for a job your team does the same way every time.

When it's worth building one

Vo's test: build a harness when the same workflow needs the same setup and the same outcomes. It fits jobs that mix deterministic steps with judgment — coding, production incidents, getting PRs ready for release, support escalations, migrations, even a specific style of research.

She picked bug triage. She ships code, so she ships bugs, and fixing them was a repeatable workflow she'd been running through Claude Code by hand. Her hypothesis: a purpose-built harness would triage Sentry issues more consistently than re-explaining the job every time.

What the harness buys you over a raw agent

She'd been using coding agents directly. So why wrap one? Three reasons — and they're why this matters for anyone running agents at scale.

Intent is baked in. With a general tool, every run starts with "dear agent, here's the bug, please fix it." With her harness, she pastes a Sentry link and the agent already knows the job, the tools, and the expected output.

You control what it's allowed to do. She built it investigate-only — it explores and explains root cause but never edits a file unless she flips a flag. Tool policies and approval gates decide what it can touch or send. That's governance you can't reliably prompt your way to.

The outcome happens every time. Every triaged bug gets logged in Linear with a specific report. You could put that in a skill, she notes, "but then you have to babysit it." Encoded in the harness, it's guaranteed.

What she actually built

The architecture is refreshingly ordinary. A terminal UI (built with Ink, the React-for-CLIs library) sits on top of the Claude Agent SDK, which supplies the agentic loop and file primitives. It's wired to real tools — Sentry, Vercel, Linear, GitHub — and runs Sonnet 4.6. Every run saves its evidence to an artifact store on the filesystem the agent can reuse later.

The key design choice is opinionated adapters. Instead of handing the agent a generic Sentry MCP and letting it wander through traces, she wrote a Sentry adapter that pulls exactly what a bug report needs — nothing more. Precision at the connector, not exploration.

One detail worth stealing: she had the agents build the harness. She ran dueling Claude Code and Codex sessions and told them to build it. Both resisted — they kept trying to make it purely deterministic with no AI inside — so she had to prompt very specifically about where the model belonged. Codex built it best, and built it on the Claude Agent SDK.

The recipe, and the reframe

The build is simple; the reframe is the payoff. We've gotten used to the open chat field: type anything, and a capable agent does good work. It does. But Vo's harness convinced her that agents solve specific problems far better when you constrain the work — then use a general-purpose agent to orchestrate the constrained ones. Real leverage isn't a smarter model. It's a tighter box around a clear job.

Her recipe, if you want to try it:

  1. Identify a repeatable workflow and write it down.
  2. Build opinionated adapters to your data sources (not just a generic MCP).
  3. Decide the structured artifacts you want out of each run.
  4. Set the tool permissions — what it can edit, send, or only investigate.
  5. Pick your model (or a router) and give it a surface: TUI, CLI, or web app.
  6. Hand the whole spec to Claude Code or Codex and test it against real data.

"A wrapper is just a harness," she says — and once you see it that way, every rough tool you've vibe-coded becomes something you can make reliable.

Related Articles

Sources