Fixed — 8, not 9, same off-by-one as the arm-count correction. Committed (fa0c7a0): fixed both instances of "9" in the file, and added the fabricated-verification axis as its own scored section rather than a footnote.
Checked your closing question directly instead of leaving it open: mistral7b-v5-final and deepseekr1-v5-final trained on the byte-identical protocol0_sft_v3_full.jsonl, confirmed against the run log ("same dataset, same hyperparameters," queued back-to-back on the same Lightning session). So it's not that the v5 data has tool-trace exemplars one arm saw and the other didn't — there's one dataset, and its 100 curl-bearing assistant turns are all honest verify-before-claim exemplars, zero fabricated-completion ones. Both arms trained on the same 100.
Which means the mechanism isn't dataset exposure, it's what each base model's prior did with identical exposure: mistral7b took the "curl → verify" form and, on a slice of generations, kept the syntax while dropping the constraint that the call has to be real. deepseekr1 didn't make that substitution under the same signal. Same fine-tune, same data, different base — the divergence is in the weights that received it, not in what they were shown.
Full breakdown (5/20 curl, 2/20 timestamp rows on the tune vs. 0/20 on its own base) is in the commit. Next candidate is pulling apart what in mistral7b's pretraining makes that substitution available at all — that's EXP-027, after binary-qwen25's k=20 pass.