epiphany/crates/epiphany-core/src
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
..
prepass Schema major 2 Phase B: snapshot side + honest stamps (data-model fills) 2026-07-07 16:30:07 -04:00
accidental.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
codec.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
event.rs Land M1 + M2 (Agent C): framework edge fixes and real-Score graph integration 2026-06-21 16:37:51 -04:00
fuzz.rs Schema major 2 Phase D: the repeat-authoring pair (code tranche) 2026-07-07 20:06:18 -04:00
generators.rs Schema major 2 Phase B: snapshot side + honest stamps (data-model fills) 2026-07-07 16:30:07 -04:00
graph.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
ids.rs Text Projection: every graph id projects, because graph_id! says so 2026-07-21 13:41:40 -04:00
indexes.rs Schema major 2 Phase D: the repeat-authoring pair (code tranche) 2026-07-07 20:06:18 -04:00
invariants.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
lib.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
pitch.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
pitch_space.rs Push 4b tranche 1: pitch spaces become structure, and cmn-24 transposes end-to-end 2026-07-23 09:41:18 -04:00
prepass.rs A transposition moves the authored spelling; recording Propagated is not enough 2026-07-09 16:40:06 -04:00
tempo.rs Push 4: Binary Format companion, F1 benches, subquadratic reduction order 2026-07-02 19:02:07 -04:00
textvalue.rs Text Projection: the Chapter-5 value layer, from one field list 2026-07-21 12:17:49 -04:00
textvalue_event.rs Text Projection: the Chapter-5 value layer, from one field list 2026-07-21 12:17:49 -04:00
textvalue_graph.rs Push 4b tranche 3a: the accidental vocabulary, in memory 2026-07-23 14:48:29 -04:00
textvalue_impls.rs Text Projection: every graph id projects, because graph_id! says so 2026-07-21 13:41:40 -04:00
textvalue_pitch.rs Text Projection: the Chapter-5 value layer, from one field list 2026-07-21 12:17:49 -04:00
textvalue_time.rs Text Projection: the Chapter-5 value layer, from one field list 2026-07-21 12:17:49 -04:00
time.rs Text Projection: the Chapter-5 value layer, from one field list 2026-07-21 12:17:49 -04:00
tuning.rs Push 4b tranche 2b: the ten historical temperaments resolve 2026-07-23 12:31:29 -04:00