Skip to main content
manifest.json
A verifier decides whether a task was completed. It is always a reference to something that already owns that answer — never something the platform implements.

The three kinds

There is deliberately no fourth kind, and in particular no built-in.
The last time this repository grew a built-in scorer, it wrote its own simulation pipeline with its own weights, arrived at a different judgement from the evaluation side, and had to be reverted whole. A verifier living in the control plane would be a second definition of “correct” no matter how small it started, and the two definitions would disagree exactly when it mattered.

Contracts

Whatever the kind, the resolved verifier looks the same from the platform’s side:
Two arguments: the task, and whatever the harness submitted as the trajectory. One return: a reward.
The platform judge scores the trajectory against the named rubric version. It receives the task’s prompt, the flattened trajectory text, and the task’s reference if there is one.The trajectory is flattened for you — a string stays a string, a message object contributes its content or text, and a list is joined. Harnesses differ in shape and the verifier contract is about what the model produced, so the folding happens once here rather than in every author’s code.

A failed verification is an error, never a zero

If your verifier cannot answer — the endpoint is down, the module will not import, the rubric is gone — the platform raises. It does not report a reward of 0.0.
This is the single most important rule for anyone writing a verifier, and it is worth being blunt about why: a silently zeroed reward is indistinguishable from an answer that was actually wrong. A training run whose verifier quietly broke at step 400 would keep producing a reward curve, keep looking plausible, and teach the model from noise for the remaining hours of the job. So in your own verifier code:
Errors are wrapped as VerificationError with the reference that failed, so the job log names which verifier stopped and why.

Picking one

Use a rubric

When correctness is a matter of judgement — quality, tone, whether an explanation is sound. Also when you want the same standard to score both training rewards and benchmarks.

Use a plugin

When correctness is computable and the computation is cheap and local: an exact match, a parser, a unit test.

Use an endpoint

When something already decides this — a compiler service, a simulator, an internal grading system. Do not reimplement it in a plugin.