Results and verdicts
How a run ends, what output and data mean, structured output with a schema, the judge, and the runtime's signals.
The agent's verdict
A run ends when the agent calls done(success, output).
success: truerecords the run succeeded withoutput.success: falserecords it failed with error codetask_failedand the agent's account inoutput.
The platform records the verdict as the agent gave it; it does not verify it. Read output as the agent's own report.
Structured output
A run created with output_schema — an object JSON Schema in the bounded subset below, at most 8 KiB — asks for done(success, output, data) with data in that shape. Data that does not satisfy the schema is handed back to the agent as output_schema_violation with the validator's detail; the accepted data (≤ 64 KiB) is the run's data.
{ "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "number" } }, "required": ["name", "price"] } } }, "required": ["items"], "additionalProperties": false}Supported keywords: type, properties, required, additionalProperties, items, enum, const, description, title, minimum, maximum, minLength, maxLength, minItems, maxItems, anyOf, oneOf. Roots must be objects; $ref, formats and patterns are refused with invalid_request.
The schema is a session property: a follow-up run inherits it, and one that names a different schema is conflict.
The judge
A run created with judge: true gets a second model reading after done: judgment on the run and a run.judged event.
{ "verdict": "pass", "reason": "The output lists the three products with the prices shown on the page.", "blocked": false, "impossible": false, "judged_at": "2026-09-22T10:14:02.000Z" }| Field | Meaning |
|---|---|
verdict | pass, fail or uncertain |
reason | The judge's one-paragraph account |
blocked | A captcha, login wall, access denial, rate limit or bot detection stood in the way |
impossible | No agent could have completed the task as stated |
The judge reads the task, your judge_context (up to eight statements of ≤ 500 characters, weighed before everything else and never shown to the agent), the agent's verdict and output, the steps the run took, and the final page as the agent last saw it — the viewport image too, on a vision-capable connection. It does not change the run's status. Its request is counted in usage and reported as agent.usage with source: "judge".
When the agent does not finish
The runtime makes sure a verdict is asked for:
max_turnscounts action turns; the request after the last one is the verdict turn, on which every tool butdoneis refused (verdict_required).- Five consecutive tool errors bring the verdict turn forward.
- An agent that replies in prose without calling
doneis asked once, in a user message, to call it.
A verdict turn that passes without done ends the run failed: agent_limit when the action or failure budget brought it, agent_incomplete when a prose reply did.
The runtime's notices — remaining budget from 75% of max_turns, the last action turn, the failure budget, a repeated action, a page that stopped changing — appear as [notice] lines at the end of the tool outputs in agent.tool_result events.
Signals
The run records what fired in signals:
| Signal | Meaning |
|---|---|
turns, max_turns | Action turns used and allowed |
budget_notices | Budget warnings shown |
loop_nudges, stagnation_nudges | Times the agent was told it was repeating itself, or that the page stopped changing |
failures_max | The failure budget was reached |
verdict_turn | none, cap, failures or prose — what brought the verdict turn |
verdict_followed | Whether the agent called done on it |
Usage
usage on the run sums every model request the run made — the agent's turns, the one that produced done, extraction requests, compaction and the judge: requests, total, output, cache_read, cache_write tokens. The same numbers feed Usage and billing.
