ML/AI, CV

The Model Is Not Your Agent - why the agent harness is becoming the new application runtime

The model as a component inside the runtime - a harness holding planner, state, memory, context, tool router, permissions, sandboxing, workflows, subagents, evaluation, observability and recovery, with the reasoning model sitting inside it

For the last few years, most AI architecture discussions started with the same question: which model should we use?

GPT. Claude. Gemini. DeepSeek. Qwen. Local models.

That was a reasonable question when the model was doing most of the work. But agentic systems are changing the architecture. The model is increasingly becoming one component inside a much larger runtime responsible for planning, tools, state, execution, permissions, memory, observability and recovery.

And that runtime - the agent harness - may end up being more important to your application architecture than the model itself.


From LLM application to agent runtime

A conventional LLM application is a straight line. Even with retrieval bolted on, the architecture is still fundamentally centred on the model: something assembles a prompt, the model answers, and the request is over.

An agent is different.

Three architectures compared - an LLM application, a RAG application, and an agent whose loop observes, decides, acts, evaluates and repeats while drawing on model, tools and memory

The model participates in the loop. It is not the loop.

That distinction becomes increasingly important as agents move from answering questions to performing actual work.


DeepSeek Harness makes the separation explicit

DeepSeek's newly open-sourced agent harness (dsh) is an interesting example of this shift. It is built around an "everything is a plugin" architecture: file editing, shell access, search, planning, goals, subagents and workflows all arrive as plugins rather than as hard-coded features, and its Code mode lets the model combine multi-step tool operations programmatically. It is explicitly labelled a developer preview.

What is interesting isn't simply that DeepSeek released another coding agent. It is where the architectural boundary is being drawn.

Nothing in the harness ties it to DeepSeek's own models - the provider catalogue spans Anthropic, OpenAI, AWS Bedrock, Azure and Google alongside DeepSeek's own endpoint. A company shipped an agent runtime and made the interesting decision that their own model is one of the swappable parts.

That is much closer to an application runtime than a chatbot.

Agent = model + harness

The framing DeepSeek uses is worth keeping. A strong model with no harness is a very expensive autocomplete. The harness is what turns reasoning into action - and it is the half you actually write.


The model should be replaceable

There is a useful architecture test for an agentic application:

How difficult would it be to replace the model tomorrow?

If swapping GPT for Claude, DeepSeek or a local model requires rewriting your application, you probably don't have an agent architecture. You have an LLM application with tools attached to it.

A more durable design puts a seam in a specific place.

Application over an agent behaviour layer holding planner, state machine, tool definitions, permissions, memory, evaluation, retry policy and observability - with a model adapter below it fanning out to Claude, GPT, DeepSeek and a local model

The model becomes an implementation choice for particular reasoning tasks rather than the foundation of the entire system.

And once that seam exists, something more interesting follows: different parts of the same agent can use different models.

Matching each step to an engine - planning to a strong reasoning model, classification to a small cheap model, extraction to a specialised model, deterministic operations to plain code, and complex escalation to a frontier model

That is a fundamentally different architecture from send everything to the smartest LLM.


Not every step requires intelligence

This may be the most important change.

Early agents often alternated model and tool on every single hop. Every intermediate result passed back through the model. That means more tokens, more latency, more opportunities for mistakes, and an increasingly polluted context window.

Modern agent runtimes are starting to separate judgement from execution.

OpenAI's GPT-5.6 guidance describes this distinction directly: some tasks require judgement, while others largely involve moving, filtering and combining data. Programmatic tool calling lets that deterministic processing happen in code, rather than forcing every intermediate result back through the model's context window.

Two tool-calling shapes - on the left every hop returns through the model six times, on the right the model calls code once, the code fans out to four tools, and only the result returns

The LLM decides what needs judgement. The runtime handles what computers already know how to do reliably.


Deterministic where possible, agentic where necessary

This leads to a design principle I think will become increasingly important:

Use intelligence for uncertainty. Use software for certainty.

Consider an agent processing an insurance claim. It might need to read the claim, identify the policy, retrieve coverage rules, calculate the deductible, check eligibility, detect unusual circumstances, and decide whether human review is required.

Not every step should be an LLM decision.

One insurance claim split by step type - retrieving the policy, calculating the deductible, validating dates and checking required fields run in code, while interpreting ambiguity, recognising an unusual case, planning the next check and explaining the decision run through the model

The best agent architecture isn't LLM everywhere. It is LLM exactly where intelligence adds value.

There is a governance argument here too, not just a cost one. A deductible calculated in code can be unit tested, audited and explained to a regulator. The same number produced by a model is a probability distribution wearing a suit.


The harness becomes the durable asset

Models are moving incredibly quickly. Today you might build around one frontier model. Three months later another model may be cheaper, faster, better at coding, better at tool calling, runnable locally, or simply better for your particular domain.

If your business logic lives inside prompts tightly coupled to one model, every model transition becomes an architecture migration. If the model sits behind the harness, the migration looks very different: you evaluate another model, you change an adapter or a routing rule, and the application remains largely intact.

The seam has to be real

A ModelAdapter interface that leaks one provider's tool-call format, token accounting and system-prompt conventions is not a seam - it is that provider's SDK with a new name on it. You find out which kind you built the first time you try to swap. Run a second model through it early, while switching is still cheap.


Model improvements alone aren't the whole story

There is a striking data point in OpenAI's recent engineering guidance.

On one ARC-AGI-3 evaluation, GPT-5.6 Sol scored 13.3% under the official harness - which discarded the model's private reasoning after every move and truncated older history once the conversation grew past a length limit. Rerun through the Responses API with retained reasoning and compaction enabled, the same model scored 38.3%, while using roughly six times fewer output tokens.

The same model scoring 13.3 percent under the official harness and 38.3 percent with retained reasoning and compaction enabled, using about six times fewer output tokens

Same underlying model. Different runtime behaviour. Roughly triple the score for a fraction of the tokens.

We tend to benchmark model A versus model B. But the more meaningful benchmark for an agentic application is the whole system: model, plus harness, plus tools, plus context strategy, plus execution policy, plus evaluation loop.

Agent performance is a systems problem.


The agent loop is the architecture

A useful abstraction is remarkably small:

while not goal_complete:
    observation = observe()
    state = update_state(observation)

    decision = reason(goal, state, available_actions)
    action = execute(decision)
    result = evaluate(action)

    if result.failed:
        recover()

    if human_approval_required(action):
        request_approval()

Around that simple loop sits most of the engineering that makes an agent production-ready.

The agent loop - observe, decide, act and evaluate repeating until the goal is complete, with evaluation branching into recovery when a tool fails and a human approval request when the action needs sign-off

ConcernThe question it answers
Context managementWhat does the agent need to know right now?
StateWhat happened previously?
ToolsWhat is the agent allowed to do?
PermissionsCan it read, modify, delete or spend money?
PlanningOne action, or decompose the problem?
EvaluationHow does it know the action succeeded?
RecoveryWhat happens when a tool fails?
ObservabilityCan we reconstruct why it decided that?
Human interventionWhen does the system stop and ask?

These aren't model problems. They are application architecture problems.


The next security boundary is the agent runtime

Look down that table again and notice how many rows are really security rows.

As agents gain shell access, browsers, credentials and the ability to modify repositories, classic application security assumptions start breaking down. The old model assumed code was fixed at deploy time and only data varied at runtime. An agent inverts that: the behaviour is decided at runtime, by a probabilistic component, from input that may be attacker-controlled.

Sandboxing, permission boundaries, tool allowlists, audit trails and human approval stop being optional security add-ons. They become part of the architecture - which is precisely why a runtime like DeepSeek's exposes sandboxing as a first-class part of the harness rather than leaving it to whoever deploys it.

If the harness is where capability lives, the harness is also where containment has to live. Where that containment actually runs is a separate question, and the infrastructure layer is growing primitives for it - Kubernetes is acquiring an isolation primitive built for exactly this.


Your agent architecture should survive the next model

The industry spent the first phase of generative AI asking which model should I build on? The more useful question now might be: what architecture lets me benefit from whichever model is best next?

That doesn't mean models aren't important. They are extraordinarily important. But databases are important too. Operating systems are important. Browsers are important. None of them should contain the entire architecture of your application.

Models should eventually occupy a similar position: a powerful component behind a clearly defined boundary.

Four eras - 2024 prompt the model, 2025 give the model tools, 2026 build a runtime around the model, and next let the runtime choose the intelligence

That last step is where things get particularly interesting. An agent runtime could decide, per step, whether intelligence is needed at all.

A routing decision - each incoming step is asked whether it needs judgement, running in code if not, and going to a small, medium or frontier model if it does

Now the model isn't the application. It is a compute resource selected by the application - much like choosing a database query, a serverless function, a GPU workload or a background job today.


The new application runtime

DeepSeek calling its project a harness is therefore more interesting than it initially sounds. OpenAI's movement toward persisted reasoning, compaction, programmatic tool execution and multi-agent orchestration points in the same general direction: increasingly capable models are being surrounded by increasingly sophisticated execution infrastructure.

The competitive advantage for builders may therefore shift. From who has access to the best model? to who has built the best system around the models?

Your prompts can change. Your models will definitely change. Your tools will evolve. But the architecture responsible for deciding what to do, what to use, what happened, whether it worked and what happens next is likely to remain.

That is the agent harness. And it is starting to look a lot like the new application runtime.

Stop architecting around the LLM. Architect around the agent loop.

The model provides intelligence. The loop provides the system.


This post looks inward, at how a single agent works. Two companion pieces look the other way: MCP gave agents tools, A2A gives agents colleagues is about the boundary between independent agents, and Kubernetes is becoming an AI workload orchestrator is about the infrastructure all of it eventually lands on.

Previous
On-Prem AI - the cycle in reverse?