← Back to Blog
AIModelLLMHarnessAI AgentAgent

Agent = Model + Harness

Trida AI·
Agent = Model + Harness

One equation, two very different parts

A frontier model on its own is a brilliant mind locked in a dark room. It can reason about code but can't run it, plan a migration but can't touch a database, and forgets everything the moment the conversation ends. Ask it to "fix the failing deploy" and it will produce an excellent essay about deploys.

An agent is what you get when you wrap that mind in a harness: the runtime that assembles context, brokers every tool call, sandboxes execution, persists state, and recovers from failure. The equation is worth keeping literal — Agent = Model + Harness. The model supplies judgment. The harness supplies hands, eyes, and memory.

The agent, split open: the model never touches the environment directly; every capability flows through the harness boundary, where permissions, sandboxing, and audit live.
The agent, split open: the model never touches the environment directly; every capability flows through the harness boundary, where permissions, sandboxing, and audit live.

What a harness actually does: keep the loop running

Strip away the branding and every agent runtime is the same loop. The harness assembles context — the task, the conversation, file contents, previous tool results — and hands it to the model. The model reasons and either answers or asks for a tool. The harness executes that call in a sandbox, appends the observation to context, and goes again.

"Keep working in real-world settings" is the hard part of that sentence. Real environments mean flaky APIs, timeouts, permission boundaries, context windows that fill up mid-task, and processes that die. A production harness retries what's transient, compacts context when it overflows, and persists the session so work survives a restart. This is the unglamorous 80% of agent engineering — and none of it is the model's job.

The loop the harness keeps running: assemble context → model reasons → execute tool in a sandbox → observe result → append to context and go again, until the model finishes and the session is persisted.
The loop the harness keeps running: assemble context → model reasons → execute tool in a sandbox → observe result → append to context and go again, until the model finishes and the session is persisted.

Anatomy of a modern harness: a kernel and its plugins

The harnesses aging best are the ones built like operating systems: a small kernel, with every capability as a plugin. DeepSeek Harness is the cleanest recent example — its Cordis kernel does exactly three things: it mounts plugins, unmounts them, and resolves the dependencies between them. That's it. The kernel has no opinion about which model you run or what tools exist.

Everything the agent can actually do lives in plugins: models, tools, skills, sessions, sandboxes, storage, loops, scheduling, even the UI. Plugins never import each other directly — they cooperate through kernel services and events, which is what makes any one of them swappable.

Capabilities as plugins: nine capability plugins wired to the Cordis kernel through services and events; the kernel mounts, unmounts, and resolves dependencies.
Capabilities as plugins: nine capability plugins wired to the Cordis kernel through services and events; the kernel mounts, unmounts, and resolves dependencies.

Compose with configuration

Because capabilities are plugins, composing an agent stops being a code change. Developers select, swap, or extend any capability in configuration — without touching the harness source. Swapping the model is one line. Adding a tool is a list entry. Moving from a Docker sandbox to a locked-down VM is a key change, not a fork.

This is the property that makes a harness deployable, not just demoable: every environment-specific difference — which model, which tools, which storage, which schedule — lives in config that ops can own, while the harness itself stays a single, upgradable artifact.

Compose with configuration: a one-line edit in harness.config.yaml swaps the model plugin; the kernel composes the harness from config, and the source is never edited.
Compose with configuration: a one-line edit in harness.config.yaml swaps the model plugin; the kernel composes the harness from config, and the source is never edited.

Why this matters when agents meet production

When we deploy agents with customers, the model is rarely what decides success. Models are strong and getting stronger; what varies wildly is whether the agent survives contact with a real environment — permissioned data, flaky internal APIs, hours-long tasks, compliance boundaries. That is entirely a harness question. When you evaluate an agent stack, ask about the body, not just the soul:

  • Loop robustness — what happens on a timeout, a malformed tool result, a full context window?

  • Isolation — where does tool execution actually run, and who set its permissions?

  • State — does a session survive a restart? Can a human resume it?

  • Pluggability — can you swap the model, tools, or sandbox in config, or is it a fork?

Agent = Model + Harness. The model is the soul; the harness is everything that lets it live in your environment. Pick both deliberately.