Verifiable benchmark · one eval, end to end

How a benchmark grades an agent

txbx_org_organoid_doseresponse_resistant_fraction

image_analysis stage: S9 · translational grader: numeric_tolerance 4 models scored

01 · The task

What the agent is asked to do

The agent is handed one image — a 3×3 montage of brightfield organoid wells: three vehicle (untreated) controls followed by a six-point ascending dose series of a single compound, imaged after seven days of treatment. It must return exactly two numbers, as JSON, inside an <EVAL_ANSWER> tag:

# the structured answer the agent must emit
{
  "ic50_dose_level": <int 1–6>,          # lowest dose where viable response ≤ 50% of vehicle
  "resistant_population_present": <0 or 1>  # 1 if viable organoids persist at the top dose
}

It reads like "estimate an IC50 from a picture," but the real test is whether the agent can separate live signal from artifacts before it counts anything.

02 · The data

What the agent sees

Viability falls as dose rises. Half-maximal response first appears at Dose 3 — that's the IC50 level — and by Dose 6 nothing viable remains, so no resistant population. The ground truth is readable straight off the plate.

V vehicle control D1–D6 ascending dose amber outline — the two panels the answer hinges on

03 · The grader

How the answer is scored — deterministically

No LLM judge, no human. The grader is a small declarative spec. Here it's a single numeric_tolerance node with a tolerance of 0, so each field must match ground truth exactly.

{
  "type": "numeric_tolerance",
  "config": {
    "tolerances": {
      "ic50_dose_level":             { "type":"absolute", "value": 0 },
      "resistant_population_present": { "type":"absolute", "value": 0 }
    },
    "ground_truth": { "ic50_dose_level": 3, "resistant_population_present": 0 }
  }
}
Why this matters. Because the correct answer and the checking logic are data, grading is reproducible and cheap. The same spec scores every model identically — the agent is the variable, the grader is fixed.

04 · Failure-mode taxonomy

The mistakes this eval is built to catch

Separately from the grader, each eval is tagged with failure-mode labels from a shared, versioned taxonomy. They don't affect pass/fail — they let the benchmark ask "which kinds of mistakes do models make most?" across all evals. For an image/IC50 task, the relevant families are:

subset_scope_compartment
Counting the wrong objects — e.g. treating dead debris or a plate artifact as viable organoids, inflating survival at high dose.
metric_statistic_mismatch
Summarizing with the wrong quantity — e.g. using raw pixel area instead of viable-organoid signal, so the dose-response curve is distorted.
causal_epistemic_overreach
Claiming more than the image supports — e.g. asserting a resistant subpopulation from noise rather than a defended viable count.

05 · The runs

Four frontier models attempt it

Each model runs inside an agent harness with tools (Bash, Read, code execution). The grader then scores whatever it submits.

ModelHarnessSubmittedVerdict
Claude Opus 4.8claude-code{3, 0}PASS
GPT-5.5openai-codex{3, 1}FAIL
Gemini 3.5 Flashpi— (no answer)FAIL
Grok 4.3pi— (no answer)FAIL

Ground truth was {ic50_dose_level: 3, resistant_population_present: 0}. One model cleared it.

06 · Inside the winning run

What the passing agent actually did

Claude didn't eyeball the montage — it wrote Python (PIL, NumPy, SciPy) and reasoned its way past the traps.

  1. Segment. Wrote code to threshold and label objects in each panel, aiming to quantify viable biomass per dose.
  2. Catch the artifact. A ~2,800-px "object" appeared in every panel — but it had uniform intensity, spanned the whole panel, and was only ~1% filled. That's the panel border frame, not an organoid. Counting it would force resistant_population_present = 1. It excluded the frame.
  3. Viable vs. debris. Separated genuine organoids (large, compact, textured, brighter) from dead fragments that proliferate under treatment and would inflate raw area.
  4. Verify visually. Saved a side-by-side strip of vehicle vs. high doses and read it back to confirm the quantification matched the picture.
  5. Submit. Viability crosses 50% at Dose 3; nothing viable survives at Dose 6 → {3, 0}.
The whole point in one line. The task looks like reading an IC50; it actually measures whether the agent avoids the frame-artifact and debris confounders that produce a confident wrong answer.

07 · Reading the failures

Three different ways to fail

The four runs surface the three failure surfaces every benchmark has to distinguish — and only the first is a biology mistake.

Correct
Claude Opus 4.8
Recovered {3, 0} — matched ground truth exactly.
Wrong science
GPT-5.5
Got the IC50 right but claimed a resistant population at the top dose ({3, 1}). A clean, interpretable error.
Non-compliant
Gemini 3.5 · Grok 4.3
Never emitted a parseable answer — only echoed the template. The extractor's job to catch, not the grader's.

Takeaways

  • An eval is a bundle: a task, the input data, a deterministic grader, and failure-mode tags — the grader is the only part that decides pass/fail.
  • Ground truth + a grader = verifiability. No human or model judge needed; every run is scored identically and reproducibly.
  • Answer extraction is part of validity. Many "model failures" are really format failures; how you parse the submission decides whether a model is credited fairly.
  • The hard part is the confounder. A good eval rewards the agent for handling the trap — and the grader proves it did.