epiphany/crates
Levi Neuwirth 7aa0b938e2 Stems point away from the middle line, and reach it
Every stem in the engine pointed up, on the notehead's right, at a constant
octave. A C6 three ledger lines above the staff grew an upward stem shooting past
everything -- visible in the two_staff and three_staff renders. It is also why the
slurs are wrong: an Auto slur is placed OPPOSITE the stems, so no correct side
could be chosen while every stem pointed the same way. Stems are therefore a
prerequisite for the slur fix, not merely adjacent to it.

  - Direction: away from the middle line, decided by the head furthest from it,
    ties going down (the convention for a note on the line, and for a chord that
    straddles it evenly).
  - Attachment: the side it points -- an up-stem at the lowest head's right edge,
    a down-stem at the highest head's left. Read from the head's own bounding box
    rather than the rounded NOTEHEAD_STEM_X: for noteheadBlack those are 1.1807
    and 0, and 1.1807 is Bravura's real stemUpSE (1.18). The old 1.15 was a
    rounding -- it accounts for the whole of ten_measure's churn, where every stem
    moved right by 0.031 and nothing else moved at all.
  - Length: an octave from the outer head, but drawn out to the middle line when
    the note lies beyond it, so no stem dangles in the ledger field.

No version moves. This is the PROJECTION changing, not a solver: to_constrained
emits different geometry from the same graph, so ENGRAVER_VERSION's promise (same
input => same output) is untouched. Every golden churns, stub and engrave alike,
because stems are constrained-stage geometry.

Locked by a_stem_points_away_from_the_middle_line_and_reaches_it, which re-pitches
a generated score across four octaves -- the corpus generator writes only low
notes, so nothing in the suite had ever exercised a down-stem. Mutation-verified:
restoring always-up plus fixed-octave fails it.

Parked, found on the way: BRAVURA_METRICS' notehead anchors are unusable as
written. They name stemUpNW/stemDownSE -- the corners an up- and down-stem never
attach to -- and their x of 1180 reads like 1.18 staff spaces written in
thousandths rather than the table's 1/1024 units (1.18 sp = 1208). Nothing
consumes them except metrics_hash, so correcting them would move the
GlyphCatalogIdentity every conformance claim declares. That makes three parked
candidates; the house rule opens a batch pass at three.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 13:47:47 -04:00
..
epiphany-bundle Phase B follow-up: real acceleration-snapshot path + base role bound 2026-07-07 16:54:06 -04:00
epiphany-core Schema major 2 Phase D: the repeat-authoring pair (code tranche) 2026-07-07 20:06:18 -04:00
epiphany-determinism P12-I2: wire the ratified MUSCLOID layout-object id derivation 2026-06-27 12:46:19 -04:00
epiphany-editor-core Let the band model carry staff attribution instead of inferring it 2026-07-09 10:37:27 -04:00
epiphany-editor-gui Schema major 2 Phase E2: slur curves + cubic-bézier primitive 2026-07-08 15:33:00 -04:00
epiphany-engrave Two-sided inter-staff renegotiation, and the cascade defect it uncovered 2026-07-09 13:32:37 -04:00
epiphany-layout-ir Stems point away from the middle line, and reach it 2026-07-09 13:47:47 -04:00
epiphany-ops Push 3 audit follow-up: modify anchor validation, spaced slur_shape, stale docs 2026-07-08 18:54:39 -04:00
epiphany-render-svg Stems point away from the middle line, and reach it 2026-07-09 13:47:47 -04:00
epiphany-testkit Straighten the QMC version story in the docs that assert it 2026-07-09 11:54:25 -04:00