What's Changed
The quality-closure release: every open stage from the 2026-08-05 quality review (Stages 10, 12β19) is closed with a recorded blind-listening verdict, and the final owner exit listen passed across the corpus. Available on crates.io.
Breaking Changes
EngineProfile::WideKeylockis rebuilt around a direct-ratio phase-vocoder head (WidePvHead, ROADMAP Stage 19). The PV now owns the tempo axis directly instead of correcting a varispeed stream, which fixed the "roboty" liveness verdict that failed the Stage 14 exit listen. Its latency contract changed from a 48.6 ms pipeline delay to 0 ms β the analysis window is source-side lookahead, so like tape the first delivered frame is source frame 0. Hosts that externally compensated the old wide delay must drop that offset; position queries were and remain self-compensating. Retarget landing in the wide profile is hop-quantized (β5.8 ms); emission counts stay frame-exact, and instant ratio steps are click-free with constant pitch.- Cached analysis artifacts regenerate:
PREANALYSIS_VERSIONis now 12 withMIN_COMPATIBLE_VERSION12 (from 7/4 at v0.11.0) β beat grids and tempo estimates changed materially across this span (phase hygiene, rigid-grid adoption, metrical-level second pass), so pre-v12.tsasidecars re-analyze on load.
Engine quality (blind-verdict gated)
- Steady-rate cadence stretch for SOLA splices (Stage 18): at sustained slowdowns the keylock corrector splices at twice the steady cadence with a tapered stretch budget, removing the audible splice-rate artifact; gated off during tempo ramps after an A/B matrix caught a 5.65-cent ride-cymbal regression (bound: 1.5 cents).
- Mid/side stereo in the wide profile (Stage 14 measurement): per-channel processing manufactured ~16 dB of side energy by decorrelation; M/S is source-faithful.
- Phase-vocoder phase hygiene (Stage 13) and mild-motion bounded recenter (Stage 15): batch-path phase artifacts and the SOLA seam under sustained rides.
Analysis
- Metrical-level second pass (Stage 10): when the 3/2 tempo candidate's salience clears a measured threshold (0.70, from a measured 0.60/0.76 gap), tracking re-runs with the prior at that level β drum & bass now detects its true tempo (both corpus rows EXACT at 174.00/170.00 where the QM reference tracker also fails). DJ hint range widened to 100β182 BPM.
- Rigid-grid corroboration on syncopated material, and estimator disagreement caps stored confidence at 0.5 so hosts can flag uncertain grids.
Honest contracts
EngineController::retargets_degraded()(#45, reported by @PeteHaughie): scheduling more thanMAX_PENDING_RETARGETS(8, now public) timestamped retargets silently degraded the overflow to immediate latest-wins β invisible todropped_events(). The degradation is now counted, documented onset_tempo_rate_atwith the β€8-in-flight scheduling pattern, and gated at 0 in the soak harness.
QA
- Blind A/B harness:
scripts/ab.shrenders level-matched, blinded, sealed-key arm sets (current tree, any git ref, rubberband reference);tools/ab-tuiis a two-pane listening TUI writing machine-readable verdicts. - Non-EDM corpus: hip-hop/rock/funk local rows plus two CC-licensed drum & bass public rows; CI enforces β₯90% tempo-accuracy floors on the public corpus.
- Soak hardening (Stage 12): position-drift gate (2048 frames), no-panic audit, weekly re-seeded fuzz campaign.
Full Changelog: v0.11.0...v0.12.0