From e4edea6a3ef12240061725db33445923edd3947c Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Tue, 7 Jul 2026 11:21:22 -0400 Subject: [PATCH] Pass 12 G-pass: code tranche (K3/K9/C4/H7) + review fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The decided code work behind aff1809, review-hardened (high-effort multi-agent review; 3 correctness findings fixed pre-commit, all regression-locked). epiphany-ops: - K3: SystemDerivedContentImmutable (12) — modify_event / modify_identified_pitch refuse intrinsic-content rewrites of SYSTEM_DERIVED pitches, checked against the system_mints registry (base-seeded + op mints, so reduce()/reduce_onto() agree). REVIEW FIX: Transpose now *skips* system-derived targets like tombstoned ones (an in-place alteration shift desynchronized content from the derivation registry -> checkpoint-dependent verdicts); an all-system transpose reduces as the K3 no-op. Catalog Transpose updated. - K9: RecreateContentMismatch (13) replaces the TargetMissing misnomer at both value-retaining re-create sites (CreateStaff, carried TimeSignature). Catalog corrected: container creates are plain set-union (no value comparison), not K9 sites. - C4: ReanchorReason::SameCanvasNearer (6); rank-4 recording routes through rank_reason. REVIEW FIX: an *unestablished* rank 4 (unresolvable placement fallthrough in containment_rank) keeps the honest ExplicitFallback — selection order unchanged. - Filed P13-K1 (pre-existing checkpoint asymmetry for ModifyEvent- introduced system pitches) in DECISIONS rather than improvising. epiphany-core (H7, req:pitch:authored-uninferred): - Authored attachments surface for inference-ineligible targets in both pre-passes (best_authored_spelling/_decomposition refactor, candidates-first liveness via the existing Score::live_pitch_ids); two new taxonomy buckets enter the derivation fingerprint. The old test locking the pre-decision mirror is flipped to the ratified behavior. epiphany-testkit (review fixes): - prepass_harness: spelling-unavailable pitches may carry *authored* surfacings (inferred still forbidden); decomposition reconstruction invariants scoped to algorithm output (authored entries are invariant-15's graph-level jurisdiction); accounting identity gains the authored-uninferred bucket. - generators: the three appended discriminants (12/13/6) now generate. Full gate green: fmt, clippy -D warnings, rustdoc -D warnings, 30 workspace suites, conformance scale 1 (8/8). Wire goldens + decode bounds for the appended discriminants; 12 new regression tests. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01NEs4aYiu8MXjdYdMxw8PTd --- crates/epiphany-core/src/prepass.rs | 125 +++++- crates/epiphany-core/src/prepass/tests.rs | 207 ++++++++- crates/epiphany-ops/DECISIONS.md | 35 ++ crates/epiphany-ops/src/decode.rs | 22 + crates/epiphany-ops/src/effect.rs | 46 ++ crates/epiphany-ops/src/reduce.rs | 393 +++++++++++++++++- crates/epiphany-testkit/src/generators.rs | 9 +- .../epiphany-testkit/src/prepass_harness.rs | 54 ++- spec/operation_catalog.pdf | Bin 116820 -> 117479 bytes spec/operation_catalog.tex | 15 +- 10 files changed, 834 insertions(+), 72 deletions(-) diff --git a/crates/epiphany-core/src/prepass.rs b/crates/epiphany-core/src/prepass.rs index c437832..acc5655 100644 --- a/crates/epiphany-core/src/prepass.rs +++ b/crates/epiphany-core/src/prepass.rs @@ -116,6 +116,11 @@ pub struct TaxonomyReport { /// Pitches whose pitch space declares spelling unavailable (non-`cmn-12`- /// determinable positions: JI vectors, non-12 EDOs, registered grammars). pub spelling_unavailable: usize, + /// Pitches the algorithm produced *no* inferred spelling for whose + /// annotation is an authored attachment surfacing on its own + /// (`req:pitch:authored-uninferred`, Pass 12 P12-H7). Counted distinctly + /// from `spellings_authored` (an authored *override* of inferred output). + pub spellings_authored_uninferred: usize, // --- Decomposition outcomes (over events). --- /// Eligible events whose effective decomposition is the pre-pass's inferred @@ -142,6 +147,12 @@ pub struct TaxonomyReport { /// skipped rather than mis-rendered. Expected to be zero for well-formed /// metric input. pub decomposition_ungriddable: usize, + /// Events the pre-pass produced *no* inferred decomposition for + /// (ungriddable, non-metric, non-musical, or an inapplicable kind) whose + /// annotation is an authored attachment surfacing on its own + /// (`req:pitch:authored-uninferred`, Pass 12 P12-H7). Counted distinctly + /// from `decompositions_authored` (an authored *override*). + pub decompositions_authored_uninferred: usize, } /// The canonical derived annotations for a score under a profile: the effective @@ -206,12 +217,14 @@ impl DerivedAnnotations { t.spellings_inferred, t.spellings_authored, t.spelling_unavailable, + t.spellings_authored_uninferred, t.decompositions_inferred, t.decompositions_authored, t.decomposition_skipped_nonmusical, t.decomposition_deferred_nonmetric, t.decomposition_inapplicable, t.decomposition_ungriddable, + t.decompositions_authored_uninferred, ] { out.extend_from_slice(&(count as u64).to_le_bytes()); } @@ -267,6 +280,35 @@ pub fn derive_annotations(score: &Score, profile: &PrePassProfile) -> DerivedAnn } spellings.insert(pid, resolved); } + // Authored spellings for pitches the algorithm produced *no* inferred + // spelling for (`req:pitch:authored-uninferred`, Pass 12 P12-H7): the + // winning authored attachment surfaces on its own — an authored + // attachment is precisely how a user notates what the algorithm + // cannot infer, and the derived-annotation surface must not render it + // invisible. Only pitches that exist in the score surface (an + // attachment in tombstoned-target state stays diagnostic-only). + // Candidates come from the attachments first, so the common + // no-attachments case never walks the arena for the liveness set. + let mut uninferred: BTreeSet = BTreeSet::new(); + for att in &score.spelling_attachments { + if let SpellingScope::Pitch(p) = &att.scope { + if !spellings.contains_key(p) { + uninferred.insert(*p); + } + } + } + if !uninferred.is_empty() { + let live_pitches = score.live_pitch_ids(); + for pid in uninferred { + if !live_pitches.contains(&pid) { + continue; + } + if let Some(resolved) = best_authored_spelling(score, pid, precedence) { + taxonomy.spellings_authored_uninferred += 1; + spellings.insert(pid, resolved); + } + } + } } // --- Decomposition pre-pass. --- @@ -281,6 +323,23 @@ pub fn derive_annotations(score: &Score, profile: &PrePassProfile) -> DerivedAnn } decompositions.insert(eid, resolved); } + // Authored decompositions for events the pre-pass produced *no* + // inferred decomposition for — ungriddable, non-metric, non-musical, + // or an inapplicable kind (`req:pitch:authored-uninferred`, Pass 12 + // P12-H7). Mirrors the spelling surfacing above; only events that + // exist in the score surface. + let mut uninferred: BTreeSet = BTreeSet::new(); + for att in &score.decomposition_attachments { + if !decompositions.contains_key(&att.target) && score.events.get(att.target).is_some() { + uninferred.insert(att.target); + } + } + for eid in uninferred { + if let Some(resolved) = best_authored_decomposition(score, eid) { + taxonomy.decompositions_authored_uninferred += 1; + decompositions.insert(eid, resolved); + } + } } DerivedAnnotations { @@ -722,12 +781,30 @@ pub fn resolve_spelling( inferred: PitchSpelling, precedence: &SpellingPrecedence, ) -> ResolvedSpelling { + match best_authored_spelling(score, pitch, precedence) { + Some(resolved) => resolved, + None => ResolvedSpelling { + spelling: inferred, + provenance: SpellingProvenance::Inferred, + }, + } +} + +/// The winning authored spelling for `pitch`, if any: engraved layer, +/// pitch-scoped, explicit, source outranking [`SpellingSourceKind::Inferred`] +/// in `precedence`. Among candidates, lowest precedence rank wins, then +/// highest priority; a remaining tie keeps the first candidate in the score's +/// `spelling_attachments` order, which is canonical (codec-fixed), so the +/// resolution is deterministic across replicas. Shared by +/// [`resolve_spelling`] (authored *override* of an inferred spelling) and the +/// authored-only surfacing path for inference-ineligible pitches +/// (`req:pitch:authored-uninferred`, Pass 12 P12-H7). +fn best_authored_spelling( + score: &Score, + pitch: PitchId, + precedence: &SpellingPrecedence, +) -> Option { let inferred_rank = precedence.rank(SpellingSourceKind::Inferred); - // The best authored override: engraved layer, pitch-scoped, explicit, source - // outranking Inferred. Among candidates, lowest precedence rank wins, then - // highest priority; a remaining tie keeps the first candidate in the score's - // `spelling_attachments` order, which is canonical (codec-fixed), so the - // resolution is deterministic across replicas. let mut best: Option<(usize, i32, &SpellingAttachment)> = None; for att in &score.spelling_attachments { if att.layer.is_some() { @@ -760,22 +837,16 @@ pub fn resolve_spelling( }; } - match best { - Some((_, _, att)) => { - if let SpellingDirective::Explicit(spelling) = &att.directive { - ResolvedSpelling { - spelling: spelling.clone(), - provenance: SpellingProvenance::Authored(att.source.kind()), - } - } else { - unreachable!("filtered to Explicit directives") + best.map(|(_, _, att)| { + if let SpellingDirective::Explicit(spelling) = &att.directive { + ResolvedSpelling { + spelling: spelling.clone(), + provenance: SpellingProvenance::Authored(att.source.kind()), } + } else { + unreachable!("filtered to Explicit directives") } - None => ResolvedSpelling { - spelling: inferred, - provenance: SpellingProvenance::Inferred, - }, - } + }) } // =========================================================================== @@ -1195,6 +1266,17 @@ pub fn resolve_decomposition( event: EventId, inferred: DecompositionAttachment, ) -> DecompositionAttachment { + best_authored_decomposition(score, event).unwrap_or(inferred) +} + +/// The winning authored decomposition for `event`, if any: source outranking +/// [`DecompositionSource::Inferred`] under the fixed default order (ratified +/// Pass 12, P12-H6 — decomposition precedence is not configurable); lowest +/// rank wins; a full tie keeps the earlier attachment in the score's +/// canonical `decomposition_attachments` order. Shared by +/// [`resolve_decomposition`] (authored *override*) and the authored-only +/// surfacing path for inference-ineligible events (Pass 12 P12-H7). +fn best_authored_decomposition(score: &Score, event: EventId) -> Option { let inferred_rank = decomposition_source_rank(&DecompositionSource::Inferred); let mut best: Option<(usize, &DecompositionAttachment)> = None; for att in &score.decomposition_attachments { @@ -1218,10 +1300,7 @@ pub fn resolve_decomposition( } }; } - match best { - Some((_, att)) => att.clone(), - None => inferred, - } + best.map(|(_, att)| att.clone()) } #[cfg(test)] diff --git a/crates/epiphany-core/src/prepass/tests.rs b/crates/epiphany-core/src/prepass/tests.rs index d1a6d4a..6b478d9 100644 --- a/crates/epiphany-core/src/prepass/tests.rs +++ b/crates/epiphany-core/src/prepass/tests.rs @@ -1148,6 +1148,185 @@ fn inferred_source_attachment_does_not_outrank_the_prepass() { assert_eq!(ann.taxonomy.decompositions_inferred, 2); } +#[test] +fn authored_decomposition_surfaces_for_an_ungriddable_event_p12_h7() { + // req:pitch:authored-uninferred (Pass 12, P12-H7): an authored attachment + // targeting an event the pre-pass cannot infer for (off-grid position → + // ungriddable) surfaces as the resolved annotation on its own, counted in + // the dedicated authored-uninferred bucket. + let mut captured = None; + let mut score = metric_score(|idc, voice| { + let eid = idc.mint(); + captured = Some(eid); + let pid = idc.mint::(); + let ev = pitched( + eid, + voice, + r(1, 3), // off-grid (non-dyadic) position → nothing inferred + r(1, 4), + vec![IdentifiedPitch { + id: pid, + pitch: integer_pitch(48), + }], + ); + (vec![ev], vec![]) + }); + let eid = captured.expect("event minted"); + let authored = DecompositionAttachment { + target: eid, + components: vec![NotatedComponent { + base_value: NoteValue::Quarter, + dots: 0, + tuplet: None, + tied_to_next: false, + }], + source: DecompositionSource::UserChosen, + }; + score.decomposition_attachments.push(authored.clone()); + + let ann = derive_annotations(&score, &PrePassProfile::default()); + assert_eq!( + ann.decompositions[&eid], authored, + "the authored attachment surfaces on its own" + ); + assert_eq!( + ann.taxonomy.decomposition_ungriddable, 1, + "the event is still honestly classified ungriddable" + ); + assert_eq!(ann.taxonomy.decompositions_authored_uninferred, 1); + assert_eq!( + ann.taxonomy.decompositions_authored, 0, + "not an override — there was nothing inferred to override" + ); + assert_eq!( + ann.decompositions.len(), + ann.taxonomy.decompositions_inferred + + ann.taxonomy.decompositions_authored + + ann.taxonomy.decompositions_authored_uninferred, + "the harness accounting identity holds" + ); +} + +#[test] +fn inferred_source_attachment_does_not_surface_for_ineligible_events_p12_h7() { + // The rank gate holds on the authored-only path too: a stored attachment + // whose source is `Inferred` does not outrank the pre-pass, so it does + // not surface for an inference-ineligible event either. + let mut captured = None; + let mut score = metric_score(|idc, voice| { + let eid = idc.mint(); + captured = Some(eid); + let pid = idc.mint::(); + let ev = pitched( + eid, + voice, + r(1, 3), + r(1, 4), + vec![IdentifiedPitch { + id: pid, + pitch: integer_pitch(48), + }], + ); + (vec![ev], vec![]) + }); + let eid = captured.expect("event minted"); + score + .decomposition_attachments + .push(DecompositionAttachment { + target: eid, + components: vec![NotatedComponent { + base_value: NoteValue::Quarter, + dots: 0, + tuplet: None, + tied_to_next: false, + }], + source: DecompositionSource::Inferred, + }); + + let ann = derive_annotations(&score, &PrePassProfile::default()); + assert!( + !ann.decompositions.contains_key(&eid), + "an Inferred-source attachment does not surface" + ); + assert_eq!(ann.taxonomy.decompositions_authored_uninferred, 0); +} + +#[test] +fn authored_spelling_surfaces_for_an_unavailable_pitch_p12_h7() { + // The spelling mirror of the surfacing rule: an authored explicit + // attachment on a pitch whose pitch space declares spelling unavailable + // (JI) surfaces with authored provenance; an attachment targeting a pitch + // absent from the score stays diagnostic-only. The derivation stays + // deterministic (byte-equal fingerprints). + let mut captured = None; + let mut score = metric_score(|idc, voice| { + let eid = idc.mint(); + let pid = idc.mint::(); + captured = Some(pid); + let ev = pitched( + eid, + voice, + r(0, 4), + r(1, 4), + vec![IdentifiedPitch { + id: pid, + pitch: ji_pitch(), + }], + ); + (vec![ev], vec![]) + }); + let pid = captured.expect("pitch minted"); + let authored_spelling = PitchSpelling { + nominal: SpellingNominal::Cmn(CmnNominal::D), + accidentals: vec![AccidentalId::new("flat")], + octave: 4, + render_hints: Default::default(), + }; + score.spelling_attachments.push(SpellingAttachment { + scope: SpellingScope::Pitch(pid), + directive: SpellingDirective::Explicit(authored_spelling.clone()), + source: SpellingSource::UserChosen, + priority: 0, + layer: None, + }); + // A second attachment targeting a pitch that exists nowhere in the score: + // preserved canonical state, but it surfaces no annotation. + let dangling = PitchId::new(ReplicaId(0xD00D), 1); + score.spelling_attachments.push(SpellingAttachment { + scope: SpellingScope::Pitch(dangling), + directive: SpellingDirective::Explicit(authored_spelling.clone()), + source: SpellingSource::UserChosen, + priority: 0, + layer: None, + }); + + let ann = derive_annotations(&score, &PrePassProfile::default()); + let resolved = ann + .spellings + .get(&pid) + .expect("the authored spelling surfaces for the unavailable pitch"); + assert_eq!(resolved.spelling, authored_spelling); + assert_eq!( + resolved.provenance, + SpellingProvenance::Authored(crate::pitch::SpellingSourceKind::UserChosen) + ); + assert_eq!(ann.taxonomy.spellings_authored_uninferred, 1); + assert_eq!( + ann.taxonomy.spelling_unavailable, 1, + "the pitch is still honestly classified unavailable" + ); + assert!( + !ann.spellings.contains_key(&dangling), + "an attachment on an absent pitch surfaces nothing" + ); + let again = derive_annotations(&score, &PrePassProfile::default()); + assert_eq!( + ann.canonical_fingerprint(), + again.canonical_fingerprint(), + "the surfacing path is deterministic" + ); +} + #[test] fn decomposition_precedence_ranks_sources_then_canonical_order() { // UserChosen outranks Imported regardless of attachment order (the spec's @@ -1210,14 +1389,14 @@ fn derivation_with_authored_decomposition_is_deterministic() { } #[test] -fn authored_attachment_on_an_ungriddable_event_does_not_surface() { - // The resolution step mirrors the spelling side: it layers authored - // overrides above the pre-pass's *inferred* output. An event the pre-pass - // cannot grid emits nothing to override, so an authored attachment for it - // stays in canonical score state without surfacing as a derived annotation, - // and the event stays honestly counted as ungriddable. (Whether authored - // decompositions should surface for events the algorithm cannot infer for - // is a Pass-12 question — see DECISIONS.md.) +fn authored_attachment_on_an_ungriddable_event_surfaces_p12_h7() { + // The Pass-12 question this test used to park is DECIDED + // (`req:pitch:authored-uninferred`, P12-H7): an authored attachment on an + // event the pre-pass cannot grid SURFACES as the resolved annotation on + // its own — the pre-decision behavior (staying canonical-but-invisible) + // is the one this revision reverses. The event stays honestly counted + // ungriddable; the surfacing is counted in the authored-uninferred + // bucket, not as an override. let mut ids = Vec::new(); let mut score = metric_score(|idc, voice| { let eid = idc.mint(); @@ -1235,13 +1414,17 @@ fn authored_attachment_on_an_ungriddable_event_does_not_surface() { ); (vec![ev], vec![]) }); - score - .decomposition_attachments - .push(tied_quarters(ids[0], DecompositionSource::UserChosen)); + let authored = tied_quarters(ids[0], DecompositionSource::UserChosen); + score.decomposition_attachments.push(authored.clone()); let ann = derive_annotations(&score, &PrePassProfile::default()); - assert!(ann.decompositions.is_empty()); + assert_eq!( + ann.decompositions.get(&ids[0]), + Some(&authored), + "the authored attachment surfaces (P12-H7)" + ); assert_eq!(ann.taxonomy.decomposition_ungriddable, 1); + assert_eq!(ann.taxonomy.decompositions_authored_uninferred, 1); assert_eq!(ann.taxonomy.decompositions_authored, 0); assert_eq!(ann.taxonomy.decompositions_inferred, 0); } diff --git a/crates/epiphany-ops/DECISIONS.md b/crates/epiphany-ops/DECISIONS.md index 187d1c2..7b4d605 100644 --- a/crates/epiphany-ops/DECISIONS.md +++ b/crates/epiphany-ops/DECISIONS.md @@ -940,3 +940,38 @@ selection function). Decided with code to land in the G-pass code tranche: already `DeclaredByExtension`). **K8** retired: genesis is outside the operation set (catalog K1 slots removed, core Ch5 states it). Catalog 0.5.0 → 0.6.0; Binary Format 0.3.0 → 0.4.0. + +### G-pass code-tranche review findings (2026-07-07, all fixed before commit) + +A high-effort review of the code tranche confirmed three correctness findings, +each fixed with a regression test: + +1. **Transpose bypassed P12-K3** — it shifted a `SYSTEM_DERIVED` pitch's + alteration in place, desynchronizing content from the id's derivation + inputs and making the K3 verdict depend on where a snapshot was cut + (a full replay's registry holds the mint content; a post-transpose + snapshot's holds the shifted content). Fixed: system-derived targets are + **skipped** like tombstoned ones (id-namespace filter, so base-free and + graph-aware reduction agree); an all-system-derived transpose reduces as + `SystemDerivedContentImmutable`. Catalog §Transpose updated. +2. **Unestablished rank-4 re-anchors were relabeled `SameCanvasNearer`** — + `containment_rank` returns 4 both for the established same-canvas case and + as the fallthrough when a voice's placement is unresolvable; the P12-C4 + append must not launder the latter into a positive proximity claim. Fixed: + recording routes through `rank_reason`, which downgrades an unestablished + 4 to the honest `ExplicitFallback`; **selection order is unchanged** (the + rank still compares as 4). +3. **Vocabulary generators lagged the appends** — testkit + `precondition_failure_reason`/`reanchor_reason` never emitted discriminants + 12/13/6, so fuzz gates could not catch a renumbering regression. Fixed. + +**Pass-13 candidate (P13-K1, filed not fixed):** the K3 verdict for a system +pitch *introduced by a ModifyEvent replacement value* (never minted — the +collision pre-walk deliberately excludes ModifyEvent) differs across a +snapshot cut: in-session the pitch is not Live (`TargetMissing`); after a +snapshot re-seeds objects + registry from the base graph, the same modify +reads `SystemDerivedContentImmutable`. The asymmetry **predates K3** (the +same split previously read `TargetMissing` vs a silent `Applied` rewrite) and +is a ModifyEvent-introduction question — whether a replacement value may +introduce never-minted pitch ids at all — batched for Pass 13, not +improvised here. diff --git a/crates/epiphany-ops/src/decode.rs b/crates/epiphany-ops/src/decode.rs index fb5c701..48a2796 100644 --- a/crates/epiphany-ops/src/decode.rs +++ b/crates/epiphany-ops/src/decode.rs @@ -221,6 +221,8 @@ fn precondition_reason(reader: &mut Reader<'_>) -> Result Ok(PreconditionFailureReason::ContainerNotEmpty), 11 => Ok(PreconditionFailureReason::TempoMapMalformed), + 12 => Ok(PreconditionFailureReason::SystemDerivedContentImmutable), + 13 => Ok(PreconditionFailureReason::RecreateContentMismatch), tag => Err(MaterializedDecodeError::InvalidTag { kind: "PreconditionFailureReason", tag, @@ -257,6 +259,7 @@ fn reanchor_reason(reader: &mut Reader<'_>) -> Result { reader, ReanchorReasonRegistryId, )?)), + 6 => Ok(ReanchorReason::SameCanvasNearer), tag => Err(MaterializedDecodeError::InvalidTag { kind: "ReanchorReason", tag, @@ -600,6 +603,25 @@ mod tests { } } + #[test] + fn pass12_appended_discriminants_decode() { + assert_eq!( + exact(&[12], precondition_reason).unwrap(), + PreconditionFailureReason::SystemDerivedContentImmutable + ); + assert_eq!( + exact(&[13], precondition_reason).unwrap(), + PreconditionFailureReason::RecreateContentMismatch + ); + assert_eq!( + exact(&[6], reanchor_reason).unwrap(), + ReanchorReason::SameCanvasNearer + ); + // The vocabularies stay bounded: one past the append rejects. + assert!(exact(&[14], precondition_reason).is_err()); + assert!(exact(&[7], reanchor_reason).is_err()); + } + #[test] fn decoder_rejects_truncation_and_trailing_bytes() { let bytes = MaterializedState::default().canonical_bytes(); diff --git a/crates/epiphany-ops/src/effect.rs b/crates/epiphany-ops/src/effect.rs index 45cbf87..cea848a 100644 --- a/crates/epiphany-ops/src/effect.rs +++ b/crates/epiphany-ops/src/effect.rs @@ -161,6 +161,16 @@ pub enum PreconditionFailureReason { ExtensionPrecondition(ExtensionPreconditionId), /// A registered precondition code from a versioned registry. Registered(PreconditionFailureRegistryId), + /// A modify would rewrite the intrinsic content of a `SYSTEM_DERIVED`- + /// namespace object in place, invalidating its content derivation + /// (Pass 12, P12-K3; core spec Ch5 §System-Derived Identifiers). The + /// sanctioned path is minting a replacement object. + SystemDerivedContentImmutable, + /// A create re-carried a live id with *differing* content + /// (operation_catalog §CreateStaff): the target is not missing, its + /// content disagrees (Pass 12, P12-K9 — replaces the `TargetMissing` + /// misnomer at the value-retaining re-create sites). + RecreateContentMismatch, } impl PreconditionFailureReason { @@ -180,6 +190,9 @@ impl PreconditionFailureReason { PreconditionFailureReason::ContainerNotEmpty => 10, // Additive (Phase-3 tranche, SetTempoSegment); appended past 10. PreconditionFailureReason::TempoMapMalformed => 11, + // Additive (Pass-12 G-pass, P12-K3/P12-K9); appended past 11. + PreconditionFailureReason::SystemDerivedContentImmutable => 12, + PreconditionFailureReason::RecreateContentMismatch => 13, } } } @@ -291,6 +304,11 @@ pub enum ReanchorReason { SameRegionNearer, ExplicitFallback, DeclaredByExtension(ReanchorReasonRegistryId), + /// A rank-4 (same-canvas) proximity survivor (Pass 12, P12-C4). + /// Semantically the next rung after `SameRegionNearer`; its wire + /// discriminant is 6 because `DeclaredByExtension` already owned 5 + /// when it was appended. + SameCanvasNearer, } impl ReanchorReason { @@ -302,6 +320,8 @@ impl ReanchorReason { ReanchorReason::SameRegionNearer => 3, ReanchorReason::ExplicitFallback => 4, ReanchorReason::DeclaredByExtension(_) => 5, + // Additive (Pass-12 G-pass, P12-C4); appended past 5. + ReanchorReason::SameCanvasNearer => 6, } } } @@ -397,6 +417,32 @@ mod tests { assert_ne!(a.to_canonical_bytes(), b.to_canonical_bytes()); } + #[test] + fn pass12_appended_discriminants_are_locked() { + // Pass-12 G-pass appends (binary_format 0.4.0): the wire bytes are + // the appended discriminants, nothing prior moved. + assert_eq!( + PreconditionFailureReason::SystemDerivedContentImmutable.to_canonical_bytes(), + vec![12] + ); + assert_eq!( + PreconditionFailureReason::RecreateContentMismatch.to_canonical_bytes(), + vec![13] + ); + assert_eq!( + ReanchorReason::SameCanvasNearer.to_canonical_bytes(), + vec![6] + ); + assert_eq!( + PreconditionFailureReason::TempoMapMalformed.to_canonical_bytes(), + vec![11] + ); + assert_eq!( + ReanchorReason::ExplicitFallback.to_canonical_bytes(), + vec![4] + ); + } + #[test] fn voice_promotion_repair_round_trips_shape() { let r = RepairRecord { diff --git a/crates/epiphany-ops/src/reduce.rs b/crates/epiphany-ops/src/reduce.rs index d479748..754211d 100644 --- a/crates/epiphany-ops/src/reduce.rs +++ b/crates/epiphany-ops/src/reduce.rs @@ -1088,17 +1088,21 @@ struct ReferentContext { /// staff instance are excluded from "nearest". const PROXIMITY_SAME_STAFF_INSTANCE: u8 = 1; -/// Maps an achieved containment-proximity rank (k1 of the "nearest" ordering) -/// to the ratified [`ReanchorReason`] vocabulary. Rank 4 (same canvas) has no -/// ratified reason variant, so a beyond-region survivor is recorded as the -/// explicit fallback rather than appending a new discriminant (see -/// DECISIONS.md — a spec-vocabulary question, batched for Pass 12). +/// Maps an *established* containment-proximity rank (k1 of the "nearest" +/// ordering) to the ratified [`ReanchorReason`] vocabulary. Rank 4 (same +/// canvas) records the appended `SameCanvasNearer` (Pass 12, P12-C4; wire +/// discriminant 6 — `DeclaredByExtension` already owned 5). Callers with a +/// possibly-*unestablished* rank 4 — `containment_rank` also returns 4 when a +/// voice's placement is unresolvable, a selection-order tie the recording +/// must not launder into a positive proximity claim — route through +/// [`Reduction::rank_reason`], which downgrades those to `ExplicitFallback`. fn reason_for_rank(rank: u8) -> ReanchorReason { match rank { 0 => ReanchorReason::SameVoiceNearer, 1 => ReanchorReason::SameStaffInstanceNearer, 2 => ReanchorReason::SameStaffNearer, 3 => ReanchorReason::SameRegionNearer, + 4 => ReanchorReason::SameCanvasNearer, _ => ReanchorReason::ExplicitFallback, } } @@ -3475,7 +3479,7 @@ impl<'a> Reducer<'a> { } else { OperationEffect::NoOp { reason: NoOpReason::PreconditionFailedUnderReduction { - reason: PreconditionFailureReason::TargetMissing, + reason: PreconditionFailureReason::RecreateContentMismatch, }, } }; @@ -3544,7 +3548,7 @@ impl<'a> Reducer<'a> { } else { Err(OperationEffect::NoOp { reason: NoOpReason::PreconditionFailedUnderReduction { - reason: PreconditionFailureReason::TargetMissing, + reason: PreconditionFailureReason::RecreateContentMismatch, }, }) } @@ -4985,6 +4989,37 @@ impl<'a> Reducer<'a> { // write, a StructuralFieldCollision. The resolved value is materialized in the // graph by reduce_onto. The LWW key/diff uses `last_*_modify` working state. + /// A `SYSTEM_DERIVED` pitch's intrinsic content is immutable under + /// reduction (Pass 12, P12-K3; core spec Ch5 §System-Derived + /// Identifiers): its identifier is content-derived, so an in-place + /// rewrite would invalidate the derivation. The check compares the + /// replacement value's canonical pitch bytes against the id's + /// *registered derivation inputs* — the same `system_mints` registry the + /// collision pre-walk maintains (base-seeded occupants plus op mints), + /// so `reduce()` and `reduce_onto()` agree wherever the registry holds + /// the entry. An unregistered id (base-free reduction over a pitch the + /// base seeded) is unverifiable and passes, like the other + /// graph-aware-only preconditions. + /// + /// Known residue (filed as a Pass-13 candidate; see DECISIONS.md): a + /// system pitch *introduced into the graph by a ModifyEvent replacement* + /// (never minted — the pre-walk deliberately excludes ModifyEvent) gets + /// this verdict only after a snapshot re-seeds the registry from the + /// base graph; in-session it reads `TargetMissing` instead. That + /// checkpoint-cut asymmetry for ModifyEvent-introduced content predates + /// this precondition (pre-K3 the same split read `TargetMissing` vs a + /// silent `Applied` rewrite) and is a ModifyEvent-introduction question, + /// not a K3 one. + fn system_derived_rewrite(&self, id: PitchId, value: &Pitch) -> bool { + if id.replica() != ReplicaId::SYSTEM_DERIVED { + return false; + } + match self.system_mints.get(&(ObjectKind::Pitch, id.counter())) { + Some((inputs, _)) => inputs.0 != canonical_pitch_bytes(value), + None => false, + } + } + fn modify_event(&mut self, env: &OperationEnvelope, op: &ModifyEventOp) -> OperationEffect { let event_id = op.event_id(); let ev_obj = TypedObjectId::Event(event_id); @@ -5003,6 +5038,21 @@ impl<'a> Reducer<'a> { } Some(ObjectState::Live) => {} } + // Identity precondition (P12-K3) before the placement precondition: + // a replacement value that rewrites a system-derived pitch's + // intrinsic content in place is refused outright. + let mut carried = Vec::new(); + op.event.collect_identified_pitches(&mut carried); + if carried + .iter() + .any(|ip| self.system_derived_rewrite(ip.id, &ip.pitch)) + { + return OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }; + } // A `ModifyEvent` that moves a metric event's span (a trim or move) is now // materialized, but it must keep invariant 3 (`VoiceEventsSortedNonOverlap`): // refuse a move onto another live event in the voice, or one with a @@ -5207,7 +5257,26 @@ impl<'a> Reducer<'a> { reason: NoOpReason::TargetTombstoned, }; } - for pitch in live { + // P12-K3: a SYSTEM_DERIVED pitch's intrinsic content is immutable — + // an in-place alteration shift would desynchronize the content from + // the id's derivation inputs (and from the `system_mints` registry). + // System-derived targets are *skipped* like tombstoned ones (the + // shift still applies to the remaining targets); a transpose whose + // live targets are all system-derived reduces as a precondition + // no-op. The filter reads only the id's namespace, so base-free and + // graph-aware reduction agree. + let mutable: Vec = live + .into_iter() + .filter(|pitch| pitch.replica() != ReplicaId::SYSTEM_DERIVED) + .collect(); + if mutable.is_empty() { + return OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }; + } + for pitch in mutable { self.graph_transpose_pitch(pitch, op.chromatic_steps); } OperationEffect::Applied @@ -5317,6 +5386,15 @@ impl<'a> Reducer<'a> { } Some(ObjectState::Live) => {} } + // Identity precondition (P12-K3): a system-derived pitch's intrinsic + // content is immutable in place. + if self.system_derived_rewrite(op.pitch, &op.value) { + return OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }; + } let prev = self .pitch_modify_chain .get(&op.pitch) @@ -5586,9 +5664,11 @@ impl<'a> Reducer<'a> { _ => None, }; let reason = match (referent_voice, survivor_voice) { - (Some(referent), Some(survivor)) => { - reason_for_rank(self.containment_rank(referent, survivor)) - } + (Some(referent), Some(survivor)) => self.rank_reason( + self.containment_rank(referent, survivor), + referent, + Some(survivor), + ), // No indexed placement for either side (a // non-metric endpoint): the pre-four-key default. _ => ReanchorReason::SameVoiceNearer, @@ -5703,6 +5783,45 @@ impl<'a> Reducer<'a> { /// same staff instance 1, same staff 2, same region 3, same canvas 4. /// Computed from the base-free ledger indices, so `reduce()` and /// `reduce_onto()` rank identically wherever both represent the scenario. + /// Whether a rank-4 verdict from [`Self::containment_rank`] was + /// *established* (both voices' placements resolve through instance and + /// region, so "same canvas" is a proven fact of the singleton canvas) + /// rather than the unresolvable-placement fallthrough. Recording reads + /// this so an unestablished 4 stays the honest `ExplicitFallback` + /// (Pass 12, P12-C4) — selection order is unaffected either way. + fn canvas_rank_established(&self, referent_voice: VoiceId, candidate_voice: VoiceId) -> bool { + let (Some(referent), Some(candidate)) = ( + self.voice_instance(referent_voice), + self.voice_instance(candidate_voice), + ) else { + return false; + }; + self.instance_region_of(referent).is_some() && self.instance_region_of(candidate).is_some() + } + + /// The [`ReanchorReason`] to *record* for an achieved rank: ranks 0–3 map + /// directly; rank 4 records `SameCanvasNearer` only when the proximity + /// was established ([`Self::canvas_rank_established`]), else the honest + /// `ExplicitFallback`. `survivor_voice` is `None` when the winning + /// candidate's voice is itself unresolvable — never established. + fn rank_reason( + &self, + rank: u8, + referent_voice: VoiceId, + survivor_voice: Option, + ) -> ReanchorReason { + if rank == 4 { + let established = survivor_voice + .is_some_and(|survivor| self.canvas_rank_established(referent_voice, survivor)); + return if established { + ReanchorReason::SameCanvasNearer + } else { + ReanchorReason::ExplicitFallback + }; + } + reason_for_rank(rank) + } + fn containment_rank(&self, referent_voice: VoiceId, candidate_voice: VoiceId) -> u8 { if referent_voice == candidate_voice { return 0; @@ -7729,6 +7848,69 @@ mod tests { ); } + #[test] + fn transpose_skips_system_derived_targets_p12_k3() { + // Review finding on P12-K3: Transpose must not rewrite a + // SYSTEM_DERIVED pitch's intrinsic content in place — that would + // desynchronize the content from the id's derivation inputs (and from + // the `system_mints` registry the modify preconditions consult), + // making the K3 verdict depend on where a snapshot was cut. System + // targets are skipped like tombstoned ones; all-system degenerates to + // the K3 precondition no-op. + use epiphany_core::derive_system_pitch_id; + let content = crate::valuegen::pitch_value_nth(1); + let system_id = derive_system_pitch_id(&content); + let normal = PitchId::new(ReplicaId(9), 501); + + let a = insert_with_pitch_content(1, 0, 10, 1, 100, 0, system_id, &content); + let b = insert_with_pitch_content(1, 1, 11, 2, 101, 0, normal, &content); + let after_inserts = CausalContext::new().with_seen(ReplicaId(1), 1); + // Mixed normal/system targets: the system pitch is skipped, the + // normal one shifts, the op applies. + let t_mixed = prim_env( + 3, + 0, + 30, + after_inserts.clone(), + OperationKind::Transpose(TransposeOp { + targets: vec![system_id, normal], + chromatic_steps: 2, + }), + ); + // All targets system-derived: the K3 precondition no-op. + let t_system = prim_env( + 4, + 0, + 31, + after_inserts, + OperationKind::Transpose(TransposeOp { + targets: vec![system_id], + chromatic_steps: 2, + }), + ); + let mut set = OperationSet::new(); + set.accept_all(vec![a, b, t_mixed.clone(), t_system.clone()]); + let state = set.reduce(); + let effect = |id: OperationId| { + state + .effects + .iter() + .find(|(e, _)| *e == id) + .map(|(_, eff)| eff) + .expect("effect recorded") + }; + assert_eq!(effect(t_mixed.id), &OperationEffect::Applied); + assert_eq!( + effect(t_system.id), + &OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }, + "an all-system-derived transpose refuses under P12-K3" + ); + } + #[test] fn differing_concurrent_resolves_name_both_resolvers_in_the_meta_conflict() { // Chapter 6 §Conflict Resolution Operations: a later differing resolve @@ -8156,6 +8338,187 @@ mod tests { ); } + #[test] + fn a_system_derived_pitch_content_rewrite_is_refused_p12_k3() { + // Pass 12 (P12-K3): a SYSTEM_DERIVED pitch's intrinsic content is + // immutable — an in-place rewrite would invalidate the id's content + // derivation. A modify carrying the *registered* derivation content + // still applies (nothing is rewritten). + use epiphany_core::derive_system_pitch_id; + let content = crate::valuegen::pitch_value_nth(1); + let rewritten = crate::valuegen::pitch_value_nth(2); + let system_id = derive_system_pitch_id(&content); + + let mint = insert_with_pitch_content(1, 0, 10, 1, 100, 0, system_id, &content); + let rewrite = prim_env( + 1, + 1, + 20, + seen_r1(0), + OperationKind::ModifyIdentifiedPitch(ModifyIdentifiedPitchOp { + pitch: system_id, + value: rewritten.clone(), + }), + ); + let same = prim_env( + 1, + 2, + 30, + seen_r1(1), + OperationKind::ModifyIdentifiedPitch(ModifyIdentifiedPitchOp { + pitch: system_id, + value: content.clone(), + }), + ); + let mut set = OperationSet::new(); + set.accept_all(vec![mint.clone(), rewrite.clone(), same.clone()]); + let state = set.reduce(); + + let effect_of = |id: OperationId| { + state + .effects + .iter() + .find(|(e, _)| *e == id) + .map(|(_, eff)| eff) + }; + assert_eq!( + effect_of(rewrite.id), + Some(&OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }), + "rewriting a system-derived pitch's intrinsic content is refused" + ); + assert_eq!( + effect_of(same.id), + Some(&OperationEffect::Applied), + "a modify carrying the registered derivation content passes" + ); + // Determinism: any permutation reduces to identical bytes. + let mut reversed = OperationSet::new(); + reversed.accept_all(vec![same, rewrite, mint]); + assert_eq!(state.canonical_bytes(), reversed.reduce().canonical_bytes()); + } + + #[test] + fn a_modify_event_rewriting_a_system_pitch_is_refused_p12_k3() { + // The same identity precondition through the ModifyEvent path: the + // replacement event carries the system pitch with rewritten content. + use epiphany_core::derive_system_pitch_id; + let content = crate::valuegen::pitch_value_nth(1); + let rewritten = crate::valuegen::pitch_value_nth(2); + let system_id = derive_system_pitch_id(&content); + + let mint = insert_with_pitch_content(1, 0, 10, 1, 100, 0, system_id, &content); + let mut replacement = crate::valuegen::insert_event_value( + EventId::new(ReplicaId(1), 100), + VoiceId::new(ReplicaId(9), 1), + pos(0), + epiphany_core::MusicalDuration::whole(), + &[system_id], + ); + if let Event::Pitched(pe) = &mut replacement { + pe.pitches[0].pitch = rewritten; + } + let modify = prim_env( + 1, + 1, + 20, + seen_r1(0), + OperationKind::ModifyEvent(ModifyEventOp { event: replacement }), + ); + let mut set = OperationSet::new(); + set.accept_all(vec![mint, modify.clone()]); + let state = set.reduce(); + + assert_eq!( + state + .effects + .iter() + .find(|(e, _)| *e == modify.id) + .map(|(_, eff)| eff), + Some(&OperationEffect::NoOp { + reason: NoOpReason::PreconditionFailedUnderReduction { + reason: PreconditionFailureReason::SystemDerivedContentImmutable, + }, + }), + "a ModifyEvent rewriting a carried system pitch is refused" + ); + } + + #[test] + fn a_rank_four_reanchor_records_same_canvas_nearer_p12_c4() { + // Pass 12 (P12-C4): the rank-4 (same-canvas) proximity survivor has + // its own appended reason; ExplicitFallback stays the beyond-ladder + // recording only. + assert_eq!(reason_for_rank(4), ReanchorReason::SameCanvasNearer); + assert_eq!(reason_for_rank(3), ReanchorReason::SameRegionNearer); + assert_eq!(reason_for_rank(5), ReanchorReason::ExplicitFallback); + } + + #[test] + fn an_unestablished_rank_four_reanchor_keeps_the_explicit_fallback() { + // Review finding on P12-C4: `containment_rank` also returns 4 when a + // voice's staff-instance placement is *unresolvable* (here: base-free + // reduction, where inserted voices have no op-created instance), and + // that conflated 4 must NOT be recorded as a positive + // `SameCanvasNearer` claim — the honest recording stays + // `ExplicitFallback`. Selection order is unchanged either way. + let e1 = EventId::new(ReplicaId(1), 100); + let e2 = EventId::new(ReplicaId(1), 101); + let slur = epiphany_core::SlurId::new(ReplicaId(1), 1); + let create = prim_env( + 1, + 2, + 12, + CausalContext::new().with_seen(ReplicaId(1), 1), + create_slur(slur, e1, e2), + ); + let del = prim_env( + 1, + 3, + 13, + CausalContext::new().with_seen(ReplicaId(1), 2), + OperationKind::DeleteEvent(DeleteEventOp { + event: e1, + tuplet_compensation: TupletCompensation::NotInTuplet, + }), + ); + // Different voices on different staff instances, neither instance + // op-created in a region: instance→region never resolves, so + // containment_rank falls through to its unestablished 4. + let a = insert(1, 0, 10, 1, 100, 0); + let mut b = insert(1, 1, 11, 2, 101, 1); + if let OperationPayload::Primitive(OperationKind::InsertEvent(ref mut op)) = b.payload { + op.staff_instance = StaffInstanceId::new(ReplicaId(9), 1); + } + let mut set = OperationSet::new(); + set.accept_all(vec![a, b, create, del.clone()]); + let state = set.reduce(); + let repair = state + .effects + .iter() + .find(|(id, _)| *id == del.id) + .and_then(|(_, eff)| match eff { + OperationEffect::AppliedWithRepair { repairs } => repairs + .iter() + .find(|r| r.target == TypedObjectId::Slur(slur)) + .cloned(), + _ => None, + }) + .expect("the slur endpoint deletion records a re-anchor repair"); + assert_eq!( + repair.kind, + RepairKind::Reanchored { + from: TypedObjectId::Event(e1), + to: TypedObjectId::Event(e2), + reason: ReanchorReason::ExplicitFallback, + }, + "an unresolvable-placement rank 4 records the honest fallback" + ); + } + // --- ResolveEquivocation (operation_catalog §"ResolveEquivocation"). ----- /// A `RespellPitch` envelope at `id` with an explicit causal context. @@ -8614,10 +8977,10 @@ mod tests { effect_of(differing.id), Some(&OperationEffect::NoOp { reason: NoOpReason::PreconditionFailedUnderReduction { - reason: PreconditionFailureReason::TargetMissing, + reason: PreconditionFailureReason::RecreateContentMismatch, }, }), - "a differing value under a live id is a precondition no-op" + "a differing value under a live id is a precondition no-op (P12-K9)" ); assert!(matches!( state.objects.get(&TypedObjectId::Staff(staff_id)), @@ -8756,10 +9119,10 @@ mod tests { .map(|(_, eff)| eff), Some(&OperationEffect::NoOp { reason: NoOpReason::PreconditionFailedUnderReduction { - reason: PreconditionFailureReason::TargetMissing, + reason: PreconditionFailureReason::RecreateContentMismatch, }, }), - "a differing value under a live signature id is a precondition no-op" + "a differing value under a live signature id is a precondition no-op (P12-K9)" ); } diff --git a/crates/epiphany-testkit/src/generators.rs b/crates/epiphany-testkit/src/generators.rs index e8b4dff..874b302 100644 --- a/crates/epiphany-testkit/src/generators.rs +++ b/crates/epiphany-testkit/src/generators.rs @@ -410,7 +410,7 @@ pub fn conflict_registry(rng: &mut Rng) -> ConflictRegistry { /// A typed precondition failure (every core and registered variant). pub fn precondition_failure_reason(rng: &mut Rng) -> PreconditionFailureReason { - match rng.below(12) { + match rng.below(14) { 0 => PreconditionFailureReason::TargetMissing, 1 => PreconditionFailureReason::TargetTombstoned, 2 => PreconditionFailureReason::WrongRegionTimeModel, @@ -421,7 +421,9 @@ pub fn precondition_failure_reason(rng: &mut Rng) -> PreconditionFailureReason { 7 => PreconditionFailureReason::VoiceMissing, 8 => PreconditionFailureReason::ContainerNotEmpty, 9 => PreconditionFailureReason::TempoMapMalformed, - 10 => PreconditionFailureReason::ExtensionPrecondition(ExtensionPreconditionId( + 10 => PreconditionFailureReason::SystemDerivedContentImmutable, + 11 => PreconditionFailureReason::RecreateContentMismatch, + 12 => PreconditionFailureReason::ExtensionPrecondition(ExtensionPreconditionId( rng.next_u64() as u128, )), _ => PreconditionFailureReason::Registered(PreconditionFailureRegistryId( @@ -447,12 +449,13 @@ pub fn no_op_reason(rng: &mut Rng) -> NoOpReason { /// A re-anchor reason covering every variant. pub fn reanchor_reason(rng: &mut Rng) -> ReanchorReason { - match rng.below(6) { + match rng.below(7) { 0 => ReanchorReason::SameVoiceNearer, 1 => ReanchorReason::SameStaffInstanceNearer, 2 => ReanchorReason::SameStaffNearer, 3 => ReanchorReason::SameRegionNearer, 4 => ReanchorReason::ExplicitFallback, + 5 => ReanchorReason::SameCanvasNearer, _ => ReanchorReason::DeclaredByExtension(ReanchorReasonRegistryId(rng.next_u64() as u128)), } } diff --git a/crates/epiphany-testkit/src/prepass_harness.rs b/crates/epiphany-testkit/src/prepass_harness.rs index 2e7e2a4..50739f1 100644 --- a/crates/epiphany-testkit/src/prepass_harness.rs +++ b/crates/epiphany-testkit/src/prepass_harness.rs @@ -28,10 +28,10 @@ //! 5 keeps passing with non-trivial pre-pass outputs downstream. use epiphany_core::{ - derive_annotations, AccidentalId, AnalysisLayerId, CmnNominal, DerivedAnnotations, Event, - EventDuration, MusicalDuration, PitchSpelling, PrePassProfile, RationalTime, Score, - SpellingAttachment, SpellingDirective, SpellingNominal, SpellingProvenance, SpellingScope, - SpellingSource, SpellingSourceKind, + derive_annotations, AccidentalId, AnalysisLayerId, CmnNominal, DecompositionSource, + DerivedAnnotations, Event, EventDuration, MusicalDuration, PitchSpelling, PrePassProfile, + RationalTime, Score, SpellingAttachment, SpellingDirective, SpellingNominal, + SpellingProvenance, SpellingScope, SpellingSource, SpellingSourceKind, }; use crate::corpus; @@ -119,18 +119,26 @@ fn spelling_pitch_class(s: &PitchSpelling) -> Option { } /// Every *eligible* embedded pitch carries a non-trivial spelling that realizes -/// its 12-TET pitch class; every spelling-unavailable pitch is left unspelled. +/// its 12-TET pitch class. A spelling-unavailable pitch is never spelled by the +/// *algorithm*, but an authored attachment MAY surface for it +/// (`req:pitch:authored-uninferred`, Pass 12 P12-H7). pub fn assert_eligible_pitches_spelled(score: &Score, ann: &DerivedAnnotations) { for e in score.events.iter() { let mut pitches = Vec::new(); e.collect_identified_pitches(&mut pitches); for ip in pitches { match ip.pitch.twelve_tet_class() { - None => assert!( - !ann.spellings.contains_key(&ip.id), - "spelling-unavailable pitch {:?} was spelled anyway", - ip.id - ), + None => { + // P12-H7: an authored spelling may surface for an + // unavailable pitch; an *inferred* one is still a bug. + if let Some(rs) = ann.spellings.get(&ip.id) { + assert!( + matches!(rs.provenance, SpellingProvenance::Authored(_)), + "spelling-unavailable pitch {:?} was inferred-spelled anyway", + ip.id + ); + } + } Some(class) => { let rs = ann.spellings.get(&ip.id).unwrap_or_else(|| { panic!( @@ -175,9 +183,15 @@ pub fn assert_eligible_pitches_spelled(score: &Score, ann: &DerivedAnnotations) } } -/// Every decomposition H emits targets a decomposable event, has a consistent -/// tie chain, and its components' **sounding** durations reconstruct the event's -/// musical duration exactly (Chapter 3 invariant 15), recomputed independently. +/// Every decomposition H's *algorithm* emits targets a decomposable event, has +/// a consistent tie chain, and its components' **sounding** durations +/// reconstruct the event's musical duration exactly (Chapter 3 invariant 15), +/// recomputed independently. Authored entries (overrides and the P12-H7 +/// authored-uninferred surfacings) are exempt from the algorithm-output +/// invariants: P12-H7 deliberately admits inference-ineligible targets +/// (non-decomposable kinds, non-musical durations, ungriddable spans), and +/// authored well-formedness is invariant 15's graph-level jurisdiction, not +/// the pre-pass gate's. pub fn assert_decompositions_reconstruct(score: &Score, ann: &DerivedAnnotations) { for (eid, d) in &ann.decompositions { assert_eq!( @@ -191,6 +205,12 @@ pub fn assert_decompositions_reconstruct(score: &Score, ann: &DerivedAnnotations .events .get(*eid) .unwrap_or_else(|| panic!("decomposition targets non-live event {eid:?}")); + if !matches!(d.source, DecompositionSource::Inferred) { + // Authored entry: surfaced under precedence (override) or P12-H7 + // (authored-uninferred). The remaining checks are algorithm-output + // guarantees and do not apply. + continue; + } assert!( matches!(ev, Event::Pitched(_) | Event::Unpitched(_) | Event::Rest(_)), "decomposition targets a non-decomposable event kind ({eid:?})" @@ -232,10 +252,14 @@ pub fn assert_decompositions_reconstruct(score: &Score, ann: &DerivedAnnotations // Map and taxonomy counts agree: the effective map is exactly the inferred // plus authored-override outcomes (an authored `DecompositionAttachment` // outranking `Inferred` replaces the derived one and is counted - // distinctly, mirroring the spelling buckets). + // distinctly, mirroring the spelling buckets), plus authored-only + // surfacings for inference-ineligible events (Pass 12 P12-H7, + // `req:pitch:authored-uninferred`). assert_eq!( ann.decompositions.len(), - ann.taxonomy.decompositions_inferred + ann.taxonomy.decompositions_authored, + ann.taxonomy.decompositions_inferred + + ann.taxonomy.decompositions_authored + + ann.taxonomy.decompositions_authored_uninferred, "decomposition map size disagrees with the taxonomy counts" ); } diff --git a/spec/operation_catalog.pdf b/spec/operation_catalog.pdf index dbcd24be408f82dfab5956c8a9331747e80031da..8e00fd46c1f55e06c4b0940380cfa9aff565c31d 100644 GIT binary patch delta 50506 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 delta 49855 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