Evidence at a glance
Every dot pair below is one model answering the same questions twice: once
with the data as compact JSON, once as LDF v0.1. The chart is built from
reports/evidence/evidence.json, the table the selector ships with, so it
shows exactly what ldf-mcp --model and the Claude Code hook decide from.
Table view
| model, size | dataset | JSON | LDF | + / - | p | tokens | accuracy rule |
|---|---|---|---|---|---|---|---|
| Opus 5.5 · 200 records | flat users | 65/65 | 65/65 | +0 / -0 | 1.00 | 0.61 | passes |
| Opus 5.5 · 200 records | nested orders | 94/95 | 94/95 | +1 / -1 | 1.00 | 0.65 | passes |
| Opus 5.5 · 200 records | sparse events | 78/80 | 78/80 | +2 / -2 | 1.00 | 0.80 | passes |
| Opus 5.5 · 200 records | mixed types | 57/57 | 57/57 | +0 / -0 | 1.00 | 0.73 | passes |
| Opus 5.5 · 1,000 records | flat users | 64/64 | 59/64 | +0 / -5 | 0.06 | 0.61 | fails |
| Opus 5.5 · 1,000 records | nested orders | 66/68 | 66/68 | +2 / -2 | 1.00 | 0.65 | passes |
| Opus 5.5 · 1,000 records | sparse events | 56/60 | 57/60 | +3 / -2 | 1.00 | 0.80 | passes |
| Opus 5.5 · 1,000 records | mixed types | 52/52 | 52/52 | +0 / -0 | 1.00 | 0.73 | passes |
| Sonnet 5.5 · 200 records | flat users | 62/65 | 64/65 | +2 / -0 | 0.50 | 0.61 | passes |
| Sonnet 5.5 · 200 records | nested orders | 87/95 | 80/95 | +3 / -10 | 0.09 | 0.65 | fails |
| Sonnet 5.5 · 200 records | sparse events | 78/80 | 77/80 | +1 / -2 | 1.00 | 0.80 | passes |
| Sonnet 5.5 · 200 records | mixed types | 57/57 | 57/57 | +0 / -0 | 1.00 | 0.73 | passes |
| Sonnet 5.5 · 1,000 records | flat users | 64/64 | 64/64 | +0 / -0 | 1.00 | 0.61 | passes |
| Sonnet 5.5 · 1,000 records | nested orders | 65/68 | 57/68 | +0 / -8 | 0.01 | 0.65 | fails |
| Sonnet 5.5 · 1,000 records | sparse events | 59/60 | 54/60 | +1 / -6 | 0.13 | 0.80 | fails |
| Sonnet 5.5 · 1,000 records | mixed types | 52/52 | 52/52 | +0 / -0 | 1.00 | 0.73 | passes |
| Haiku 5.5 · 200 records | flat users | 87/89 | 87/89 | +2 / -2 | 1.00 | 0.61 | passes |
| Haiku 5.5 · 200 records | nested orders | 130/135 | 124/135 | +1 / -7 | 0.07 | 0.65 | fails |
| Haiku 5.5 · 200 records | sparse events | 106/115 | 108/115 | +6 / -4 | 0.75 | 0.78 | passes |
| Haiku 5.5 · 200 records | mixed types | 81/82 | 79/82 | +0 / -2 | 0.50 | 0.72 | passes |
| DeepSeek · 200 records | flat users | 59/89 | 61/89 | +7 / -5 | 0.77 | 0.61 | passes |
| DeepSeek · 200 records | nested orders | 84/135 | 84/135 | +6 / -6 | 1.00 | 0.65 | passes |
| DeepSeek · 200 records | sparse events | 70/115 | 60/115 | +5 / -15 | 0.04 | 0.78 | fails |
| DeepSeek · 200 records | mixed types | 82/82 | 82/82 | +0 / -0 | 1.00 | 0.72 | passes |
How to read it:
- Close dots mean the format makes no difference to that model on that data, and LDF saves the tokens on the right.
- An orange dot well left of the blue one is a loss. The selector’s rule is at least 50 questions, at most 3 points below JSON and not significantly worse (sign test); a model that fails it on some shape of data keeps getting JSON there.
- Held-out rows use records and questions that were not seen when the layouts were chosen. Stage B rows (Haiku, DeepSeek) use the same 200 records as the design work.
Grading is strict: an answer with the right value but without its JSON quotes, or wrapped in an object, counts as wrong. Most of Sonnet’s losses on nested orders are ids answered without quotes; the reports say so cell by cell:
- Stage C, Opus 5.5 and the Sonnet 5.5 run at 200 held-out records.
- 1 000 records, Opus and Sonnet.
- The methodology for how questions are generated and graded.