How many cheap research runs equal one expensive one?

Published

Project article; see sources and editorial standards.

The question

Every concept pack in this estate is written by a /dr research run: an agent reads the web, writes claims with sources, and a separate blind gate re-fetches the cited pages and marks each claim SUPPORTED, UNVERIFIED, NOT-IN-SOURCE or CONTRADICTED. The run has two dials that set its price: the model and the effort level. Fable 5.1 at max costs about $3.70 a concept. Haiku 5.5 at medium costs nine cents.

The obvious question is whether the cheap dial, turned several times, adds up to the expensive one. If five Haiku runs on the same concept, merged, equal one Fable run, the frontier queue of several hundred unresearched concepts gets forty times cheaper. If they do not, it matters what is missing, because “more claims” and “better claims” are not the same thing, and a queue manager that pays for the wrong one is wasting money either way.

This post reports three experiments on one concept, 47 Claude research runs in all, and ends with the buying rule they imply. Everything is reproducible from the two scripts in the sources list; the raw per-run data is committed.

The setup

One concept throughout: “SQLite WAL checkpointing” (topic “SQLite write-ahead logging”), depth standard. It is a good test concept because the answer space has a shape. There is a docs tier (wal.html, the pragma pages, the C API), a postmortem tier (Tailscale’s WAL-reset outage, Antithesis’s and Canonical’s reproductions, the 3.51.3 fix), and an internals tier (wal.c, the wal-index format, the wal2 design doc). A shallow run stops at the first tier.

“Covered” is the strict measure and the one that matters for a pack someone will query. Fable’s claims tend to pack a condition, an exact API behaviour and a number into one sentence: with synchronous=NORMAL in WAL mode the checkpoint is the only sync point, so a transaction can roll back after power loss. A user with a production WAL problem needs that conjunction, not its three headlines.

Experiment 1: one run per model and effort

Twelve Claude cells, one run each (the full matrix also had OpenAI, Antigravity and local lanes; this post keeps to Claude).

Model Effort Research s Claims High-conf Sources Gate $
Haiku 5.5 low 174 12 5 5 10/10 0.08
Haiku 5.5 high 211 15 11 7 9/10 0.12
Haiku 5.5 max 984 26 16 10 10/10 0.46
Sonnet 5.5 low 66 8 1 3 9/10 0.24
Sonnet 5.5 high 158 14 7 7 10/10 0.45
Sonnet 5.5 max 948 39 24 16 10/10 2.43
Opus 5.5 low 87 9 5 7 9/10 0.40
Opus 5.5 high 161 15 8 8 10/10 0.77
Opus 5.5 max 919 28 22 16 10/10 3.12
Fable 5.1 low 166 13 10 6 10/10 1.69
Fable 5.1 high 257 21 10 9 10/10 2.04
Fable 5.1 max 534 26 15 17 10/10 3.73

Two things stood out. Effort buys breadth, not accuracy: low to max raised claims two to five times and sources two to three times, and the gate rate stayed at 90–100 % throughout. No Claude cell produced a CONTRADICTED claim at any effort (the contradictions in the full matrix came from the Gemini and local lanes). And at max, Sonnet found the most claims, Fable the most sources, and Fable was fastest.

A gate that samples 10 claims cannot see depth, though. Haiku max at 26 claims and Fable max at 26 claims both score 10/10. Whether they are the same 26 claims is the next experiment.

Experiment 2: five Haiku runs against one Fable run

Five fresh Haiku 5.5 runs at medium (the production default) and five at max, merged, judged against the 26 Fable claims. The judge tags every merged claim with its run number, so the harness can compute, for k = 1..5, the mean over every k-subset of runs.

k runs medium: sources unique claims Fable covered covered or partial max: sources unique claims Fable covered covered or partial
1 5.4 11.6 2.2 / 26 11.4 8.6 29.8 7 / 26 19.0
2 6.8 21.0 2.8 14.4 11.1 54.0 7 20.9
3 7.7 28.6 3.0 16.3 13.0 74.1 7 21.7
4 8.4 34.8 3.0 17.4 14.6 91.2 7 22.4
5 9 40 3 18 16 106 7 23

Five Haiku max runs cost $3.94 — the price of the one Fable run — and reach Fable’s source count (16 vs 17) and four times its unique claim count (106 vs 26). The count of Fable claims stated with Fable’s specifics is 7 from k = 1 to k = 5. Not one repeat added a fully matched claim. The 16 partials are the compound claims with one piece missing; the 3 missing ones are the stepped-but-not-reset prepared statement that pins the WAL, VACUUM followed by wal_checkpoint(TRUNCATE), and Syncthing’s RESTART remedy with its 2.5 GB figure.

medium is a different tier, not a cheaper max. Five runs never left the docs pages plus one forum thread, stated 3 of 26 Fable claims fully, and two of the five shipped CONTRADICTED claims (“four checkpoint modes”, “PASSIVE never shrinks the WAL”). Repeats at medium add those errors to the union; they do not cancel them.

Experiment 3: five Sonnet and five Opus runs

Same design, run a week later: five Sonnet 5.5 and five Opus 5.5 runs at medium and at max, 20 runs, all 20 at 10/10 on the per-run gate.

max $ / run 1 run: Fable covered ≥ partial sources 5-run union: covered ≥ partial sources unique claims facts Fable lacked
Haiku 5.5 0.79 7.0 19.0 8.6 7 23 16 106 30
Sonnet 5.5 2.05 13.2 21.2 18.2 16 25 35 84 24
Opus 5.5 2.95 1.0 19.0 18.6 5 25 42 120 47
Fable 5.1 3.73 26 26 17 — — — — —

The Haiku $ / run is from its ten-way parallel batch; its single matrix cell cost $0.46.

Sonnet. One max run states half of Fable’s claims with Fable’s specifics and already beats Fable on breadth: 18 sources, 34 claims. Two runs, which is the same spend as one Fable run, reach 15 of 26 covered and 23 at least partial. Five runs plateau at 16 and 25. The residue is the same shape as Haiku’s — Fable’s compound claims with one specific dropped — at half the size. Sonnet’s extras are not restatements either: wal.c’s iCallback rule for when the auto-checkpoint hook fires, Antithesis’s 15-minute reproduction on 3.51.2, Phil Eaton’s mxFrame = 360 → 0 trace, Firefox’s 1.5 MiB SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT, Android’s db_wal_autocheckpoint.

Opus is the surprise in the table. Five runs read 42 sources — raw wal.c, walformat.html, the wal2 design doc, Rails’ sqlite3_adapter.rb, Litestream issue #547, SQLite forum posts — and wrote 120 unique claims with 47 facts Fable never had. And the judge scored it 5 of 26 covered. A second, independent judge pass said 5 again (Haiku 6, Sonnet 15, so the judge is stable to ±1). The number is real. It is also misleading.

Why Opus scores low: claim granularity

Mean claim length over the five max runs: Fable 425 characters, Sonnet 402, Opus 360, Haiku 230. Opus writes atomic claims. Fable’s auto-checkpoint claim has six specifics (PASSIVE; runs in the committing thread; at 1000 pages; SQLITE_DEFAULT_WAL_AUTOCHECKPOINT; about 4 MB at 4096-byte pages; per connection, ≤ 0 disables). Three Opus claims together state all six. No single one does. The judge rule was “at least one candidate claim states the whole fact”, so it marked the claim partial.

A third judge pass with a joint rule — the listed claims, taken together, state every specific — gives Haiku 4, Sonnet 14, Opus 12. Sonnet is stable under both rules because it writes compound claims the way Fable does. Opus doubles. Haiku drops, because its partials were missing the specifics, not splitting them.

5-run max union strict, pass 1 strict, pass 2 joint
Haiku 5.5 7 6 4
Sonnet 5.5 16 15 14
Opus 5.5 5 5 12

Judge self-preference (Opus judging Opus) would have pushed the other way, so bias is not the explanation. The lesson for anyone building a coverage judge is that the strict rule measures “did the candidate write the reference’s claim”, not “did it find the reference’s facts”, and the two diverge as soon as models granulate differently. Report both.

The mirror test: is Fable actually the deepest?

Everything above asks one question — how much of Fable did the other model reproduce — and Fable scores 26/26 by construction. A reviewer pointed out that this design cannot show Fable is the best run, only that it is the yardstick. So the judge was run the other way: Fable’s 26 claims as the candidate, each model’s output as the reference, same strict rule.

Reference Reference claims Fable states fully partial missing Reference states Fable fully (from above)
Haiku max, run 1 32 22 9 1 7 / 26
Sonnet max, run 1 30 14 14 2 ~13 / 26
Opus max, run 1 29 13 11 5 1 / 26 strict (atomic claims)
Haiku 5-run union 106 66 31 9 7 / 26
Sonnet 5-run union 84 19 56 9 16 / 26
Opus 5-run union 120 34 75 11 5 strict, 12 joint

Fable dominates Haiku in both directions: it states 22 of Haiku’s 32 claims exactly, Haiku states 7 of Fable’s 26. Fable and Sonnet are peers: each states about half of the other’s claims with the other’s specifics and nearly all of them at least partially, and Sonnet’s run cost $2.05 to Fable’s $3.73. Against Opus, Fable misses 5 of 29 claims outright — more than Opus misses of Fable’s under the joint rule — and against the five-run unions Fable states most Sonnet and Opus claims only partially, which means those unions carry specifics Fable’s run does not. Fable’s real edge is that it is the fastest max run (534 s against 900–1,000) and the most compact: 26 compound claims that say what 30–40 of the others’ say.

That changes the buying rule below. Fable is not “the precise one”; Sonnet at max is as precise per run at 55 % of the price, and two Sonnet runs beat one Fable run on every axis measured here.

medium at every model

Five Sonnet medium runs ($1.33 total) and five Opus medium runs ($3.27) each cover 1 of 26 Fable claims fully. Haiku medium covered 3. All three stop at the docs tier; none reached the Tailscale, Antithesis or Canonical write-ups in five tries. Sonnet’s five medium runs collapsed to 20 unique claims — the same 20 facts, five times — while Opus’s gave 39, so Opus medium repeats are more disjoint but no deeper.

What grows and what does not

Across all three models at max, the sources and unique-claim curves climb almost linearly with k. Repeats are near-disjoint: Sonnet’s 172 raw claims dedupe to 84, Opus’s 161 to 120, Haiku’s 149 to 106. That is useful breadth.

Every “covered” curve flattens by k = 2 or 3. Haiku’s is flat from k = 1. The thing that answers a precise question — the conjunction of condition, API and number — is set by the model on its first pass through the sources and does not accumulate. A model that drops the synchronous=NORMAL condition once drops it every time.

Accuracy is not where the tiers differ at max. 150 per-run gate verdicts across the three models’ max cells: 150 SUPPORTED. The full gates on the merged unions found 0 flaws in Sonnet’s 51 sampled claims, 1 CONTRADICTED in Opus’s 41 (a “rollback journal is faster above ~100 MB transactions” claim whose wording is close enough to wal.html’s own that it may be a gate false positive), 0 in Haiku’s 24. The accuracy gap is between medium and max, not between models.

Are 100 cheap concepts worth one deep one?

The cheap runs find more. The question the frontier manager has to answer is whether more, shallower concepts are worth the same as fewer, deeper ones — whether value is additive. Three findings say it is not.

The “more” was mostly not more. Haiku max’s 30 extras over Fable split, on reading, into about half restatements the judge failed to cluster (“PASSIVE is the default” and “fixed in 3.51.3”, each stated four or five ways) and half facts read from release logs and secondary articles. The genuinely new ones — the 3.44.6 and 3.50.7 backports, Eaton’s August 2026 reproducer — also appear in Sonnet’s and Opus’s extras. Opus’s 47 extras, by contrast, come from wal.c, the wal-index format and Litestream’s issue tracker: facts no one asks a docs page for. A count of extras is a poor proxy for value. Source tier is a better one.

The part that does not scale is the part that answers questions. A hundred headlines do not sum to one conjunction. After five Haiku runs the union states the headline of 23 Fable claims and the full conjunction of 7, and the 7 did not move. For a concept someone will query with a production problem, the pack with the conjunction is the only one that pays.

A low-value pack costs after the run. Every stored claim competes in hub_query_docset ranking, every volatile claim needs re-verification, and the cheap tier is where the contradicted claims came from (Haiku medium: 3 in 50). A pack on a concept nobody queries is negative value: index noise plus maintenance, no retrieval. That is what the Concept Viability Score gate (--min-cvs 3.2) already encodes — relevance, usefulness, novelty, interest and viability — and why the frontier manager holds sub-gate names back instead of researching them cheaply.

So no: one max-grade pack on a concept that passes the gate is worth more than a hundred medium packs on concepts that do not. Value per concept behaves like max() over the packs that answer a given question, not like a sum.

Breadth is worth paying for in exactly one place: discovery. Opus reading 42 sources and surfacing wal2, SQLITE_DBCONFIG_DEFENSIVE, setlk_timeout and Litestream’s v0.5 checkpoint takeover is how the next gate-passing concept gets found. That output should feed CVS scoring, not the concept tree.

The buying rule

Need Buy
Any gated concept: breadth and per-claim precision at least equal to one Fable run 2 × Sonnet max per concept, merged — about $4, the same as one Fable run, and ahead of it in both directions of the judge
The same at lowest latency, or a compact pack 1 × Fable max, ~$3.7, 534 s — fastest max run, fewest and densest claims
Frontier discovery and source hunting across a family 1 × Opus max per family, ~$3, fed into CVS scoring
Full-page extraction with every claim validated the staged pipeline: Sonnet discovers, Haiku extracts per source, Opus validates every claim — 135 claims, 10/10, $4.15
Never repeats of any model at medium to “add up” to max

Per dollar at one run: Haiku returns 38 unique claims and 11 sources, Sonnet 17 and 9, Opus 11 and 6, Fable 7 and 5. Per claim the other model also states exactly, Sonnet and Fable cost about the same (16 and 14 cents) — and the mirror test says the two runs are peers — so two Sonnet max runs is the new default for the research queue, Fable the pick when wall-clock matters, and Opus the pick when the job is finding what to research next. That is also what /dr, /rabbithole and concept-family-explorer now do by default.

Limits

One concept and one Fable reference run; the matrix shows ±1 gate verdict is noise, so treat coverage counts as directional. The judge reads claim text only; three forward passes and two reverse passes are reported, and the strict rule is biased against atomic claim styles. The reverse passes compare Fable’s single run against single runs and against five-run unions; a Sonnet-vs-Opus or Sonnet-vs-Sonnet pairing was not run. Pages drifted between the reference run on 10-13 and the repeats on 10-20 — the Tailscale post was unfetchable the second week, so the Fable reference lost two or three SUPPORTED verdicts to UNVERIFIED on re-gating, and the later runs could read a week of newer coverage. The full gate stops at 22–51 verdicts, so union flaw rates are sampled. Total spend across the three experiments, Claude lanes only, was roughly $80 of research and about $30 of judging and gating.

Reproduce

python3 scripts/dr_model_matrix.py run && python3 scripts/dr_model_matrix.py report
python3 scripts/dr_haiku_repeats.py run --efforts medium,max --repeats 5 --parallel 10
python3 scripts/dr_haiku_repeats.py --model claude-sonnet-5-5 --out docs/research/dr-sonnet-repeats-2026-10-20 run --efforts medium,max --repeats 5
python3 scripts/dr_haiku_repeats.py --model claude-opus-5-5   --out docs/research/dr-opus-repeats-2026-10-20   run --efforts medium,max --repeats 5

Then score and report on each. Raw data — result.json, claims files, gate verdicts, judge prompts and verdicts — is under docs/research/dr-model-matrix-2026-10-13/, dr-haiku-repeats-2026-10-15/, dr-sonnet-repeats-2026-10-20/, dr-opus-repeats-2026-10-20/ and the combined write-up in dr-model-repeats-2026-10-20/.