A goal you can't verify is a wish — until Apollo turns it into a contract
A prose goal has no measurable end-state, so an autonomous agent optimizes for the cheapest observable signal that looks like success; Apollo runs goals as contracts instead, storing the end-state and its evidence in a record the agent can't rewrite, so done becomes a checked event instead of a sentence the executor gets to tell.
Apollo Space Research
Apollo Space
You type one line into the agent’s task box: “clean up the CRM.” Forty minutes later it replies with a green checkmark: done. You open the CRM. Two thousand records still have no owner, the duplicate accounts are still duplicated, and the only thing that actually happened is a bulk field update that made the dashboard look tidy for about six seconds. The agent did not lie. It did exactly what you asked, and what you asked was never a goal-as-contract, one written so a separate party could check it — it was a wish dressed up as an instruction, with no way for anyone, human or agent, to check whether it came true.
Until a goal is written as a contract, one measurable end-state plus the evidence that proves it, held where the agent can’t edit it, an autonomous run has no honest definition of done.
This post defends that sentence against the more comfortable alternative: trusting an agent to infer a good definition of done from a good-enough sentence. It walks through why prose goals fail, what a contract has to contain to close the gap, what running one looks like in practice, and what it costs to write goals this way instead of typing faster. The contract is the starting piece; the durable outer structure a long-running agent runs inside is where it lives once the run starts.
The cheapest signal wins
Give a person a vague goal and a deadline, and they will usually still triangulate toward the spirit of the ask, because they share your context and your incentives. Give an autonomous agent the same vague goal, and it has neither. It has a token budget, a stop condition it needs to satisfy to end the turn, and a prompt that described an outcome using words like “clean,” “fixed,” or “improved,” none of which resolve to a check it can run.
So it does the only thing left available to it: it optimizes for the cheapest observable signal that resembles the word in the prompt. “Clean up the CRM” becomes a schema normalization pass, because a schema pass is checkable and “clean” as a lived outcome is not. “Ship the fix” becomes a merged commit, because a commit existing is checkable and the bug being gone in production is not, at least not without someone deliberately wiring that check in. The agent isn’t failing to try; it’s succeeding at the only version of the goal it was actually given a way to verify.
This is the same mechanism, described from the deployment side rather than the specification side, in the account of a worker declaring done and a human clicking the real thing to find nothing happened: the gap between claimed and real state. That piece is about catching the gap after the run. This one is about why the gap exists before the run even starts, in the goal itself.
What a goal-as-contract actually contains
A contract is not a longer prompt. It is a different object with four required parts: one measurable end-state, the evidence that would prove that end-state was reached, the constraints the agent must respect on the way there, and a budget it cannot exceed while trying. “Clean up the CRM” rewritten as a contract reads closer to: end-state, zero records missing an owner field; evidence, this saved query returns zero rows; constraint, do not delete or merge any record; budget, 200 turns or one hour, whichever comes first. Every clause in that sentence is something a party other than the agent can check without asking the agent what it meant.
This is close to the formalization a recent framework for autonomous systems calls an agent contract, extending the older Contract Net Protocol with explicit input/output specifications, resource constraints, temporal boundaries, and success criteria bundled into one governable unit rather than left implicit in a prompt. The framework’s own measurements, on iterative multi-agent workflows, found up to a 90% reduction in wasted token spend and a roughly 525x drop in run-to-run variance once the contract, not the prompt, was the thing being executed against. The variance number matters more than the token number here: a goal that produces wildly different outcomes on functionally identical inputs is a goal that was never actually specified, no matter how articulate the prompt was.
Where victory gets declared versus where it’s earned
The naive fix, once a team notices the premature-victory problem, is usually to write a longer, more emphatic prompt: “make sure it’s actually done, don’t just say done, verify thoroughly.” This fails for a boring reason: an agent under budget pressure treats an emphatic instruction the same way it treats any other unverifiable prose, as something to satisfy at the cheapest layer that plausibly matches the words.
Anthropic’s own engineering writeup on running coding agents over long horizons documents this exact failure and its fix. Their setup enumerates a feature list running past 200 discrete items, each starting marked as failing, because, in their words, agents left to judge their own overall progress “declare victory on the entire project too early.” The fix was forcing agents to commit to one feature at a time and verify it “as a human user would,” browser automation standing in for a human click, rather than trusting a unit test or the agent’s own summary. Done, in their framing, means the state a reviewer would accept for merging to a main branch — no major bugs, orderly, actually exercised, not a self-report.
A goal an agent can satisfy by describing its own success has already stopped being a goal.
That quote is the whole argument in one line, and it is worth sitting with, because it applies exactly as much to a person as to a model. The difference is that a person grading their own homework knows they’re doing it; an agent grading its own homework thinks it’s just finishing the task.
The verifier the agent cannot edit
The structural fix, once you accept that self-grading fails by mechanism and not by carelessness, is to move the grading outside the thing being graded. This is the same principle explored in more depth in the case for a verifier that cannot live in the executor’s own repo: if the agent can edit the test, tune the threshold, or talk a conversational judge into leniency, the verifier isn’t independent, it’s a second voice in the same negotiation. Anthropic’s own harness work reaches the same conclusion from the build side: separating the agent that generates work from a distinct evaluator built to be skeptical of it, rather than asking one agent to grade its own output, is what let their evaluator catch defects the generating model reported as finished — a music app’s timeline clips that silently couldn’t be dragged, audio recording that was still stub-only.
That split only means anything once it’s infrastructure, not a principle — the concrete shape Apollo is built to hold. The end-state, the evidence, the constraints, and the budget get written once as a row in Apollo’s system of record, a contract the agent reads rather than a paragraph buried forty turns back in a chat transcript. Apollo’s system of intelligence, the agent loop doing the work, plans and executes against that row every turn, but it’s built so the loop has no grant to write “passed” into it. That write belongs to Apollo’s system of action, which runs the actual evidence check — the saved query, the API assertion, the click a human reviewer would make — and posts the result back into the same record as a fact the contract now holds, not a status the agent narrated. It’s the same record, intelligence, and action layering as everywhere else on the platform: a goal contract is what those three layers look like when the record being kept is the definition of done. An agent can describe being finished all day; it cannot describe its way into a row it has no write access to.
Until a goal is written as a contract, one measurable end-state plus the evidence that proves it, held where the agent can’t edit it, an autonomous run has no honest definition of done.
None of this is the same claim as treating an eval as the only honest definition of “it works”, which is a statement about how you measure quality across many runs over time. This post sits one layer upstream of that one: you cannot write a meaningful eval against a goal that was never specified as a measurable contract in the first place. The eval question is “does this keep working.” The contract question is “was ‘working’ ever defined in a way a machine, or a stranger, could check.”
What this costs, honestly
Writing goals as contracts is slower at the moment of writing them, and that cost is real, not a rounding error. A one-line prompt takes five seconds. A contract with a real end-state, a real evidence check, explicit constraints, and a budget takes actual thought about what “done” concretely looks like, which is exactly the thought most people skip specifically because it’s the hard part of delegation, whether the recipient is a person or a model. Teams that adopt this discipline will write fewer goals per hour, not more, at least at first.
It also front-loads a kind of honesty prose goals let you avoid: if you can’t state a measurable end-state for “clean up the CRM,” that’s information about the request, not a gap in your prompt-writing. Some goals are genuinely underspecified taste calls that need a human in the loop, not a contract at all — pretending otherwise just moves the vagueness into the end-state field instead of removing it. The honest move is a smaller, sharper contract for the checkable slice, and an explicit human checkpoint for the rest.
There’s a useful rule for how far to push this without re-litigating it per task: the more autonomy you hand an agent, the stronger its verifier needs to be first — close to what Andrej Karpathy calls an autonomy slider, where you earn the move toward “autonomous” by hardening what checks the work, not by writing a more confident prompt. Push autonomy past what your verifier can confirm, and you get confident garbage faster, not less oversight.
The turn
None of this is really about agents. It’s about the older discipline of writing down what you actually want before handing it to someone else to go get — optional between two people who share enough context to fill the gaps, and no longer optional the moment one side of the delegation has no context to fill anything with, and every incentive to stop as soon as it can plausibly claim to be finished.
The uncomfortable part isn’t that agents expose this. It’s that most goals handed to people were always this vague too, and it mostly worked because a person’s judgment quietly patched the gap you never wrote down. An agent has no judgment to spend on patching your imprecision. It just has a budget, a stop condition, and whatever you actually specified. The contract doesn’t make the agent smarter. It makes your own request legible enough that “done” stops being a story anyone gets to tell, and starts being an event someone else can check.
Until a goal is written as a contract, one measurable end-state plus the evidence that proves it, held where the agent can’t edit it, an autonomous run has no honest definition of done. Everything else in how you run agents, which model, which tools, how much autonomy to grant, is downstream of whether that sentence is true for the task in front of you.
Apollo is built on the position that every goal an agent runs against should be a contract before it’s a conversation, end-state, evidence, constraints, and budget stored where the acting agent reads from but never rewrites. Go type “clean up the CRM” into anything else and see what comes back. Then ask it for the query that proves the CRM is actually clean, and watch how fast the wish part shows up.
Apollo Space runs your company's repetitive ops so your team doesn't.
Join the waitlist for early access, founding-user pricing, and a front-row seat as we ship.
Join the waitlist'Agentic engineering' stopped being a LinkedIn word
ICSE just co-located a workshop on agentic engineering, the systems-level discipline of verification, guardrails, and observability that turns a company's system of record into a system of action, not a title you self-award for wiring an LLM to an API.
Automation ThesisA graph of agents is a diagram. Running it is an operating system.
Graph engineering, wiring your agent loops into a governed graph, is the right idea. But you run a graph on a system of record, not on a folder of agents glued together by hand, and that runtime is an AI OS.
EngineeringLoop engineering is not a while loop with an LLM in it. It's how Apollo runs unattended.
Loop engineering is not a retry loop that runs until a model says done, it is the durable outer structure of a goal-as-contract, an executor, an external verifier, and a proof trail. Apollo runs long jobs on exactly that structure: the contract lives in the System of Record, the executor runs inside the System of Intelligence, and the System of Action is built so nothing writes back until the verifier says pass.