How we measured · methodology and preregistration
How we measured decision model accuracy on ProofWriter
What the models were asked, which problems they saw, how answers were scored, what the numbers cannot tell you, and the predictions we wrote down before any model answered, each marked held or failed.
The dataset: ProofWriter
ProofWriter (Tafjord, Dalvi and Clark, 2021) is a multi-hop deductive reasoning dataset from AI2, published under CC BY 4.0. Each problem is a short theory of facts and rules in English and a statement to judge against it.
- Version
- V2020.12.3, official test splits: depth-0, depth-1, depth-2, depth-3, depth-5, NatLang
- Gold answers
- every selected label recomputed by hard_decisions.solver; zero disagreements. Our solver reproduces every published test label, on both tasks, with zero disagreements.
- Pool
- 108,440 open-world test questions, from which the open-world sample is drawn
- Synthetic
- The theories are generated from templates, some reworded by people (the NatLang set). Models may have seen the dataset in training.
The sample: 1,800 problems per task, 3,600 in all
Running every model on the full test set is not practical, so the harness draws a sample with a fixed seed (0). Items are spread evenly over proof depth and the correct answer first, so deep proofs and the unknown answer are never starved the way a uniform draw would starve them; inside each cell, items are chosen to cover the other properties and spread across theories. A bigger sample with the same seed only adds items, so answers already collected stay valid.
Open world: true, false or unknown: items per depth and answer
| Depth | true | false | unknown | Total | Available in the pool |
|---|---|---|---|---|---|
| 0 | 100 | 100 | 100 | 300 | 55,428 |
| 1 | 101 | 101 | 100 | 302 | 29,409 |
| 2 | 101 | 101 | 101 | 303 | 12,534 |
| 3 | 101 | 101 | 101 | 303 | 6,694 |
| 4 | 101 | 101 | 101 | 303 | 2,380 |
| 5 | 101 | 101 | 87 | 289 | 1,995 |
Closed world: true or false: items per depth and answer
| Depth | true | false | Total | Available in the pool |
|---|---|---|---|---|
| 0 | 150 | 150 | 300 | 55,079 |
| 1 | 150 | 150 | 300 | 28,872 |
| 2 | 150 | 150 | 300 | 12,839 |
| 3 | 150 | 150 | 300 | 6,922 |
| 4 | 150 | 150 | 300 | 2,523 |
| 5 | 150 | 150 | 300 | 2,101 |
ProofWriter publishes no separate depth-4 split; depth-4 items come from the splits built for deeper theories.
The two tasks
The same kinds of theory under two rules for what cannot be proved. Every model got exactly this question and these options, in this order.
Open world: true, false or unknown
Using only the facts and rules in the text, is the statement true, false, or unknown? A statement is true if it can be derived from the facts and rules, and false if its negation can be derived. If neither the statement nor its negation can be derived, it is unknown. A rule applies only when all of its conditions are established; 'not' in a condition requires the negation to be stated or derived.
- true: The statement follows from the facts and rules.
- false: The negation of the statement follows from the facts and rules.
- unknown: Neither the statement nor its negation follows from the facts and rules.
Closed world: true or false
Using only the facts and rules in the text, is the statement true or false? Assume that anything which cannot be derived from the facts and rules is false: a positive statement is true only if it can be derived, and a statement with 'not' is true when the unnegated statement cannot be derived. A rule applies when all of its conditions hold; 'not' in a condition holds when the unnegated condition cannot be derived.
- true: The statement holds under the closed-world assumption.
- false: The statement does not hold under the closed-world assumption.
One request per problem, the same for every model
Each model answered each problem once, with the problem's text, the task's question and its options. Nothing was retried into a valid answer.
- Jev. Jev is a hosted decision model made by TypeSafe. We call it through its maker's software kit, typesafe-sdk, on paid API access; the version is recorded on every answer (jev-1.13.0). Its size and architecture are not published.
- GPT-6 Luna. GPT-6 Luna is a hosted large language model made by OpenAI. We used it as a classifier: one request per item through the Chat Completions API, with reasoning effort set to none (its lowest setting) and a strict JSON schema that allows only the task's options. Its size and architecture are not published.
- Kev-9B. Kev-9B is an open decision model made by Jared Palmer: a pointer head and a rank-16 LoRA adapter on a frozen 9-billion-parameter Qwen3.5 base model. We ran it on our own laptop through the Kev server on MLX, in bfloat16.
- Kev-4B. Kev-4B is an open decision model made by Jared Palmer: a pointer head and a rank-16 LoRA adapter on a frozen 4-billion-parameter Qwen3.5 base model. We ran it on our own laptop through the Kev server on MLX, in bfloat16.
- Kev-0.8B. Kev-0.8B is an open decision model made by Jared Palmer: a pointer head and a rank-16 LoRA adapter on a frozen 0.8-billion-parameter Qwen3.5 base model. We ran it on our own laptop through the Kev server on MLX, in bfloat16.
- Laya. Laya is an open decision model made by Convai Innovations: a 421M-parameter ModernBERT-large encoder with decision heads. We ran it on our own laptop with the laya package, PyTorch on Apple's GPU.
An answer that is not exactly one of the options is scored as wrong and kept in the record as given. Across every scored run so far there were 0 such answers.
Scoring
- Accuracy
- The share of problems answered correctly, with a 95% interval: the range the score would fall in if we drew the problems again (a percentile bootstrap, 1,000 draws, seed 0).
- Floors
- Chance (one over the number of options) and the best constant guess: always giving the most common correct answer in that slice.
- Recall and macro-F1
- Recall is the share of items with a given correct answer that the model got right; macro-F1 averages the F1 of each answer, so a model cannot score well by ignoring one.
- Paired differences
- Two models on exactly the same items: the difference in accuracy, with its own 95% interval. Narrower than comparing two separate intervals.
- Breakdowns
- Accuracy by 12 properties of the problems: proof depth, gold answer, theory kind, negation in the theory, negated statement, question strategy, paraphrased rules, theory's deepest proof, theory length, number of rules, number of facts, proof size. Only depth is controlled.
- Repeatability
- Each model answers every item a second time; we report agreement, Gwet's AC1 and Cohen's kappa. Details.
What the numbers cannot tell you
- ProofWriter is synthetic. Its theories are generated from templates (some reworded by people), and models may have seen it in training. It measures one kind of reasoning, not decisions in your domain.
- One protocol for every model. Each model answered each item once, with the same question and the same options. GPT-6 Luna ran with reasoning off, its lowest setting, as a direct classifier; another setting would be another model.
- Latency is not like for like. Hosted models' times include the network and the vendor's servers. Open models ran on one laptop. Compare speed within a setting, not across settings.
- Only depth is controlled. The sample balances proof depth and the answer. Other breakdowns, such as negation, length or paraphrase, move with depth and with each other: they show where errors fall, not why.
- Predictions came first. We wrote down what we expected before any model answered, and report each prediction as held or failed, including the ones we got wrong.
- Every number re-runs offline. Scores are computed from the saved answers; one command rebuilds them without calling a model. Results still being scored are marked as such, never filled in.
At about 300 items per depth, a depth's accuracy is uncertain by roughly ±5 points; at about 100 items per depth and answer, roughly ±10. Only large differences are resolvable at that level.
Run records
Every run the harness has recorded with its manifest: when, how many requests at once, on what machine and how busy it was. Earlier runs predate the manifests.
| Model | Task | Purpose | Started | Finished | Answered | At once | Machine | Load average at start |
|---|---|---|---|---|---|---|---|---|
| Kev-4B | Closed world | scored run | 2026-10-01 12:19 UTC | 2026-10-01 12:58 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | not recorded |
| Kev-9B | Closed world | scored run | 2026-10-01 15:34 UTC | 2026-10-01 16:18 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 12.73 / 13.39 / 11.19 |
| Kev-9B | Open world | scored run | 2026-10-01 14:43 UTC | 2026-10-01 14:44 UTC | 20 of 20 | 1 | Apple M1 Max, 32 GB | 7.95 / 7.82 / 8.05 |
| Kev-9B | Open world | scored run | 2026-10-01 14:44 UTC | 2026-10-01 15:34 UTC | 1,780 of 1,780 | 1 | Apple M1 Max, 32 GB | 7.72 / 7.82 / 8.04 |
| Jev | Closed world | rerun (timing, retest) | 2026-10-01 12:04 UTC | 2026-10-01 12:09 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | not recorded |
| Jev | Open world | rerun (timing, retest) | 2026-10-01 11:58 UTC | 2026-10-01 12:04 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | not recorded |
| Kev-0.8B | Closed world | rerun (timing, retest) | 2026-10-01 16:32 UTC | 2026-10-01 16:36 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 5.2 / 5.56 / 6.33 |
| Kev-0.8B | Open world | rerun (timing, retest) | 2026-10-01 16:28 UTC | 2026-10-01 16:32 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 5.84 / 5.5 / 6.55 |
| Kev-4B | Closed world | rerun (timing, retest) | 2026-10-01 13:56 UTC | 2026-10-01 14:21 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 11.14 / 8.15 / 7.02 |
| Kev-4B | Open world | rerun (timing, retest) | 2026-10-01 13:29 UTC | 2026-10-01 13:56 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 7.26 / 6.97 / 7.22 |
| Laya | Closed world | rerun (timing, retest) | 2026-10-01 14:28 UTC | 2026-10-01 14:34 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 7.12 / 8.46 / 8.5 |
| Laya | Open world | rerun (timing, retest) | 2026-10-01 14:21 UTC | 2026-10-01 14:28 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 10.03 / 9.27 / 8.55 |
| GPT-6 Luna | Closed world | rerun (timing, retest) | 2026-10-01 15:57 UTC | 2026-10-01 16:27 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 7.88 / 8.32 / 8.96 |
| GPT-6 Luna | Open world | rerun (timing, retest) | 2026-10-01 15:30 UTC | 2026-10-01 15:57 UTC | 1,800 of 1,800 | 1 | Apple M1 Max, 32 GB | 15.51 / 10.17 / 9.47 |
Check it yourself
Every score on this site is computed from the saved answers, offline, without calling a model. The harness rebuilds them and this site from the same files:
hd verify # recompute every ProofWriter gold label with the independent solver
hd replay # rescore every saved answer: studies/*.jsonl
hd report # write RESULTS.md
cd site && npm run build # rebuild this site from studies/, engines.yaml and the run manifestsEvery number is also in one data file.
Preregistered predictions: which held and which failed
Before any model answered an item, we wrote down what we expected. Each prediction is quoted word for word and checked against the scored results, by the rule stated beside it.
14 of 22predictions held so far. 1 partly held, 14 held, 4 failed, 1 mixed, 2 pending; 1 made no claim. A pending prediction waits for results that are still being run or scored; it is never guessed.
How to read a verdict
- Held
- The data meets the stated rule.
- Failed
- The data does not.
- Partly held / mixed
- One part or one task held and another failed.
- Pending
- The results it needs are not scored yet.
The preregistration states the predictions in words. Where it does not say how a word like "falls" is tested, the rule we applied is written beside the verdict, and it is the same for every model.
Jev: Predictions
- Partly heldPrediction 1
Jev's accuracy falls as proof depth rises, on both tasks. Depth 0 is clearly above depth 5, with intervals that do not overlap on OWA.
- Rule: depth 0 clearly above depth 5 on each task (95% intervals do not overlap), and no deeper level clearly above a shallower one.
- OWA: depth 0 97.7% [96.0–99.3], depth 5 81.0% [76.5–85.5], intervals apart.
- CWA: depth 0 99.3% [98.3–100.0], depth 5 89.3% [85.7–92.3], intervals apart; but depth 5 (89.3%) is clearly above depth 4 (76.3%).
- HeldPrediction 2
On OWA, Jev's recall on unknown is the lowest of the three classes at depth 3 and above.
- Rule: at each of depths 3, 4 and 5 on OWA, Jev's recall on unknown is the lowest of the three classes. (Recall by depth and class is counted from the saved answers.)
- Depth 3: true 86.1%, false 80.2%, unknown 73.3%; lowest is unknown.
- Depth 4: true 80.2%, false 79.2%, unknown 56.4%; lowest is unknown.
- Depth 5: true 93.1%, false 92.1%, unknown 54.0%; lowest is unknown.
- FailedPrediction 3
By depth 5, Jev is within 10 points of its own best-constant floor on at least one task (that is, it has largely stopped using the rules).
- Rule: at depth 5, Jev's accuracy is within 10 points of the best constant guess on at least one task.
- OWA: 81.0% against a best constant of 34.9%, +46.0 points above it.
- CWA: 89.3% against a best constant of 50.0%, +39.3 points above it.
- FailedPrediction 4
Negation in the theory (theory_negation = negation) lowers accuracy relative to no negation.
- Rule: accuracy with negation in the theory is below accuracy without it.
- OWA: with negation 87.5% [85.4–89.7], without 80.3% [77.7–83.1]: clearly higher with negation, the opposite of the prediction.
- CWA: with negation 93.7% [92.1–95.3], without 85.2% [82.8–87.5]: clearly higher with negation, the opposite of the prediction.
- HeldPrediction 5
Paraphrased rules (NatLang) are no easier than templated ones.
- Rule: paraphrased rules are not clearly easier (their interval is not wholly above the templated one).
- OWA: paraphrased 78.1%, templated 86.1%.
- CWA: paraphrased 76.7%, templated 94.0%.
- No claimPrediction 6
No claim about the other axes (length, rule count, proof size, strategy) beyond reporting them; they correlate with depth, so those breakdowns are descriptive.
- Reported, not predicted: see the breakdown pages.
Kev-0.8B: Amendment 1: Kev
- HeldPrediction 1
Kev's accuracy falls with proof depth on both tasks.
- Rule: depth 0 clearly above depth 5 on each task (95% intervals do not overlap), and no deeper level clearly above a shallower one.
- OWA: depth 0 70.3% [65.3–75.7], depth 5 50.9% [45.3–56.7], intervals apart.
- CWA: depth 0 68.0% [62.7–73.3], depth 5 51.7% [46.0–57.3], intervals apart.
- HeldPrediction 2
Kev is below Jev overall on both tasks (paired interval excludes zero).
- Rule: the paired interval for Jev minus Kev-0.8B lies above zero on both tasks.
- OWA: Jev minus Kev-0.8B +30.3 points [+27.7 to +32.7] on 1,800 items.
- CWA: Jev minus Kev-0.8B +33.5 points [+30.7 to +36.3] on 1,800 items.
- HeldPrediction 3
On OWA, Kev's unknown recall is its lowest class recall.
- Rule: on OWA, recall on unknown is the lowest of the three classes.
- Kev-0.8B recall on OWA: false 89.6%, true 58.2%, unknown 11.9%; lowest is unknown.
GPT-6 Luna: Amendment 2: LLM classifiers
- HeldPrediction 1
Luna's accuracy falls with proof depth on both tasks.
- Rule: depth 0 clearly above depth 5 on each task (95% intervals do not overlap), and no deeper level clearly above a shallower one.
- OWA: depth 0 93.3% [90.3–96.0], depth 5 46.0% [40.1–51.6], intervals apart.
- CWA: depth 0 98.0% [96.3–99.3], depth 5 44.7% [38.7–50.3], intervals apart.
- FailedPrediction 2
On OWA, Luna's unknown recall is its lowest class recall.
- Rule: on OWA, recall on unknown is the lowest of the three classes.
- GPT-6 Luna recall on OWA: false 50.9%, true 58.3%, unknown 83.4%; lowest is false.
- HeldPrediction 3
With reasoning off, Luna does not beat Jev at depth 5 on OWA (the paired interval does not exclude zero in Luna's favour).
- Rule: at depth 5 on OWA, the paired interval for Jev minus Luna does not lie wholly below zero.
- Depth 5, OWA: Jev minus Luna +34.9 points [+27.3 to +42.9] on 289 items.
- MixedPrediction 4
Paraphrased rules lower Luna's accuracy less than they lower Jev's.
- Rule: on each task, Luna's accuracy drop from templated to paraphrased rules is smaller than Jev's. (No interval was preregistered for this difference, so it is a point comparison.)
- OWA: Luna drops +12.9 points, Jev drops +8.0: failed.
- CWA: Luna drops +8.4 points, Jev drops +17.3: held.
Kev-4B and Kev-9B: Amendment 3: Kev-4B and Kev-9B
- FailedPrediction 1
Accuracy rises with size: Kev-4B is above Kev-0.8B overall on both tasks (paired interval excludes zero).
- Rule: Kev-4B is above Kev-0.8B overall on both tasks, with a paired interval that excludes zero.
- OWA: Kev-4B 53.6%, Kev-0.8B 53.6%.
- CWA: Kev-4B 58.8%, Kev-0.8B 55.8%.
- Kev-4B is not ahead on OWA, so its interval cannot exclude zero in its favour there.
- HeldPrediction 2
Kev-4B and Kev-9B stay below Jev overall on both tasks.
- Rule: the paired interval for Jev minus each larger Kev lies above zero on both tasks.
- OWA: Jev minus Kev-4B +30.3 points [+27.4 to +32.9] on 1,800 items.
- CWA: Jev minus Kev-4B +30.5 points [+27.9 to +33.1] on 1,800 items.
- OWA: Jev minus Kev-9B +25.3 points [+22.7 to +27.8] on 1,800 items.
- CWA: Jev minus Kev-9B +25.5 points [+23.0 to +27.8] on 1,800 items.
- PendingPrediction 3
Kev-9B is not reliably above Kev-4B (paired interval includes zero) on at least one task.
- Kev-9B and Kev-4B are both scored, but the harness has not computed their paired interval.
Repeatability: Amendment 4: test-retest repeatability
- PendingPrediction 1
Kev and Laya agree with themselves on at least 99.5% of items on both tasks (local, fixed weights).
- Rule: every Kev and Laya rerun agrees with its first run on at least 99.5% of items, on both tasks.
- Kev-0.8B on OWA: 100.0% agreement.
- Kev-0.8B on CWA: 100.0% agreement.
- Kev-4B on OWA: 100.0% agreement.
- Kev-4B on CWA: 100.0% agreement.
- Laya on OWA: 100.0% agreement.
- Laya on CWA: 100.0% agreement.
- No scored rerun yet for: Kev-9B on OWA, Kev-9B on CWA.
- HeldPrediction 2
Jev's AC1 is at least 0.90 on both tasks (observed: 0.958 on both, before this amendment).
- Rule: Jev's AC1 is at least 0.90 on both tasks. (The amendment notes this was already observed when it was written.)
- OWA: AC1 0.958 [0.948–0.969], agreement 97.2%.
- CWA: AC1 0.958 [0.944–0.971], agreement 97.9%.
- HeldPrediction 3
Where answers change, they change more at depth 3 and above than at depth 0 to 2, for every engine with at least 20 changes.
- Rule: for every model with at least 20 changed answers, the share that changes is higher at depths 3 and above than at depths 0 to 2.
- Jev on OWA: 4.5% of answers changed at depths 3 to 5 (40 of 895) against 1.1% at depths 0 to 2 (10 of 905).
- Kev-0.8B on OWA: 0 changes, under the 20 the rule needs.
- Kev-4B on OWA: 0 changes, under the 20 the rule needs.
- Laya on OWA: 0 changes, under the 20 the rule needs.
- GPT-6 Luna on OWA: 12.8% of answers changed at depths 3 to 5 (115 of 895) against 7.7% at depths 0 to 2 (70 of 905).
- Jev on CWA: 3.3% of answers changed at depths 3 to 5 (30 of 900) against 0.9% at depths 0 to 2 (8 of 900).
- Kev-0.8B on CWA: 0 changes, under the 20 the rule needs.
- Kev-4B on CWA: 0 changes, under the 20 the rule needs.
- Laya on CWA: 0 changes, under the 20 the rule needs.
- GPT-6 Luna on CWA: 12.2% of answers changed at depths 3 to 5 (110 of 900) against 6.6% at depths 0 to 2 (59 of 900).
Luna confidence probe: Amendment 6: can GPT-6 Luna's log-probabilities serve as a confidence?
- HeldPrediction 1
Luna's ECE exceeds 0.15 on both tasks.
- Rule: Luna's expected calibration error is above 0.15 on each task.
- OWA: ECE 0.316.
- CWA: ECE 0.318.
- HeldPrediction 2
At least half of Luna's wrong answers are stated at 95% or more, on both tasks.
- Rule: at least half of Luna's wrong answers are stated at 95% or more, on each task.
- OWA: 75.5% of 660 wrong answers.
- CWA: 80.6% of 633 wrong answers.
- HeldPrediction 3
Luna's AUROC is lower than Jev's on both tasks.
- Rule: Luna's AUROC is below Jev's on each task, on the same items.
- OWA: Luna 0.662, Jev 0.849.
- CWA: Luna 0.679, Jev 0.858.
- HeldPrediction 4
On most responses, Luna discloses fewer than all of the task's options.
- Rule: on more than half of the responses, fewer than all of the task's options are disclosed.
- OWA: 1,764 of 1,800 responses disclose fewer than all 3 options.
- CWA: 1,455 of 1,800 responses disclose fewer than all 2 options.
The frozen design
Fixed before any model answered.
- Data: ProofWriter V2020.12.3, official test splits (depth-0,1,2,3,5 and NatLang), archive sha256
- Sample: hd build --n 1800 --seed 0 (1,800 items per semantics, difficulty-diverse, nested by seed).
- Tasks: proofwriter-owa (true / false / unknown) and proofwriter-cwa (true / false). One request per
- Engine: Jev (typesafe-sdk), model version recorded per row. A version change is a new engine.
- Primary metric: accuracy by proof depth (0 to 5) with a 95% percentile bootstrap interval (seed 0, 1,000
- Floors: chance (1 / number of options) and the best constant guesser on the same items.
What would count against us
Accuracy flat across depth (prediction 1 false), or unknown recall not the lowest (prediction 2 false), is reported as such.
Caveats stated in advance
ProofWriter is synthetic and templated, and models may have seen it in training. Interval widths at 100 to 150 items per depth are about plus or minus 8 to 10 points per class-balanced stratum, so only large differences are resolvable at the depth-by-label level. Breakdowns are descriptive, not causal.