From the M2a review (no bug in the bookkeeping reduction; the gap was that the Group-1 ops' *graph* materialization — reduce_onto — was unexercised by the gates, which hid two invalid-graph edges). Fixes are graph-materialization only; the bookkeeping projection, and therefore convergence/determinism, is unchanged. - DeleteIdentifiedPitch of a single-pitch note's last pitch left an empty (Chapter-5-invalid) PitchedEvent via EventArena::get_mut (which bypasses insert's well-formedness guard). It now degrades the note to a Rest of the same id/voice/position/duration; InsertIdentifiedPitch into a rest is the dual (rest -> one-pitch note), keeping the graph consistent with the bookkeeping that mints/tombstones the pitch object either way. - ModifyEvent now skips placement-changing (move) and malformed-empty pitched replacements in the graph rather than corrupting invariant 3 (VoiceEventsSortedNonOverlap) via get_mut; voice re-sort stays deferred and the LWW bookkeeping still records the modify. Coverage: graph_edit_session (criterion 1, reduce_onto + check_invariants) now emits all five Group-1 kinds, so the real-Score gate exercises their graph mutations at scale; plus two targeted reduce_onto regression tests (note->rest, rest->note) in tests/graph_reduction.rs. Docs: DECISIONS.md records the note<->rest equivalence and the ModifyEvent placement deferral (catalog section prose routed to M2e); Transpose / P12-K2 note the i8-saturation caveat; valuegen::pitch_value_nth no longer implies spelling() is injective. Gates: build/fmt/clippy -D warnings clean; cargo test --workspace green (ops graph_reduction 13, ops lib 51); conformance_suite scale 1 passes. The unrelated Agent-I working tree is left untouched; this commit stages only ops/testkit/spec. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| bundle_harness.rs | ||
| convergence.rs | ||
| corpus.rs | ||
| equivocation.rs | ||
| fixtures.rs | ||
| generators.rs | ||
| layout_stub.rs | ||
| lib.rs | ||
| migration.rs | ||
| negative.rs | ||
| prepass_harness.rs | ||
| rng.rs | ||
| roundtrip.rs | ||