← Blog

Every agent harness is the same seven parts

A coding agent, a personal assistant and a support desk look like three different products. Underneath, each one is the same seven parts in different proportions. Once you can see the parts, a new harness is mostly an assembly job, and most of the parts are already built.

What a harness is

A model takes text and images in and gives text and tool calls back. That is all it does. It cannot run the tool it just asked for. It cannot remember yesterday, open a file, wait for someone to approve a refund, or notice that a ticket arrived at three in the morning.

Everything that does those things is the harness. Claude Code is a harness. So is the support bot on your bank's website, and so is the assistant that texts you when your flight moves. They feel different because their harnesses are tuned for different jobs, not because they are made of different things.

Here is one request going through a Glove harness:

Surfacechat · voice · APIContextprompt · history · live stateModelany providerStatestore · memory · inboxToolsvalidated · gatedTeamsubagents · meshWorkspacefiles · code · webloopuntil the model answersprompttool callsresultshistorymessageanswerdisplay stack: show · ask · waita subagent is a toolacts on
One request through a Glove harness. The message is saved to state; context is assembled from state before every model call; the model asks for tools; results are saved; the cycle repeats until the model answers. Tools can render UI on the surface and wait for a reply, act on a workspace, or hand work to a subagent.

The person's message is saved. Context is assembled from what was saved, plus whatever is true right now. The model reads it and asks for tools. The tools run, and their results are saved. Then it goes round again, until the model answers instead of asking for another tool. Every harness you have used works this way, whether or not it says so.

The seven parts

Each part answers one question. Every harness has to answer all seven, even if the answer is "not much".

  1. Loop: how does it act? Call the model, run the tools it asks for, feed back the results, stop when it answers. Then the details: retries, a turn limit, cancelling halfway, streaming text, counting tokens.
  2. Tools: what can it do? Every capability is a name, a description the model reads, a schema and a function. Search, refund, run a shell command, call another service.
  3. Context: what does it see? The instructions, the history, and the state of the world right now. Plus guidance it loads only when it needs it, and a way to keep a long session inside the window.
  4. State: what does it remember? The conversation, a plan, what it learned about this person, what it is still waiting on, what it is trying to finish.
  5. Workspace: where does it work? Files it can write and read back, code it can run, a browser, a container. A place where big data and finished artifacts live outside the context window.
  6. Surface: how do people reach it? A chat window, a terminal, a phone call, an API. And the way a tool shows a result or asks a question and waits for the answer.
  7. Team: who does it work with? A subagent that takes a narrow job with its own tools, or another agent it messages.

Three harnesses, side by side

Put three very different products next to each other and fill in the parts.

PartCoding agentPersonal assistantSupport desk
LoopLong, many tool calls per requestShort, a few calls per messageShort, but many at once
ToolsRead, edit, run, search the repositoryCalendar, email, web, remindersOrder lookup, refunds, ticket replies
ContextRepository conventions, the current planWho you are, what is on todayPolicy, the customer's account right now
StateA task list, the sessionMemory of you, pending remindersTicket history, the details collected so far
WorkspaceA sandboxed checkout and a shellA browser, documents it writesUsually none
SurfaceTerminal, editor, permission promptsTelegram, email, voice notesChat widget, email, an approval queue
TeamAn explorer subagent, a reviewerA research subagentA triage classifier, a specialist per topic

The columns differ in proportion, not in kind. A coding agent spends its effort on the workspace and the loop. A personal assistant spends it on state and on acting at the right time. A support desk spends it on events arriving from outside and on people approving what it does.

That is where the interesting work is. The rest, the loop, the tool plumbing, saving the conversation, keeping context fresh, showing a prompt and waiting, is the same in all three. It should not be written three times.

Take apart one you already use

Try it on a coding agent in your terminal. Every piece you see maps to one part, and to one Glove primitive:

What you seePartThe Glove primitive
It keeps calling tools until the change is doneLoopprocessRequest on a built Glove
Read, edit, search and run commandsToolsfold, or one interpreter over many functions
"Allow this command?"Tools, surfacerequiresPermission and the display stack
A project instructions file and skills it reads when relevantContextA stable system prompt and useReadSkill
A todo list that updates as it worksContext, stateThe built-in glove_update_tasks
Long sessions that keep going after the window fillsContextcompaction_config
Your checkout and a shellWorkspacemountSandbox or a working environment
An explorer it sends off to search the codebaseTeamdefineSubAgent

Nothing in that list is specific to coding. Swap the tools and the workspace and the same harness is a data analyst. Swap the surface for a phone call and it is a voice agent.

What Glove gives you for each part

Glove is built as one primitive per part, so the shape of the framework is the shape of the problem. The smallest harness is a loop and one tool:

agent.tstypescript
import { Glove, Displaymanager } from "glove-core";
import { createAdapter } from "glove-core/models/providers";
import { z } from "zod";

const agent = new Glove({
  model: createAdapter({ provider: "anthropic", model: "claude-sonnet-4-20250514" }),
  displayManager: new Displaymanager(),
  systemPrompt: "You help a team ship releases. Use tools for facts.",
  compaction_config: { compaction_instructions: "Summarise the release work so far." },
})
  .fold({
    name: "list_merged_changes",
    description: "List pull requests merged since a date, newest first.",
    inputSchema: z.object({ since: z.string().describe("ISO date") }),
    async do({ since }) {
      // mergedSince is your own lookup: GitHub, a database, a file.
      return { status: "success", data: await mergedSince(since) };
    },
  })
  .build();

const result = await agent.processRequest("What shipped since Monday?");

That is already a full loop with validated input, retries, a turn limit, compaction and a store. Each other part is one more call on the same agent:

None of these replace the loop or the model. They all attach to the agent you already have. That is a deliberate rule: capability packages mount onto an agent, they never wrap it.

When a harness becomes a system

A harness serves the person in front of it. The moment there is more than one person, or work has to happen with nobody in the chat, five new questions show up. Glove Foundry answers them:

These are not features you add to a harness. They are what turns harnesses into a service. Teams that skip Foundry tend to build them anyway, one table and one cron job at a time.

When a system meets production

A system still has to run somewhere. That brings the last four questions, and Kuiper answers them:

Three layers, each wrapping the one inside it. Glove is the harness around a model, Foundry turns harnesses into a running system, and Kuiper runs that system in production. Each name is a part you would otherwise build yourself; click one for its primitives.

Why the model matters

The most expensive mistake we see is not a bug. It is a part that already existed, built again by hand. A job queue for "remind me tomorrow" when the agent could schedule itself. A system prompt rebuilt every turn to include the current cart, which also throws away the prompt cache. An approvals table with its own pause and resume. Fifty tool definitions where one interpreter would do. Each one works, and each one is code someone now owns.

Coding agents make the same mistake faster. Ask one to "add reminders" and it will happily write a scheduler. It does not know the primitive exists unless something tells it.

So the docs now start from the parts. Before you build anything, find the part it belongs to and check what is already there.

Where to go next. First principles covers the model in full. The primitives map lists every primitive by part, with what people build when they don't know it exists. Build it up takes one agent from a single tool to production in eight steps, and the harness blueprints show whole harnesses as bills of primitives.