Most definitions of “agent” are either too vague to act on or too technical to start from. So here is one definition told three times — to a child, to a decision‑maker, and to the person who has to build it. Read whichever one you need. They do not contradict each other; they stop at different places.
An agent is something you give a want to, instead of a list.
Imagine you are thirsty.
A talking machine tells you where the kitchen is. It is very good at telling. Ask again and it tells you again, just as nicely. You are still thirsty.
An agent goes to the kitchen.
That is the whole difference, and everything else is detail. One tells you. The other goes.
Now the interesting part. It gets to the kitchen and the tap is broken. Nobody told it anything about broken taps. So it looks around, spots a bottle in the fridge, and brings you that instead. Nobody gave it that step. It made the step up — because it knew what you actually wanted, which was water, and not what the instructions were about, which was the tap.
That is the thing worth understanding. You gave it a want. It filled in the steps.
And here is the part grown‑ups skip. Someone who makes up steps might also decide to climb on the counter. It got you the water. It also broke a plate. You never said “don’t climb.” You only said you were thirsty.
So your job changes. You stop saying do this, then this, then this. You start saying this is what I want — and these are the things you may never touch.
Saying what you want is easy. Knowing everything it must never touch is the hard part, and it is the whole job.
An agent is software you hand a goal to, which then decides for itself what to do next.
Three things have to be true at once:
Take away any one and you have something else. Take away the loop and you have a script with a language model bolted on.
Notice what is not on that list: being clever. The same model, on the same problem, is a chatbot when it must ask you between each step and an agent when it must not. What changed was not its capability. What changed was how many decisions you allowed it to take before you looked.
That framing matters because it tells you where the risk is. The useful question is never “is this an agent.” It is: how many decisions does it take between my instruction and my review? One is safe and slow. Four hundred is fast, and is where the surprises live.
Which brings up the cost nobody prices in. Your job moves from checking output to checking behaviour. You can read one article. You cannot read four hundred decisions. So the system has to report on itself — and that report has to be something it cannot quietly fake. An agent whose only account of its own work is its own summary of its own work is not audited. It is unsupervised.
This site is the worked example. The auditor agent rejected two articles. The pipeline published them anyway, because the verdict was recorded and never enforced. The system had a report. It just had no teeth. The gate is enforced now, the two articles were withdrawn, and the episode stays in the record instead of being quietly deleted.
What agents are genuinely good at: work with many small steps, clear success conditions, and cheap mistakes.
What they are bad at: anything where being wrong is expensive and being wrong is hard to notice.
An agent is a control loop in which a language model chooses the next instruction.
Strip the marketing off and it is about fifteen lines:
history = [goal]
while not done(history):
step = model(history) # an answer, or a tool call
if step.is_answer:
return step
result = execute(step.tool, step.args) # touches reality
history.append(step)
history.append(result)
That is it. Everything else is harness — and the harness is where the engineering actually lives.
| Component | What it is | How it fails |
|---|---|---|
| Reasoning core | the model call | picks a plausible wrong action, confidently |
| Tool surface | the functions it may call | vague schemas, and errors that read like success |
| State | the history fed back each turn | grows every turn; cost and latency grow with it |
| Stopping condition | done() | absent, so the loop runs until the budget dies |
| Guardrail | what it may never do | advisory instead of enforced |
In roughly the order you will meet them:
except Exception: pass returns success, the model believes it, and the agent builds three more steps on a foundation that is not there.The model decides what to do. Code decides what is permitted. Never put a constraint only in the prompt: a prompt is a request, a check is a guarantee.
Measured on this site. The banned‑word list lived in prompts for four months and was broken 51 times across 35 files. It moved into ten lines of Python and stopped being broken. Nothing about the model changed.
And when you go looking for evidence that one setup beats another, read benchmark scores as evidence about the benchmark first, and about your work second.
The glossary defines every term this site runs into, one or two per publishing run. A day at the paper follows the team that produced this page, from the first story of the morning to the last.
If you would rather have this taken apart in a room, with the machine open and the failures on screen, that is what the training is.