Measuring a prompt change
evaluate is the one subcommand that is not a layer, and it is outside the graph deliberately.
It re-runs the chain into a temporary tree and scores the result against the committed claim
files, so its subject is the prompt set rather than any paper, and it produces nothing another
layer consumes. There is no version of a paper here to be current or stale.
elife-extract evaluate --reference-dir ../claims/ --work-dir /tmp/eval --all
elife-extract evaluate --reference-dir ../claims/ --work-dir /tmp/eval --paper kammer-2026-foveal-feedback
elife-extract evaluate --reference-dir ../claims/ --work-dir /tmp/eval --papers a,b,c
| Flag | Purpose |
|---|---|
--reference-dir |
The corpus to score against — normally claims/ |
--work-dir |
Where the temp extraction and the scorecards go |
--paper / --papers / --all |
Which papers |
--no-external-review |
Score the chain without the Opus pass |
--skip-existing |
Reuse scorecards already under --work-dir, so a sweep is resumable |
The round-trip
For each paper: read the reference index.md for the DOI, run prepare → the three readers →
reconcile → optionally external-review → write into the temp tree, then align the fresh claims
against the committed ones and score.
The alignment is the part that needs explaining. Two claim sets about the same paper will not share wording, so the matcher is itself a model call: it pairs claims by content and reports each pair as exact or partial. That means the scores are measured by the same kind of system being measured, which is a real limitation and the reason recovery is the metric to trust — it asks whether a reference claim was found at all, which is the least model-dependent judgement in the set.
Four numbers come out:
| Metric | What it asks | Threshold |
|---|---|---|
| Claim recovery | Does every reference claim have a corresponding extraction? | ≥ 80% |
| Role agreement | Do the two agree on what the claim is doing in the argument? | ≥ 75% |
| Panel agreement | Do they anchor it to the same panel? | ≥ 90% |
| Match quality | Exact versus partial content pairing | — |
Per-paper scorecards land at <work-dir>/<paper>/scorecard.json, and an aggregate at
<work-dir>/aggregate-scorecard.md.
What the sweep found
These are measurements of a run, not counts of the corpus, so they are written down here rather than generated — with the date and configuration that produced them, because that is what makes a measurement readable later.
Sweep of 2026-05-11. Three Sonnet 4.6 readers, Opus 4.6 reconciler, Opus 4.6 external reviewer on the seven-bias prompt, against the ten public eLife papers.
| Metric | Mean | Median | Threshold | |
|---|---|---|---|---|
| Claim recovery | 96.9% | 100.0% | ≥ 80% | pass |
| Role classification | 83.1% | 84.3% | ≥ 75% | pass |
| Panel assignment | 60.9% | 58.6% | ≥ 90% | fail |
Recovery passes by a wide margin and its median is 100% — on half the corpus, every reference claim has a corresponding extraction, and the worst paper still reaches 87%.
The chain these numbers measured is the one that runs today. Re-run the sweep after any prompt change before trusting them again — that is what the tool is for.
Panel agreement is the standing failure
It is also the one whose failure is least what it looks like. The Caption-reader extracts one
claim per panel. The curator often anchors one claim to several — panel: fig4, fig5. When the
matcher pairs a single-panel extraction against a multi-panel reference it scores a panel
mismatch even where the content is identical.
So the CLI is not putting claims at the wrong panel. The disagreement is about granularity, and the metric cannot see the difference. Two prompt changes would lift it — instructing the Caption-reader to preserve multi-panel anchors where the caption spans panels, or instructing the reconciler to consolidate per-panel emissions that share content — and neither has been tried, because both are testable here first and neither has been.
Three papers lag on role, for three different reasons
| Paper | Role | What is hard about it |
|---|---|---|
| kammer (foveal feedback) | 57% | Heavy control usage the reviewer prompt did not recognise |
| rozak (neurovascular DL) | 65% | A methods paper, where prompts calibrated on biology findings fit badly |
| scheller (self-prioritization) | 70% | interpretation versus synthesis is judgment-heavy in cognitive papers |
These are not one problem with three instances. Only the first is a prompt bug.
The iteration discipline
This is what the tool is for. Change one thing, re-run, diff the aggregate, decide — so that a prompt revision is a measurement rather than an impression.
The worked example is kammer. Role agreement sat at 57%, the lowest in the corpus, and the
scorecard said why: claims the reference marked control were coming back as empirical. One
addition to the external-reviewer prompt, teaching it to recognise implicit controls, moved
kammer from 57% to 71% — and, re-run across the corpus, moved the aggregate role mean from
78.1% to 83.1% without costing anything on recovery.
Two things in that are worth keeping:
The change was targeted at a diagnosis, not at the number. The scorecard named a role confusion on a specific paper; the prompt edit addressed that confusion. Editing prompts until an aggregate rises is how you fit the prompt to the reference corpus rather than to the task, and the corpus is ten papers.
And it was re-run corpus-wide before being kept. A change that lifts one paper and costs three is common, and only visible at the aggregate. 71% is still below the 75% threshold; kammer was kept as a known miss rather than iterated at until it passed.
What it cannot tell you
evaluate scores agreement between two claim sets. It is silent about anything neither set
contains — you can score 100% agreement on a third of a paper.
That is a different question, and coverage is what asks
it: it takes its denominator from the paper rather than from the claim set. The two are
complementary and neither substitutes for the other. Gädeke's Figure 2 panels C and F — a
failed replication that no claim represented — would have scored perfectly here, because
neither set mentioned them.
Cost
A full ten-paper sweep with external review is roughly $70 and two to three hours sequentially.
--skip-existing makes it resumable, which matters more than it sounds: a sweep that dies on
paper eight should not have to redo the first seven.