Enablement · Lesson

The Anatomy of a Harness

A model writes the next word. A harness is everything around it that turns that into a job you can run again. MAUDE is the example.

Definition

What a harness is

A language model is a function. You give it text. It predicts the next piece of that text, then the next, until it stops. It does not have your files. It cannot search the web unless something else searches for it. It cannot send mail, open a pull request, or know that last week's summary already exists on disk. Left alone, it is a very good guesser with no way to reach your files, your mail, or the rest of the machine.

A harness is the software around that guesser. It decides what the model is allowed to see, which actions it is allowed to ask for, when the work is finished, and how you tell whether the result is any good. Chat is you and a model taking turns in a window. A harness is a process: same brief, same tools, same checks, next week.

MAUDE is a harness I built for myself. The models are Nemotron on a DGX Spark, plus cloud models when the job needs them. The harness is everything else: one gateway, a catalog of tools, a loop that can call those tools and come back, a log of what happened, and a stop when the job is done or a budget runs out. You talk to MAUDE from a terminal, a Mac client, a phone, Telegram, or a web dashboard. The model never sees that. It sees a request, a short list of tools, and whatever context the gateway packed for this turn.

Why

Why you would build one

Work repeats. Monday you asked a chat box to summarize a folder of notes. You pasted three files, forgot the fourth, got a draft, argued with it, and by Thursday you could not remember which prompt actually helped. Next Monday someone else has the same job. The chat is gone. The method was never written down. That is not a workflow. That is a lucky afternoon.

A harness is useful because it takes the job out of whoever happened to be typing. The brief lives in the system. The tools have names. The checks run whether you are watching or not. You can inspect a bad run instead of reconstructing it from memory.

ChatGPT, Claude, and Gemini are products. They wrap a model in their own harness: memory they choose, tools they choose, logs you do not own. That is fine until you need the model to touch your mail, your repo, your machine, or a local model that never leaves the building. Then you either live inside their product or you build the wrap yourself.

I built MAUDE because I did not want three apps, three bills, and no shared context. I wanted Claude when the job needed it, a local model when the file should not leave the Spark, and the same tools either way. The harness is what makes those models interchangeable. The user asks. The gateway picks a model, clips the tool list, runs the calls, and streams the result back.

Introduction to AI is how you put a live task in front of a model for the first time. A harness is how that task stops depending on a prompt you will not remember.

Walkthrough

What happens when you ask MAUDE to do something

Say you ask MAUDE to draft a reply to a client thread and attach the latest schedule from Drive. You are not talking to Claude or Nemotron. You are talking to the gateway. The gateway reads the request and does the unglamorous work the model cannot do for itself.

It picks a model for this job. It does not send the full tool catalog. It activates the tools that look relevant: mail, Drive, maybe calendar. It packs a window: standing instructions, this message, those tool descriptions. Then it sends that package to the model.

The model cannot fetch the thread. It can only say, in a format the gateway understands, that it wants to call a mail tool with these arguments. The gateway runs that call, or refuses it, and hands the result back. The model reads the result and maybe asks for a Drive file. Same pattern. When it has enough, it writes the reply. The gateway returns that to you, with a trace you can open if you want to see which tools fired and how long they took.

None of that is the model being clever. The model is still predicting the next token. The harness is what made \"draft a reply and attach the schedule\" possible. Without it you would be pasting the thread into a chat box, downloading the schedule yourself, and hoping you remembered to say who the reader is.

Function

What a harness actually does

Six jobs. MAUDE does all of them. A smaller harness can do three of them and still be worth building.

Packs the window

Puts the brief and this run's source in front of the model. In MAUDE that includes a filtered tool list so 170 tools do not land in every prompt.

Offers tools

Named actions with schemas and limits. Mail, files, shell, browser, GitHub. The model asks. The gateway runs the call or says no.

Runs the loop

Look, act, check, stop. Multi-step work in MAUDE is not one reply. It is tool calls until the job is done or a cap is hit.

Keeps a trail

Which model, which tools, what came back, how long. You can read a bad run. You do not have to reconstruct it from a chat.

Checks the result

Against a finished state you wrote, or a person at a checkpoint. MAUDE can hold sensitive steps for approval instead of firing them.

Hands it back

The same answer on a terminal, a phone, or the web. The harness owns the clients. The model does not.

Build

How to build one

Do not start by cloning MAUDE. MAUDE is a daily driver with 170 tools and five clients. That is years of wrapping. Start with one job. Write the brief. Give the model one or two tools. Check the output against something you wrote down. Log the calls. Run it a second time on a new example. If that works, you have a harness. You can add tools later.

The parts below are the same parts in MAUDE. On a first harness, most of them are a Python script and a folder of files. That is enough.

Part 01

Name the job

One task with a finished state you can check. Not a topic. Not a chat.

In MAUDE this is a request that can actually finish: triage today's mail, open a pull request, write a weekly summary from notes on disk. If you cannot say what file, table, or yes/no comes out the other side, you do not have a job yet.

  • Write the task in one sentence, then write what done looks like: a file, a table, a pass/fail, a length, a reader.
  • If the only measure is "does this sound good," you will not know when to stop, and neither will the model.

Part 02

Write a brief that does not change every Tuesday

The standing instructions. The model reads these before it sees today's source.

MAUDE keeps system instructions and tool descriptions on the server, not in whoever typed the last prompt. The user says what they want. The gateway already knows how to talk to models, which tools exist, and what the model is not allowed to invent.

  • Say the task, the reader, the constraints, and what the model is not allowed to make up.
  • Keep it in a document you can version. Do not bury it in a thread you will lose.

Part 03

Decide what goes in the window

This run's source: files, notes, schema, last output. Nothing else.

MAUDE does not dump 170 tool descriptions into every message. It filters tools by what you asked, so the model only sees the ones that might matter. That is context on purpose. Paste the whole drive and the model will sound fluent while missing the page that mattered.

  • If a fact is not in the window, the model cannot use it. It will fill the gap with a likely-sounding sentence.
  • Put in the source this job needs. Leave out the rest.

Part 04

Give it tools with names and limits

Search, read, write, query — each with an input shape and a permission. Not an open shell to the machine.

MAUDE's tools run on the server: files, shell, browser, GitHub, Gmail, Drive, calendar, image generation. The model does not reach into the machine. It asks. The gateway runs the call or refuses it. Sensitive steps can wait for a person. The call, the arguments, and what came back get logged.

  • Each tool has a name, an input shape, and a permission.
  • A tool you cannot inspect is a hole. If you cannot say what it did, you cannot debug the next miss.

Part 05

Run a loop that can stop

Look, act, check, stop. Someone has to decide when the model may call a tool, when a person must look, and when the run is finished.

When MAUDE works a multi-step job it does not send one reply and quit. It calls a tool, reads the result, calls the next one, and keeps going until the job is done or a budget hits. Subagents and execute_plan do that with inherited tools. Docker isolation and step/token caps keep a long job from wandering overnight.

  • A single reply is not a loop. Work that uses tools needs a stop condition.
  • Put a cap on steps, tokens, and time. A run that cannot stop is not a method. It is a chat that got away from you.

Part 06

Check the result and keep a trail

Score against the finished state you wrote. Keep enough log to replay the run.

MAUDE can show traces: which model ran, which tools fired, what they returned, how long it took. Power users open that. Casual users see the answer. Either way the trail exists, so a bad run is something you can read, not a vibe you remember from a thread.

  • Check against the done state you wrote: a test, a diff, a spec, a person at a checkpoint. Not against whether the prose sounds sure of itself.
  • Log what the model saw, what it called, and what came back. If you cannot replay it, you cannot fix it.

Scale

You do not need 170 tools

A first harness might be: a standing prompt, a folder of source files, one function that searches that folder, a second function that writes a draft to disk, and a third that diffs the draft against last week's. Run it twice. If the second run still matches the spec, you have something you can hand to a teammate.

MAUDE grew because the jobs grew. Mail, calendar, GitHub, a phone client, a local model that never leaves the Spark. The anatomy did not change. There is still a job, a brief, a window, tools, a loop, and a check. There is just more of each. If you copy the size and skip the anatomy, you get a chat box with extra buttons.

Read the MAUDE case study if you want the full stack. The lesson here is the wrap, not the hardware.

Next

If you want this for your team, email me.

Introduction to AI if they have not used a model at work yet. The Anatomy of a Harness if they already draft and need a process they can run again. Email matt at sleektiki dot ai.

The Anatomy of a Harness | sleektiki.ai