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.
Enablement · Lesson
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
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
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
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
Six jobs. MAUDE does all of them. A smaller harness can do three of them and still be worth building.
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.
Named actions with schemas and limits. Mail, files, shell, browser, GitHub. The model asks. The gateway runs the call or says no.
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.
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.
Against a finished state you wrote, or a person at a checkpoint. MAUDE can hold sensitive steps for approval instead of firing them.
The same answer on a terminal, a phone, or the web. The harness owns the clients. The model does not.
Build
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
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.
Part 02
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.
Part 03
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.
Part 04
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.
Part 05
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.
Part 06
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.
Scale
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
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.