- valuegen::spelling(nth) is now injective over the full u8 (nominal = nth % 7,
octave = nth / 7), so distinct selectors always give distinct PitchSpellings.
Removes the silent mod-7 collapse footgun the M1 review flagged; no call-site
changes needed (existing hex-looking selectors now genuinely differ).
- migrate.rs gains a unit-test module covering the reconstruction branches the
corpus-driven equivalence gate never reaches: Tie/Beam create round-trip
exactly; Spanner create is Irreversible (anchor-based, not event-ref —
documented in operation_catalog §CreateCrossCutting); the tuplet-compensation
variants migrate (ReplaceWithRest preserves rest id+duration, voice recovered
at reduction per finding #3); respell recovers from context else Irreversible
(P12-K1).
Gates green: build/fmt/clippy -D warnings; cargo test --workspace (ops migrate
tests + all criteria). No production logic changed beyond the spelling() token
domain.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>