epiphany/crates
Levi Neuwirth b25b8debed Push 4b tranche 3a: the accidental vocabulary, in memory
The accidental / glyph / engraving type surface Chapter 4 puts on ScoreTuningContext
now exists in epiphany-core (new accidental.rs): ScoreAccidentalExtensions,
AccidentalDefinition, GlyphReference (Chapter 4's, recursive -- not layout-ir's
homonym), PitchSpaceModification, AccidentalEngraving with EngravingBoundingBox
and AnchorPoint, AccidentalCombination, SmuflVersion(Requirement), plus three
catalog_id! newtypes. All in memory, no Codec, canonical bytes unmoved -- the
reversible half; 3b freezes them on the wire.

The three ratified corrections land as filed:
- S10 Cents(CanonicalF64), not raw f64 -- reverting it to f64 is 9 compile
  errors, the type system is the test.
- S11 AnchorPoint { x, y: SpaceUnit }, core-native, frame pinned in its doc.
- S12 SmuflVersion { major, minor_centi }, built only through from_decimal which
  normalizes 1-digit x10 / 2-digit as-is, so derived Ord orders SMuFL's real
  history right. layout-ir's SmuflVersion untouched; 3b unifies and moves
  GlyphCatalogIdentity.

accidental_extensions and smufl join overrides as in-memory-only fields; the hand
codec's enc is byte-for-byte unchanged (three wire fields), only dec defaults the
new ones. The consumer that keeps this off the NOTEHEAD_ANCHORS path is real:
resolve_accidental (override > addition > base) and the
accidental-modification-compatibility invariant wired into check_invariants.
Glyph/engraving metadata is carried but its deep consumer is the engraver, out of
core -- said honestly, not faked.

Verified independently of the agent. Through Score::canonical_bytes: a non-empty
accidental_extensions + non-default smufl encode byte-identically to all-default
(268 both) and decode back to empty -- all three fields off the wire. SmuflVersion
orders 1.12 < 1.18 < 1.20 < 1.3 < 1.4 (the trap: 1.12 before 1.3). CanonicalF64
rejects NaN/inf. And the compatibility invariant is non-vacuous: weakening the
predicate myself made the edo-31 reject test fail. No Codec, no golden moved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 14:48:29 -04:00
..
epiphany-bundle Text Projection 0.3.0: every production expanded, and one rule for values 2026-07-09 21:55:49 -04:00
epiphany-core Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -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 TransposeInterval becomes undoable; the frozen Transpose stays un-undoable 2026-07-09 16:45:57 -04:00
epiphany-editor-gui CI: an MSRV that could not build, and a gate that floated 2026-07-22 15:05:04 -04:00
epiphany-engrave CI: an MSRV that could not build, and a gate that floated 2026-07-22 15:05:04 -04:00
epiphany-layout-ir One tag vocabulary the compiler owns, and ratify the corpus in the companion 2026-07-09 20:32:35 -04:00
epiphany-ops Push 4b tranche 1: pitch spaces become structure, and cmn-24 transposes end-to-end 2026-07-23 09:41:18 -04:00
epiphany-render-svg P13-I3: delete the hand-written notehead anchors; teach the extractor 2026-07-09 14:53:47 -04:00
epiphany-testkit P13-S6: all twenty tuning systems now say what they mean 2026-07-22 14:54:25 -04:00
epiphany-textproj Text Projection: whole-document conformance, and a corpus with teeth 2026-07-21 15:44:25 -04:00