Skip to content

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

stagecompared againstgatemeasured
Philox 4x32-10published known-answer vectorsexact✓ 3/3 vectors
LR-SAMPLER-v1shared fixtureexact✓ 3/3 cases
Speech funnelshared fixture (Python, Swift, Go, Rust, JS)exact✓ 139/139 cases
Long-form splittingshared fixture (Python, Swift, Go, Rust, JS)exact✓ 18/18 cases
Postprocess detectorsshared fixture (Python, Swift, Go, Rust, JS)exact✓ 36/36 cases
EOS peak observationshared fixture (Python, Swift, Go, Rust, JS)step exact, probability rtol 1e-09✓ 3/3 cases
Seed derivationshared fixtureexact✓ 6/6 cases
Token generator, teacher-forcedreference implementationtop-1 >= 99%, median KL < 1e-4✓ top-1 100.00% (195/195), max median KL 1.76e-06
Token generator, free-runningreference implementationexact✓ 441/441 tokens
Mel decoder, fixed tokensreference implementationcorr >= 0.999✓ corr 0.999999–0.999999 over 3 sentences
Vocoder, fixed tokensreference implementationcorr >= 0.98✓ corr 0.9971–1.0000 over 3 sentences
Re-render, same seed and builditselfbit-identical✓ identical
ONNX renderershared fixturemel corr >= 0.999, wave corr >= 0.95✓ mel 0.999990, wave 0.9692 (worst of 2)
CoreML renderershared fixturemel corr >= 0.999, wave corr >= 0.95✓ mel 0.999999, wave 0.9998 (worst of 2)
  • 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 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.