From 86635e43e14bdbb35a26839dc9b2ebbc1fbbd004 Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Thu, 9 Jul 2026 13:32:37 -0400 Subject: [PATCH] Two-sided inter-staff renegotiation, and the cascade defect it uncovered ENGRAVER_VERSION 11 -> 12. The inter-staff solve now closes a slack pair as well as opening a crowded one, realizing the InterStaffGap band's declared height exactly. SYSTEM_STAFF_PITCH is demoted from a floor to an initial arrangement the solve fully renegotiates. This is what vertical_density_penalty was reporting: an un-pressured multi-staff system sat at 0.739, honest sprawl against the declared gap, because the axis is symmetric and the solve only ever expanded. The band's height had no agreed meaning, so pin it: it is an INK CLEARANCE -- the separation between the two staves' outermost content, exactly the unit req:qmc:vertical measures. preferred 2.0 -> 5.0, min 1.0 -> 2.0. The old 2.0 was a placeholder reconciled with nothing: neither the 8.0 staff-box gap the fixed pitch of 12 produces, nor the ~6.4 ink clearance it leaves for plain content. Realizing it would have crushed a relaxed system to a pitch of ~7.6. At 5.0 plain ledgered content settles near a pitch of 10.6. Making the solve two-sided immediately exposed a CASCADE DEFECT latent since v11. The recurrence subtracted the upper staff's shift from the measured gap and then added it back through the accumulator, so every pair below the first was over-separated by exactly the shift above it. Both staves move; the relation is shift_lower = shift_upper + target - (upper_lo - lower_hi), the UNSHIFTED gap. three_staff_close_content's lower pair realized 21.06 against a declared 4.0. It was invisible on two-staff fixtures (shift_upper = 0) and invisible to inter_staff_shifts_cascade_down_three_staves, which asserted only s2 > s1 -- true under both the correct and the double-counting recurrence. What caught it was the metric measuring realized clearance back from the BAKED output instead of the solve's own extents. Reading back solver intent would have reported 0 and shipped the over-separation again. That design choice was made one commit earlier for exactly this reason; the catalog rationale now recommends it to any conforming implementation. Once the solve realizes each declared clearance exactly, every inter-staff unit is 0 on a healthy solve -- the axis becomes a solver self-check, and its MEAN can no longer distinguish "measured every realization" from "measured one". So vertical_raw is split into vertical_units and the regressions assert the unit SET. Four mutations verified: the double-counting recurrence, expand-only, the glyph-members band filter, and first-system-only measurement each fail a named test. No normative change, no version move: QMC formula, units, anchors, thresholds all untouched; only its non-normative rationale is refreshed. Churn is the two multi-staff engrave goldens: two_staff grew by exactly 3.0 (the target change, no cascade); three_staff SHRANK by 9.06 -- the same +3 per pair, less the 17.06 of over-separation the defect was adding. Single-staff and every stub golden are byte-stable. The 5.0 was the user's call. 4.0 ("one staff height") was chosen first and withdrawn once its true consequence -- pitch 9.57, not the 11.04 an arithmetic slip of mine had projected -- was measured rather than inferred. The slip: deriving plain-content ink clearance from an aggregate metric by assuming two contributing units when it had three. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/epiphany-engrave/DECISIONS.md | 78 +++++++- crates/epiphany-engrave/src/casting.rs | 58 +++--- crates/epiphany-engrave/src/lib.rs | 166 +++++++++--------- crates/epiphany-engrave/src/quality.rs | 88 +++++++++- .../epiphany-layout-ir/src/vertical_band.rs | 24 ++- ...e_staff_close_content.engrave.snapshot.txt | 2 +- .../three_staff_close_content.engrave.svg | 112 ++++++------ ...o_staff_close_content.engrave.snapshot.txt | 2 +- .../two_staff_close_content.engrave.svg | 42 ++--- spec/PASS12_RATIFICATION_LOG.md | 42 +++++ spec/quality_metric_catalog.pdf | Bin 148783 -> 149331 bytes spec/quality_metric_catalog.tex | 12 +- 12 files changed, 435 insertions(+), 191 deletions(-) diff --git a/crates/epiphany-engrave/DECISIONS.md b/crates/epiphany-engrave/DECISIONS.md index 951882a..d5cadab 100644 --- a/crates/epiphany-engrave/DECISIONS.md +++ b/crates/epiphany-engrave/DECISIONS.md @@ -817,10 +817,12 @@ is untouched. Locked by `inter_staff_solve_separates_colliding_staves` (the two-staff pressure fixture's staff-line gap opens past the fixed pitch while a single-staff score keeps one staff per system) and the `two_staff_close_content` render golden (the visible before/after: slice 1 tight, slice 2 separated). -**Deferred:** compressing an OVER-wide fixed gap toward preferred (the solve +~~**Deferred:** compressing an OVER-wide fixed gap toward preferred (the solve only expands, never pulls staves together — the fixed pitch is generous by -default, so this is rarely wanted); per-staff spring *stretch* to fill spare -system height (the inter-system justification carries the fill for now). +default, so this is rarely wanted).~~ **DONE** — see "Two-sided renegotiation" +below; "rarely wanted" was wrong, and the metric said so. +**Still deferred:** per-staff spring *stretch* to fill spare system height (the +inter-system justification carries the fill for now). **The cascade, and why it grows faster than the raw corrections.** A pair's gap is measured against the upper staff's **already shifted** bottom, so staff *i*'s @@ -943,3 +945,73 @@ wanted") is therefore promoted from *rarely wanted* to **measurably wrong**: any un-pressured multi-staff system now reports honest sprawl until the solve can pull staves together. Named here rather than fixed in the same breath — compression is a layout change (golden churn, `ENGRAVER_VERSION` move), not a measurement one. + +## Two-sided renegotiation, and the cascade defect it uncovered (2026-07-09) + +`ENGRAVER_VERSION` 11 → 12. The inter-staff solve now **closes a slack pair as +well as opening a crowded one**, realizing the `InterStaffGap` band's declared +height exactly. The constrained stage's fixed `SYSTEM_STAFF_PITCH` is demoted +from a floor to an initial arrangement the solve fully renegotiates. + +**Why:** the expand-only solve made `vertical_density_penalty` report honest +sprawl on every relaxed multi-staff system (0.739 on `two_staff_wrapping_pressure`). +The axis is symmetric — a gap wider than preferred is sprawl exactly as a +narrower one is crowding — so either the layout or the number was wrong. It was +both, in different ways. + +**What the band's height MEANS.** It is an **ink clearance**: the separation +between the two staves' outermost content (ledgers, stems, slurs), which is the +unit `req:qmc:vertical` measures. The old `preferred = 2.0` was a placeholder +reconciled with nothing — neither the 8.0 staff-box gap the fixed pitch of 12 +produces, nor the ~6.4 ink clearance that stacking leaves for plain content. +Realizing 2.0 would have crushed a relaxed system to a staff pitch of ~7.6. +`preferred` is now **5.0** (a staff height plus a space) and `min` **2.0** — plain +ledgered content settles near a pitch of 10.6, close to convention, while +ledgered or slurred content pushes the staves apart on its own. The user chose +this value; `4.0` ("one staff height") was rejected once its true consequence — +pitch 9.57, not the 11.04 an arithmetic slip of mine had projected — was measured +rather than inferred. + +**The cascade was wrong, and had been since v11.** Making the solve two-sided +made `three_staff_close_content` report `vertical_density_penalty` **1.0**: its +lower pair realized 21.06 against a declared 4.0. The recurrence subtracted the +upper staff's shift from the measured gap and then added it back through the +accumulator: + +```text +gap = (upper_lo - shift_upper) - lower_hi // WRONG +shift += target - gap // ⇒ realized = target + shift_upper +``` + +Both staves move, so the correct relation is +`shift_lower = shift_upper + target - (upper_lo - lower_hi)` — the **unshifted** +gap. Every pair below the first was over-separated by exactly the shift above it. +It was invisible on two-staff fixtures (`shift_upper = 0`) and invisible to +`inter_staff_shifts_cascade_down_three_staves`, which asserted only `s2 > s1` — +true under both the correct and the double-counting recurrence. + +**What caught it was the metric.** Measuring the realized clearance back from the +BAKED output, rather than reading the solver's own `staff_ext`, is what made an +independent check possible; had the axis read back solver intent it would have +reported 0 and the defect would have shipped again. That design choice was made +one commit earlier for exactly this reason, and it paid immediately. + +**Locking it.** Once the solve realizes each declared clearance exactly, every +inter-staff unit is `0` on a healthy solve — the axis becomes a *solver +self-check*, and its mean can no longer distinguish "measured every realization" +from "measured one". So `vertical_raw` is split into `vertical_units`, and the +regressions assert the **unit set**: `a_glyphless_staff_band_still_contributes_an_ +inter_staff_unit` (2 units, one per system) and `each_system_realizing_a_gap_band_ +contributes_its_own_unit` (2 units for the wrapping fixture, 2 for the three-staff +cascade), each unit ≈ 0. Four mutations verified: the double-counting recurrence, +expand-only, the glyph-`members` band filter, and first-system-only measurement +each fail a named test. + +**Churn:** the two multi-staff engrave goldens only. `two_staff_close_content` +grew by exactly 3.0 (the target change, no cascade); `three_staff_close_content` +*shrank* by 9.06 — the same +3 per pair, less the 17.06 of over-separation the +cascade defect was adding. Single-staff and every stub golden are byte-stable. + +**Still open:** genuinely staff-less content placed *between* two staves. No +primitive can name an `InterStaffGap` band today, so it remains unreachable +rather than latent. diff --git a/crates/epiphany-engrave/src/casting.rs b/crates/epiphany-engrave/src/casting.rs index 79621ae..e2b048d 100644 --- a/crates/epiphany-engrave/src/casting.rs +++ b/crates/epiphany-engrave/src/casting.rs @@ -771,17 +771,25 @@ pub(crate) fn cast_off( // Solve each system's inter-staff gaps: order the staves top-to-bottom by // their reference y (staff line, else content mid), keep that order fixed, - // and shift each staff down until its gap to the one above meets the gap - // band's own preferred height. `staff_shift[(system, staff)]` is the - // downward shift (subtracted from y); the top staff's is 0. + // and shift each staff so its INK CLEARANCE to the one above realizes the + // gap band's declared height. `staff_shift[(system, staff)]` is the downward + // shift (subtracted from y); the top staff's is 0. // - // The gap the solve targets is the one the REGION DECLARED, read from the - // `InterStaffGap` band `to_constrained` emitted for that pair, not from the - // band constructor's default. That is what makes the band a height model - // rather than a constant: a region that declares a wider gap gets one, and - // `vertical_density_penalty` — which scores the realized gap against this - // same declared band — agrees with the solve by construction rather than by - // both happening to call the same constructor. + // The renegotiation is TWO-SIDED. A pair whose content collides is pushed + // apart; a pair the constrained stage left slack is pulled together. The + // fixed `SYSTEM_STAFF_PITCH` that stage stacks by is therefore an initial + // arrangement, not a floor: the band model is the height model, and the solve + // realizes it. (Expanding only was the earlier behaviour, and it was + // measurably wrong — `vertical_density_penalty` scored honest sprawl on every + // relaxed multi-staff system, because a gap wider than preferred is sprawl + // exactly as a narrower one is crowding.) + // + // The target is the gap band's `preferred_height`, held at or above its + // `min_height` — the hardest squeeze permitted. Validation already brackets + // preferred by min and max, so the clamp is belt-and-braces rather than a + // second policy. The band is the one the REGION DECLARED, not the + // constructor's default, so the solve and `vertical_density_penalty` — which + // scores the realized clearance against that same band — read one number. // // Gap `g` separates the region's staves `g-1` and `g` (see `to_constrained`). // Every staff of a region carries content in every system of that region — @@ -789,20 +797,18 @@ pub(crate) fn cast_off( // staves present here are the region's full staff order and the window index // is the gap index. A band that somehow does not exist falls back to the // constructor's default rather than silently skipping the pair. - let default_gap = VerticalBand::inter_staff_gap(VerticalBandId(0)) - .preferred_height - .0; + let fallback = VerticalBand::inter_staff_gap(VerticalBandId(0)); let mut staff_shift: BTreeMap<(usize, StaffId), f32> = BTreeMap::new(); for (s, plan) in systems.iter().enumerate() { let region_layout_id = input.regions[plan.region].provenance.stable_id; - let preferred_gap = |gap_index: usize| -> f32 { + let target_gap = |gap_index: usize| -> f32 { let id = inter_staff_gap_id(region_layout_id, gap_index); - input + let band = input .vertical_bands .iter() .find(|band| band.id == id) - .map(|band| band.preferred_height.0) - .unwrap_or(default_gap) + .unwrap_or(&fallback); + band.preferred_height.0.max(band.min_height.0) }; let mut staves: Vec<(StaffId, (f32, f32))> = staff_ext .iter() @@ -824,9 +830,21 @@ pub(crate) fn cast_off( let (upper, (upper_lo, _)) = w[0]; let (lower, (_, lower_hi)) = w[1]; staff_shift.insert((s, upper), shift); - // Realized gap after the upper's shift: (upper_lo - shift) − lower_hi. - let gap = (upper_lo - shift) - lower_hi; - shift += (preferred_gap(g + 1) - gap).max(0.0); + // Both staves move, so solve the recurrence rather than guessing it. + // With `shift` the upper staff's cumulative shift, the realized + // clearance is `(upper_lo - shift_upper) - (lower_hi - shift_lower)`, + // and setting that equal to the target gives + // + // shift_lower = shift_upper + target - (upper_lo - lower_hi) + // + // — the UNSHIFTED gap. Subtracting `shift_upper` from the gap here + // and adding it back through `shift +=` would count it twice, which + // over-separated every pair below the first by exactly the shift + // above it (invisible on two staves, where that shift is 0). The + // correction is signed: positive opens a crowded pair, negative + // closes a slack one, and it accumulates down the stack. + let gap = upper_lo - lower_hi; + shift += target_gap(g + 1) - gap; staff_shift.insert((s, lower), shift); } if staves.len() == 1 { diff --git a/crates/epiphany-engrave/src/lib.rs b/crates/epiphany-engrave/src/lib.rs index 14da586..9656ea7 100644 --- a/crates/epiphany-engrave/src/lib.rs +++ b/crates/epiphany-engrave/src/lib.rs @@ -204,8 +204,16 @@ pub struct Engraver { /// gaps between a system's staves are renegotiated so tightly ledgered or /// slurred adjacent staves separate to the band model's preferred gap; a /// multi-staff score whose staves press together shifts them apart, while a -/// single-staff score — with no inter-staff pair — is unchanged). -pub const ENGRAVER_VERSION: SolverVersion = SolverVersion(11); +/// single-staff score — with no inter-staff pair — is unchanged), and to `12` +/// when that solve became **two-sided** (it now closes a slack pair as well as +/// opening a crowded one, realizing the `InterStaffGap` band's declared ink +/// clearance exactly; the constrained stage's fixed `SYSTEM_STAFF_PITCH` is an +/// initial arrangement, not a floor. Every multi-staff score's staff distances +/// move — plain content settles near a pitch of 10.6 staff spaces — while a +/// single-staff score is again unchanged. The same version repairs a cascade +/// defect: a pair below the first was over-separated by exactly the shift above +/// it, so 3+-staff scores tighten further). +pub const ENGRAVER_VERSION: SolverVersion = SolverVersion(12); impl Engraver { /// An engraver casting off against the given page geometry. @@ -2333,39 +2341,67 @@ mod tests { ); } - /// A staff band that owns no GLYPHS is still a staff of its region. The - /// percussion placeholder's clef has no bundled glyph (it engraves to a - /// traced anchor stroke) and it carries no notes, so its band's `members` - /// list — which holds glyphs only — is empty, while the band does own its - /// five staff-line strokes. Identifying a region's staff bands by their - /// glyph members would drop it from the axis entirely, reintroducing the - /// very glyph-members assumption the content-extent measurement sheds. + /// A staff band that owns no GLYPHS is still a staff of its region: the + /// percussion placeholder's clef has no bundled glyph (a traced anchor + /// stroke) and it carries no notes, so its band's glyph `members` list is + /// empty while the band owns its five staff-line strokes. The solve must + /// still separate it. (That the *metric* also counts its gap is locked by + /// `quality::tests::a_glyphless_staff_band_still_contributes_an_inter_staff_unit`.) #[test] - fn a_staff_band_owning_no_glyphs_still_contributes_its_gap() { + fn a_staff_band_owning_no_glyphs_is_still_laid_out_as_a_staff() { use epiphany_layout_ir::{to_constrained, to_logical}; - let input = to_constrained(&to_logical( - &epiphany_testkit::fixtures::percussion_placeholder_staff(1), - )); - let report = Engraver::default().solve(&input, &SolverConfig::default()); + let report = Engraver::default().solve( + &to_constrained(&to_logical( + &epiphany_testkit::fixtures::percussion_placeholder_staff(1), + )), + &SolverConfig::default(), + ); assert_eq!(report.status, SolveStatus::Solved); for page in &report.layout.pages { for sys in &page.systems { - assert_eq!( - sys.staves.len(), - 2, - "the glyph-less placeholder is still laid out as a staff" - ); + assert_eq!(sys.staves.len(), 2, "the placeholder is a staff"); } } - // Its gap to the melody staff is slack (the solve expands, never - // compresses), so the band contributes a large deviation. Dropping the - // band would leave the region with one staff, no inter-staff unit, and - // an axis of exactly 0. - let density = report.metric_vector.vertical_density_penalty.0; - assert!( - density > 0.5, - "the glyph-less band's gap reaches the axis: {density}" + assert_eq!(report.metric_vector.collision_penalty.0, 0.0); + } + + /// The solve sizes each system's gaps from that system's own content, so one + /// region's systems end up at genuinely different staff distances: the system + /// carrying the colliding first measure opens wide, the slack one after it is + /// pulled CLOSER than the constrained stage's fixed pitch. Two-sided + /// renegotiation is what makes the second half of that sentence true. + #[test] + fn each_system_solves_its_own_staff_distance() { + use epiphany_layout_ir::{to_constrained, to_logical}; + let report = Engraver::default().solve( + &to_constrained(&to_logical( + &epiphany_testkit::fixtures::two_staff_wrapping_pressure(1), + )), + &SolverConfig::default(), ); + let systems: Vec<_> = report + .layout + .pages + .iter() + .flat_map(|page| &page.systems) + .collect(); + assert_eq!(systems.len(), 2, "the region wraps into two systems"); + let pitch = |sys: &epiphany_layout_ir::ResolvedSystem| { + assert_eq!(sys.staves.len(), 2, "both staves ride every system"); + sys.staves[0].bounding_box.origin.y.0 - sys.staves[1].bounding_box.origin.y.0 + }; + let (first, second) = (pitch(systems[0]), pitch(systems[1])); + assert!( + first > second + 8.0, + "the pressured system opens far wider: {first} vs {second}" + ); + // The constrained stage stacks at SYSTEM_STAFF_PITCH = 12; the slack + // system is COMPRESSED below it, which an expand-only solve cannot do. + assert!( + second < 12.0, + "the slack system is pulled tighter than the fixed pitch: {second}" + ); + assert_eq!(report.metric_vector.collision_penalty.0, 0.0); } #[test] @@ -2436,17 +2472,25 @@ mod tests { /// Three staves in one system, with deliberately ASYMMETRIC pressure: the /// upper pair collides hard (C1 against C7), the lower pair only gently. A - /// staff's shift must accumulate the corrections of every pair above it, - /// because each pair's gap is measured against the upper staff's *already - /// shifted* position. So the bottom staff's shift is large — it must clear - /// the middle staff where the middle staff now sits, not where it started. + /// staff's shift accumulates the corrections of every pair above it — the + /// bottom staff must clear the middle staff where the middle staff now sits, + /// not where it started — so `shift_lower = shift_upper + target - gap_raw`, + /// with `gap_raw` the pair's UNSHIFTED clearance. /// - /// That is exactly what a solve sizing each pair independently gets wrong: - /// it would measure the lower pair against the middle staff's ORIGINAL - /// position, hand the bottom staff only its own small correction, and leave - /// it above the middle staff's new position — closing their staff-line gap - /// to well under the fixed pitch. Verified by mutation: with the cascade - /// removed this test fails on both `s2 > s1` and the staff-line gap. + /// A solve sizing each pair independently gets this wrong the obvious way: + /// it hands the bottom staff only its own small correction and leaves it + /// above the middle staff's new position. Verified by mutation: with the + /// cascade removed this test fails on `s2 > s1`. + /// + /// It is wrong the *subtle* way too, by subtracting `shift_upper` from the + /// measured gap and then adding it back through the accumulator — which + /// over-separates every pair below the first by exactly the shift above it. + /// That defect shipped in `ENGRAVER_VERSION` 11 and this test could not see + /// it (`s2 > s1` holds either way; two-staff fixtures have `shift_upper = 0`). + /// It is caught by `quality::tests::each_system_realizing_a_gap_band_ + /// contributes_its_own_unit`, which asserts every pair realizes its declared + /// clearance — the over-separated lower pair reported 21.06 against a + /// declared 4.0. #[test] fn inter_staff_shifts_cascade_down_three_staves() { use epiphany_layout_ir::{to_constrained, to_logical}; @@ -2519,54 +2563,6 @@ mod tests { assert!(gaps[2] < 2.0, "and sits close against it: {}", gaps[2]); } - /// A gap band realized in several systems contributes a unit PER SYSTEM. - /// The inter-staff solve sizes each system's gaps from that system's own - /// content, so one band's realized height genuinely differs across a - /// region's systems — here 15.93 staff spaces in the system carrying the - /// colliding first measure, 7.87 in the slack one after it. Measuring only - /// the first system realizing the band (as this metric once did, on the - /// since-falsified premise that rigid system translation makes every - /// realization agree) would report the pressured system's near-perfect gap - /// and discard the slack one entirely. - #[test] - fn inter_staff_gaps_are_measured_in_every_system_that_realizes_them() { - use epiphany_layout_ir::{to_constrained, to_logical}; - let report = Engraver::default().solve( - &to_constrained(&to_logical( - &epiphany_testkit::fixtures::two_staff_wrapping_pressure(1), - )), - &SolverConfig::default(), - ); - let systems: Vec<_> = report - .layout - .pages - .iter() - .flat_map(|page| &page.systems) - .collect(); - assert_eq!(systems.len(), 2, "the region wraps into two systems"); - let gap = |sys: &epiphany_layout_ir::ResolvedSystem| { - assert_eq!(sys.staves.len(), 2, "both staves ride every system"); - let (top, bottom) = (&sys.staves[0].bounding_box, &sys.staves[1].bounding_box); - top.origin.y.0 - (bottom.origin.y.0 + bottom.size.height.0) - }; - let (first, second) = (gap(systems[0]), gap(systems[1])); - assert!( - first > second + 4.0, - "the pressured system opens much further than the slack one: {first} vs {second}" - ); - - // The slack system's gap sits well past the band's preferred height (the - // solve expands but never compresses), so it contributes a large - // deviation. The pressured system was solved to preferred and contributes - // ~0. A first-system-only measurement would therefore report ~0 overall; - // counting both realizations reports the sprawl honestly. - let density = report.metric_vector.vertical_density_penalty.0; - assert!( - density > 0.5, - "the slack system's sprawl reaches the axis: {density}" - ); - } - #[test] fn vertical_justification_fills_non_final_pages() { use epiphany_layout_ir::{Margins, Size2D, StaffSpace}; diff --git a/crates/epiphany-engrave/src/quality.rs b/crates/epiphany-engrave/src/quality.rs index fbaa7cd..4291339 100644 --- a/crates/epiphany-engrave/src/quality.rs +++ b/crates/epiphany-engrave/src/quality.rs @@ -329,6 +329,29 @@ fn spacing_raw(census: &SystemCensus) -> f64 { /// relative deviation `|r − p| / p` over the realized inter-staff and /// inter-system gaps (see the module docs for the unit reconstruction). fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemCensus) -> f64 { + let units = vertical_units(input, cast, census); + mean_or_zero(&[units.inter_staff, units.inter_system].concat()) +} + +/// The axis's contributing units, split by kind (catalog §`vertical_density_penalty`: +/// "each *realization* … contributes one unit per system"). +/// +/// Split out so tests can assert the unit **set**, not merely its mean. Once the +/// inter-staff solve realizes each gap band's declared clearance exactly, every +/// inter-staff unit is `0` on a healthy solve — the axis is a self-check that +/// fires only on a solver or bake defect. Its mean therefore cannot distinguish +/// "measured every realization" from "measured one", which is precisely the +/// defect this split lets a regression catch. +struct VerticalUnits { + inter_staff: Vec, + inter_system: Vec, +} + +fn vertical_units( + input: &ConstrainedLayoutIR, + cast: &CastLayout, + census: &SystemCensus, +) -> VerticalUnits { let mut per_unit: Vec = Vec::new(); // --- InterStaffGap bands declared by the constrained input ------------- @@ -455,6 +478,8 @@ fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemC } } + let inter_staff = std::mem::take(&mut per_unit); + // --- Realized inter-system gaps (consecutive systems on a page) -------- let preferred = f64::from( VerticalBand::inter_system_gap(VerticalBandId(0)) @@ -473,7 +498,10 @@ fn vertical_raw(input: &ConstrainedLayoutIR, cast: &CastLayout, census: &SystemC } } - mean_or_zero(&per_unit) + VerticalUnits { + inter_staff, + inter_system: per_unit, + } } /// `system_break_penalty` (catalog §`system_break_penalty`): mean @@ -644,6 +672,7 @@ pub(crate) fn floor_warnings( #[cfg(test)] mod tests { + use super::{census, vertical_units, VerticalUnits}; use crate::Engraver; use epiphany_layout_ir::{ to_constrained, to_logical, ConstrainedLayoutIR, ConstraintSolver, QualityMetricKind, @@ -982,4 +1011,61 @@ mod tests { report.metric_vector.vertical_density_penalty.0 ); } + + /// Runs the real pipeline far enough to hand `vertical_units` a `CastLayout` + /// — the same spacing + casting-off `Engraver::resolve` performs. + fn units(score: &epiphany_core::Score) -> VerticalUnits { + let input = to_constrained(&to_logical(score)); + let engraver = Engraver::default(); + let remap = crate::HorizontalRemap::build(&input); + let (glyphs, strokes, curves) = ( + remap.glyphs(&input), + remap.strokes(&input), + remap.curves(&input), + ); + let geometry = engraver.geometry(); + let cast = crate::casting::cast_off(&input, &glyphs, &strokes, &curves, &geometry); + let census = census(&input, &cast); + vertical_units(&input, &cast, &census) + } + + /// A staff band owning no glyphs is still a staff of its region, so its gap + /// contributes. The percussion placeholder's clef has no bundled glyph and it + /// carries no notes, leaving its band's `members` (a glyph list) empty while + /// the band owns its staff-line strokes. Identifying a region's staff bands by + /// `members` drops it, and the axis loses the unit entirely. + #[test] + fn a_glyphless_staff_band_still_contributes_an_inter_staff_unit() { + let u = units(&epiphany_testkit::fixtures::percussion_placeholder_staff(1)); + assert_eq!( + u.inter_staff.len(), + 2, + "one unit per system realizing the pair, not zero" + ); + for value in &u.inter_staff { + assert!( + *value < 1e-4, + "and the solve realizes the declared gap: {value}" + ); + } + } + + /// A gap band realized in several systems contributes one unit PER SYSTEM. + /// The inter-staff solve sizes each system's gaps from that system's own + /// content, so the realizations are independent measurements; the wrapping + /// fixture's two systems sit at very different staff distances. + #[test] + fn each_system_realizing_a_gap_band_contributes_its_own_unit() { + let u = units(&epiphany_testkit::fixtures::two_staff_wrapping_pressure(1)); + assert_eq!(u.inter_staff.len(), 2, "two systems, two realizations"); + for value in &u.inter_staff { + assert!(*value < 1e-4, "each solved to its declared gap: {value}"); + } + // Three staves in one system: two gap bands, one realization each. + let u = units(&epiphany_testkit::fixtures::three_staff_close_content(1)); + assert_eq!(u.inter_staff.len(), 2, "two gap bands, one system"); + for value in &u.inter_staff { + assert!(*value < 1e-4, "the cascade realizes both gaps: {value}"); + } + } } diff --git a/crates/epiphany-layout-ir/src/vertical_band.rs b/crates/epiphany-layout-ir/src/vertical_band.rs index 90c6697..07637e6 100644 --- a/crates/epiphany-layout-ir/src/vertical_band.rs +++ b/crates/epiphany-layout-ir/src/vertical_band.rs @@ -112,12 +112,32 @@ impl VerticalBand { /// An inter-staff gap band: the empty (member-less) spacing region between /// two staves of a system (Chapter 7 §"Vertical Bands": `InterStaffGap`). Its /// height is a spring the solver resolves; it carries no glyphs. + /// + /// **Its height is an INK CLEARANCE**, not a distance between staff lines: + /// the vertical separation between the two staves' outermost *content* — + /// ledger lines, stems, slurs, everything. That is the unit the Quality + /// Metric Catalog's `vertical_density_penalty` measures against + /// (`req:qmc:vertical`, "the adjacent content extents the band separates"), + /// so the solve and the metric read one number. + /// + /// `preferred` is a staff height plus a space: two staves whose ink is that + /// far apart read as separate systems of lines without wasting the page. + /// Plain ledgered content then lands at a staff *pitch* of about 10.6 staff + /// spaces — near conventional two-staff spacing — while ledgered or slurred + /// content pushes the staves further apart on its own. `min` is the hardest + /// squeeze a compressing solve may apply. + /// + /// (The earlier `preferred = 2.0` was a placeholder reconciled with nothing: + /// it is neither the 8.0 staff-box gap the constrained stage's fixed + /// `SYSTEM_STAFF_PITCH` produces, nor the ~6.4 ink clearance that stacking + /// leaves for plain content. Realizing it would have crushed a relaxed + /// system to a pitch of ~7.6.) pub fn inter_staff_gap(id: VerticalBandId) -> Self { VerticalBand { id, kind: VerticalBandKind::InterStaffGap, - min_height: StaffSpace(1.0), - preferred_height: StaffSpace(2.0), + min_height: StaffSpace(2.0), + preferred_height: StaffSpace(5.0), max_height: None, stretch_factor: 1.0, compress_factor: 1.0, diff --git a/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.snapshot.txt b/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.snapshot.txt index f064552..033883c 100644 --- a/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.snapshot.txt +++ b/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.snapshot.txt @@ -8,7 +8,7 @@ provenance_count=96 layer_count=1 hard_constraint_count=27 xml_well_formed=true -view_box=[5.5 -75.204575 17.379084 69.703995] +view_box=[5.5 -66.14458 17.379084 60.643997] class_counts: barline=3 clef=3 diff --git a/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.svg b/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.svg index e38201c..73888e3 100644 --- a/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.svg +++ b/crates/epiphany-render-svg/tests/golden/three_staff_close_content.engrave.svg @@ -1,5 +1,5 @@ - + @@ -9,16 +9,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -48,57 +48,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - + + diff --git a/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.snapshot.txt b/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.snapshot.txt index 9fa0611..77b17c8 100644 --- a/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.snapshot.txt +++ b/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.snapshot.txt @@ -8,7 +8,7 @@ provenance_count=54 layer_count=1 hard_constraint_count=18 xml_well_formed=true -view_box=[5.5 -36.58458 17.379084 31.084002] +view_box=[5.5 -39.584576 17.379084 34.084] class_counts: barline=2 clef=2 diff --git a/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.svg b/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.svg index bdf19b8..c6a915c 100644 --- a/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.svg +++ b/crates/epiphany-render-svg/tests/golden/two_staff_close_content.engrave.svg @@ -1,5 +1,5 @@ - + @@ -9,11 +9,11 @@ - - - - - + + + + + @@ -36,27 +36,27 @@ - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + diff --git a/spec/PASS12_RATIFICATION_LOG.md b/spec/PASS12_RATIFICATION_LOG.md index be1e9b6..24b70a6 100644 --- a/spec/PASS12_RATIFICATION_LOG.md +++ b/spec/PASS12_RATIFICATION_LOG.md @@ -356,3 +356,45 @@ that declares its clef only via `Staff::default_clef` engraves as treble. Found while building the percussion fixture (which therefore had to declare its clef as a `ClefChange`). Filed in `epiphany-layout-ir/DECISIONS.md`; parked with the `ConstrainedLayoutIR` listing gap pending a ≥3-candidate Pass-13 batch. + +## Push-3 tranche (2026-07-09) — two-sided inter-staff renegotiation + +Acting on the sprawl the per-realization axis exposed. `ENGRAVER_VERSION` 11 → +12. **No normative change and no version move:** the Quality Metric Catalog's +formula, contributing units, anchors and thresholds are untouched; only its +non-normative rationale is refreshed (the reference solver no longer merely +expands, and the axis's inter-staff half is now documented as a solver +self-check). Core spec unchanged. Operation Catalog 0.7.0, Binary Format 0.6.0, +Quality Metric Catalog 0.3.0 all unchanged. + +| Item | Disposition | Spec locus | Consumer | +|---|---|---|---| +| Expand-only inter-staff solve | **fix (layout)** — the solve now closes a slack pair as well as opening a crowded one, realizing the `InterStaffGap` band's declared height exactly. `SYSTEM_STAFF_PITCH` is demoted from a floor to an initial arrangement. This is what `vertical_density_penalty` was reporting: an un-pressured multi-staff system sat at 0.739, honest sprawl against the declared gap | — (behavioural; `req:layoutir:vertical-bands`) | `epiphany-engrave` (`casting.rs`) | +| The gap band's height had no agreed meaning | **pin (code default, not spec)** — it is an **ink clearance**: the separation between the two staves' outermost content, which is exactly the unit `req:qmc:vertical` measures. `preferred` 2.0 → **5.0**, `min` 1.0 → **2.0**. The old 2.0 was a placeholder reconciled with nothing — neither the 8.0 staff-box gap the fixed pitch of 12 produces nor the ~6.4 ink clearance it leaves for plain content; realizing it would have crushed a relaxed system to a pitch of ~7.6. At 5.0 plain ledgered content settles near a pitch of 10.6 | `VerticalBand::inter_staff_gap` doc | `epiphany-layout-ir` | +| **Cascade defect, latent since v11** | **fix (correctness)** — the recurrence subtracted the upper staff's shift from the measured gap and added it back through the accumulator, so every pair below the first was over-separated by exactly the shift above it. Both staves move: `shift_lower = shift_upper + target − (upper_lo − lower_hi)`, the *unshifted* gap. Invisible on two-staff fixtures (`shift_upper = 0`) and invisible to the cascade regression, which asserted only `s2 > s1` — true under both recurrences. `three_staff_close_content`'s lower pair realized **21.06** against a declared 4.0 | — | `epiphany-engrave` (`casting.rs`) | + +**How the defect was caught, and why that vindicates a design choice.** The +metric measures the realized clearance back from the **baked output**, not from +the solve's own extents. Reading back solver intent would have reported 0 and let +the over-separation ship a second time. That choice was made one commit earlier +for exactly this reason and paid immediately. The catalog rationale now +recommends it to any conforming implementation. + +**Consequence for testing.** Once the solve realizes each declared clearance +exactly, every inter-staff unit is 0 on a healthy solve — the axis is a solver +self-check, and its *mean* can no longer distinguish "measured every realization" +from "measured one". The regressions therefore assert the **unit set**, not the +mean. Four mutations verified: the double-counting recurrence, expand-only, the +glyph-`members` band filter, and first-system-only measurement each fail a named +test. + +**Churn.** The two multi-staff engrave goldens only. `two_staff_close_content` +grew by exactly 3.0 (the target change, no cascade); `three_staff_close_content` +*shrank* by 9.06 — the same +3 per pair, less the 17.06 of over-separation the +cascade defect was adding. Single-staff and every stub golden are byte-stable. + +**Process note.** The value 5.0 was the user's call. `4.0` ("one staff height") +was chosen first and then withdrawn once its true consequence — a staff pitch of +9.57, not the 11.04 an arithmetic slip had projected — was **measured rather than +inferred**. The slip: deriving plain-content ink clearance from an aggregate +metric by assuming it had two contributing units when it had three. diff --git a/spec/quality_metric_catalog.pdf b/spec/quality_metric_catalog.pdf index d1965b2a3ecd3b1b42d0d3e3006c6ca27893eb0e..d4e98ee097f2d1164db57e3036bddba356d6739c 100644 GIT binary patch delta 43816 zcmZ6yV|OK7)NNa_ZB%UAPAax-+fH_D+qP{d72DadE4Fo>b8ox1z32Rb)z*hK<{Z8C zRUZYj6bI9g3-lD7l)q z!LTV1a^w5^PjyL7qg>*!yvxCs9~y_gpvHnk7KUB zX%t)Wxiq$}7*MJFao&-@&LO}17U z^Fn4erjL2CB5wU+htNj87r(sscPL#)*B1j8D}~_Tcww5*-YLi9_G7WIDyVOkdb?W7 zgYIbzn`(aaW6W$40gOaQYt&|>woEBD>WhC0+@FGQE3=T*SWmT&ljPm9)!i5wupLRw<*lr(OBhUWn(r?92% zr*G1>Njbhq>l?#@Tvn6NY(7&ikCDV7Xj6*@k8#M2J>&)Xq~9ItOd|A~UD|!-Y)K+Z z3IHPtUi5t`w~M1^(Y03U&s*d?6D*BTc9CU}7!W$&Bv1+HhYsm*39{G_xtVx^AGt^S zL+v6OZO#~VWgc^(cHIyEYu8cjIg;%c+d-EM9*hIj;9FUKKUl+L)6{eV&?_GP>g0y1 z_mC8&uA%e5(rn3RC7$#sk6WFmw;o9 z6_q{IWaNNqe@4N=drQGP4{e(s>Kfw!J66QATgYk9FGvJ>_3M$EebwK#8RU9NDFaDb zOufUGUo6dDby2h2iPU!YsXfpiRw2k>pH?)8-UBtrqbrboh#5)iEjM9=_d;Ld?H8E0 zn(Ht|aMK_y&~S`eonFES;79VzA^?NTu_^tvlFpT?5H+EdoKc7}tH1r9Fi4&TAT9P% zO&w#)(O6b{BYa;Ed&@2)?by+&iyA2nV}UEmAEOs@mb=yjrx-41PcaBI;u3anQ13q4 zE{l*QhKLq$^2r>rlIc-zl+EHVSvnJ@M>Pw?wSUJgMRPH$iO%k8PK(nFRse*mwOpTr zZQsAxmpX_l$=!yrp$f3OFwgEFO8EN-G~%tWl~4AMkd+_>Os-L$Gd_qb1oIjVur7*- zp;quz>>{jfjc_S;JNQ@rVTVJkp5iqi>c8YT_LkW273J|irtNguP7FRh?*QqXaI>~T z=m%GmsBLr_7#XFIV;Ue8!vUbSSblc|hUxU&13UP(#aL_zA7EBQIW?zsKJ^<5W@E{$H?}2vS z548LS*pF(B)DV2Lpn;aHDn0ke=(9YK-U;_vN8yjKT2mDSo_)sngP{fE_N=!j`Bfp} z*su%S!$pu@+tDu{$_AU9XK*|&umMcl9wmRz36%TD%+_Wxy&M~t|MPycb(hDQlwXj#pZR(f83OP^4$hcRlit*+zm!nIl@t!~@>c{+#wRsYdYymGqvoCykJ zmXQ<}ocF0tjS1TzEcfVYpX)ZV%O2m1*qoQ~5Vvb)3X6J65x^->91`sy>%#XRS@u#N zR^^5UrmO|ew#J_CgkrOlPx2HDuF2PBYEfjkh^7L9rq)ukp^GSeL5De0?Win%{2ZmB zRAx>{lvIrxjkUD$-^Gp5((etM8sUn2>gBG=Z{dA=Ra)@^cBV|Heh3?K{6B%AJ_6w- zbTys!s*J6F3jjUT9=NiNTuJD)*vdqzcUuPem;=euVSFarmuW8W3-Y_N&chY>RL&

unVI&_?tf=M(1e_t8)2hnDIkbf-2P}> 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 P?3_FZpH3ypQV9PGRai=Z delta 43292 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 XUJ9Kg1Ti8f2RAnY6_vQ61j7FUW#gNa diff --git a/spec/quality_metric_catalog.tex b/spec/quality_metric_catalog.tex index 048316b..dde04ef 100644 --- a/spec/quality_metric_catalog.tex +++ b/spec/quality_metric_catalog.tex @@ -934,7 +934,17 @@ symmetric: a gap wider than preferred is sprawl exactly as a narrower one is crowding. A solver that only ever \emph{expands} a fixed stacking --- never compressing an over-wide gap back toward preferred --- will therefore report honest sprawl on its slack systems. That is the axis working, not -mis-measuring. +mis-measuring, and it is how the reference implementation's expand-only solve +was found: it now renegotiates in both directions. + +Where a solver realizes each band's declared height exactly, the inter-staff +half of this axis reads its honest zero and serves as a \emph{self-check} on the +solve rather than a judgement on the score. A conforming implementation should +therefore measure the realized separation back from the geometry it produced, +not from the target it aimed at: the two agree only if the solve and the bake +both did what they claimed. The reference implementation reads it back from the +baked output, and that is how a defect in its multi-staff cascade --- one that +over-separated every pair below the first --- was caught. \end{rationale} \section{\texttt{system\_break\_penalty}}