Parity, measured
Generated by tools/parity_table.py. Every row is a comparison the test
suite enforces; gate is the threshold that fails the build, measured is
what this run actually observed. A row that says not measured was not run
in this environment. It is left in rather than dropped, because a table
quietly missing a row reads as a table with nothing to hide.
Environment: Python 3.12.12, torch 2.13.0, onnxruntime 1.28.0, loudkit fa3e82f
| stage | compared against | gate | measured |
|---|---|---|---|
| Philox 4x32-10 | published known-answer vectors | exact | ✓ 3/3 vectors |
| LR-SAMPLER-v1 | shared fixture | exact | ✓ 3/3 cases |
| Speech funnel | shared fixture (Python, Swift, Go, Rust, JS) | exact | ✓ 139/139 cases |
| Long-form splitting | shared fixture (Python, Swift, Go, Rust, JS) | exact | ✓ 18/18 cases |
| Postprocess detectors | shared fixture (Python, Swift, Go, Rust, JS) | exact | ✓ 36/36 cases |
| EOS peak observation | shared fixture (Python, Swift, Go, Rust, JS) | step exact, probability rtol 1e-09 | ✓ 3/3 cases |
| Seed derivation | shared fixture | exact | ✓ 6/6 cases |
| Token generator, teacher-forced | reference implementation | top-1 >= 99%, median KL < 1e-4 | ✓ top-1 100.00% (195/195), max median KL 1.76e-06 |
| Token generator, free-running | reference implementation | exact | ✓ 441/441 tokens |
| Mel decoder, fixed tokens | reference implementation | corr >= 0.999 | ✓ corr 0.999999–0.999999 over 3 sentences |
| Vocoder, fixed tokens | reference implementation | corr >= 0.98 | ✓ corr 0.9971–1.0000 over 3 sentences |
| Re-render, same seed and build | itself | bit-identical | ✓ identical |
| ONNX renderer | shared fixture | mel corr >= 0.999, wave corr >= 0.95 | ✓ mel 0.999990, wave 0.9692 (worst of 2) |
| CoreML renderer | shared fixture | mel corr >= 0.999, wave corr >= 0.95 | ✓ mel 0.999999, wave 0.9998 (worst of 2) |
Why each gate is where it is
Section titled “Why each gate is where it is”- Philox 4x32-10 — the RNG is checked against a standard, not against itself
- LR-SAMPLER-v1 — min_p in logit space, gumbel-argmax, ties to the low index
- Speech funnel — invisibles, symbols, footnotes, punctuation, Polish respelling
- Long-form splitting — where the reader breathes; a different split is a different reading
- Postprocess detectors — where a chunk ended; a different verdict is a different cut
- EOS peak observation — audible despite never feeding back: two detector rules threshold on it
- Seed derivation — one user seed, independent per-stage streams
- Token generator, teacher-forced — the only generator comparison free of sampling chaos (EXP-010)
- Token generator, free-running — same law, same seed — a mismatch means the logits moved
- Mel decoder, fixed tokens — same tokens and same injected noise, so a difference is arithmetic
- Vocoder, fixed tokens — gated loosely on purpose: predicted phase decorrelates, spectrum does not
- Re-render, same seed and build — identity class I-2: determinism within one backend
- ONNX renderer — a second backend does not get a second, looser bar
- CoreML renderer — a second backend does not get a second, looser bar
The free-running row across architectures
Section titled “The free-running row across architectures”The exact gate on free-running generation holds at the recording
configuration (this machine, CPU): 441/441. The same run on an x86 host
measured 427/441 — fourteen sampled tokens flipped by nothing but the
architecture’s reduction order, with teacher-forced KL at 1.89e-06. That is
the identity contract’s per-device scope made visible: the sampling law is
exact; the logits underneath it move at the last bit between architectures,
and occasionally a decision boundary sits there.