The judge is in beta. The concept below is stable; the interface for reporting
a failure yourself is still being finalised, so talk to us before building
against it.
Where a failure comes from
The eval contract
A scored example the route got wrong. This is the strongest signal, because
the correct answer is known.
The judge
A model scoring production outputs against the task’s definition of correct,
where no reference answer exists. In beta.
Your application
A call your own code or your users rejected: a retry, an edit, an escalation
to a human, a thumbs-down.
Hard failures
Malformed output, a schema that did not parse, a tool call that could not be
executed. No judgement needed, these are simply wrong.
The judge
Most production calls have no reference answer. Nobody wrote down what the correct reply to a specific customer message was, so a score cannot be computed by comparison. The judge fills that gap: a separate model that reads the task’s definition of correct, the input and the output, and decides whether the output satisfies it. It runs over traces out of band, so it does not add latency to your calls, and it never gates a production response. This is why it is in beta. We publish what a judge agrees with humans on before we ask anyone to trust it, in the same way the benchmarks publish the runs that lost.Why failures are the training signal
A task that routes down to a cheaper model and stays correct is finished. A task that cannot route down is the interesting one, and the question is always the same: what specifically does the cheap model get wrong that the expensive one gets right? Failures answer it. Clustered failures are a repair map:- Clustered by input shape. One document layout, one language, one edge case. Often fixable with output constraints or a prompt change, no training run.
- Clustered by output mode. Valid content in an invalid shape. Usually the cheapest class of failure to fix.
- Scattered with no pattern. The model does not have the capability. This is the case where a specialist model trained on the task’s own traces is the answer.
What this looks like in practice
Failures accumulate per task alongside the trace corpus. When a task has enough of them to be worth acting on, they come back as a grouped set with the pattern named, rather than as a list of individual bad calls. Nothing here changes your integration. Keep sending labelled completions.How routing uses all this
Why a route is never promoted on price alone.