#![forbid(unsafe_code)]
//! # epiphany-core
//!
//! The Epiphany score graph: the in-memory representation of all musical
//! content in a score, implementing the normative requirements of
//! **Chapters 2–5** of the core specification. This is Agent B's crate per
//! `spec/QUICKSTART.md`; it depends only on [`epiphany_determinism`] (Agent A)
//! and the small set of crates sanctioned by the QUICKSTART's implementation
//! decisions.
//!
//! The graph is the canonical truth about the music (Chapter 5
//! §"Design Principles"); layout, serialization, and editing operations are
//! downstream projections and consumers of it.
//!
//! ## What lives here
//!
//! * `ids` — the typed 128-bit identifier family ([`EventId`], [`PitchId`],
//!   [`VoiceId`], …, [`TypedObjectId`]), [`ReplicaId`] with its reserved
//!   [`ReplicaId::SYSTEM_DERIVED`] namespace, [`OperationId`], the
//!   replica-plus-counter generation scheme, and the deterministic
//!   system-derived-counter derivation (Chapter 5 §"Identifiers").
//! * `time` — [`RationalTime`] (exact rational, inline-or-promoted),
//!   [`MusicalPosition`]/[`MusicalDuration`] with type-enforced algebra,
//!   [`WallClockTime`]/[`WallClockDuration`], [`TimeAnchor`]/[`AnchorOffset`],
//!   and the event temporal-coordinate unions [`EventPosition`],
//!   [`EventDuration`], [`ConcreteDuration`] (Chapter 3).
//! * `pitch` — [`Pitch`], [`ScalePosition`], [`IdentifiedPitch`],
//!   [`PitchSpelling`], and the spelling-attachment subsystem (Chapter 2;
//!   Chapter 4 for the tuning/pitch-space registry identifiers it references).
//! * `pitch_space` — the Chapter 4 pitch-space vocabulary
//!   ([`PositionStructure`], [`PitchSpace`], [`IntervalAlgebra`],
//!   [`TranspositionBehavior`]) and [`built_in_position_structure`], the
//!   built-in catalog `Pitch::transposed` resolves against. In-memory only —
//!   no `Codec` impl exists for anything here (Push 4b Ruling C).
//! * `tuning` — the Chapter 4 tuning-resolution vocabulary
//!   ([`TuningSystem`], [`TuningResolution`], [`TuningOverride`],
//!   [`TuningScope`], [`HarmonicContext`]), [`built_in_tuning_system`] (all
//!   twenty catalog identifiers resolve), [`derive_tonal_centre`] (the
//!   score-graph-derived adaptive anchor), and [`resolve_pitch_frequency`],
//!   the five-scope resolver from a pitch to a frequency in Hz. In-memory
//!   only, same discipline as `pitch_space`
//!   (Push 4b Ruling C).
//! * `accidental` — the Chapter 4 accidental/glyph/engraving vocabulary
//!   ([`AccidentalDefinition`], [`ScoreAccidentalExtensions`],
//!   [`GlyphReference`], [`PitchSpaceModification`], [`AccidentalEngraving`],
//!   [`SmuflVersion`], [`SmuflVersionRequirement`]), [`resolve_accidental`]
//!   (override > addition > base-registry precedence), and
//!   [`accidental_modification_compatible_with_space`]
//!   (`req:tuning:accidental-modification-compatibility`, wired into
//!   [`check_invariants`]). In-memory only, same discipline as `pitch_space`
//!   and `tuning` (Push 4b tranche 3a; the wire tranche is 3b).
//! * `event` — the [`Event`] taxonomy and the [`EventArena`] (Chapter 5
//!   §"The Event Arena").
//! * `graph` — [`Canvas`], [`Region`], [`Staff`]/[`StaffInstance`] (distinct
//!   types), [`Voice`], [`Measure`], [`BarlineAlignmentGroup`], and the
//!   reference-bearing cross-cutting structures (Chapter 5).
//! * `prepass` — the spelling and notational-decomposition pre-passes
//!   ([`derive_annotations`]): canonical *derived annotations* recomputed on
//!   materialization, not stored graph state (Chapter 2 §"The Spelling
//!   Pre-Pass"; Chapter 3 §"Notational Decomposition").
//! * `invariants` — the Chapter 5 graph-invariant checker, with one check
//!   per enumerated invariant and a typed witness for each violation.
//!
//! ## Implementation decisions (per QUICKSTART "Decisions you'll need to make")
//!
//! See `DECISIONS.md`. In brief: replica entropy via `getrandom` (decision 1),
//! event-arena storage via `slotmap` (decision 2), fully sync (decision 4),
//! current stable Rust (decision 5). `unsafe` is forbidden crate-wide.

mod accidental;
mod codec;
mod event;
mod graph;
mod ids;
mod indexes;
mod invariants;
mod pitch;
mod pitch_space;
mod tempo;
mod textvalue_event;
mod textvalue_graph;
mod textvalue_impls;
mod textvalue_pitch;
mod textvalue_time;
mod time;
mod tuning;

pub mod fuzz;
pub mod generators;
pub mod prepass;
pub mod textvalue;
pub mod vectors;

pub use ids::{
    derive_system_id, AnalysisLayerId, AnalyticalAnnotationId, BarlineAlignmentGroupId, BeamId,
    ChordSymbolId, CommentId, EventId, GraphId, GraphicGestureId, GraphicObjectId, IdentityContext,
    InstrumentId, IntegrityAnomalyId, LyricLineId, MarkerId, MeasureId, ObjectKindRegistryId,
    OperationId, PartDefinitionId, PitchId, RegionId, RepeatStructureId, ReplicaId, SlurId,
    SpannerId, StaffGroupId, StaffId, StaffInstanceId, TieId, TimeSignatureId, TransactionId,
    TupletId, TypedObjectId, ViewId, VoiceId,
};

pub use time::{
    AnchorOffset, ConcreteDuration, CoordinateKind, DurationBounds, EventBounds, EventDuration,
    EventPosition, MeasurePosition, MusicalDuration, MusicalPosition, OffsetKind, RationalTime,
    RegionEdge, SmallRational, TimeAnchor, TimeBounds, WallClockDuration, WallClockTime,
};

pub use pitch::{
    canonical_pitch_bytes, derive_system_pitch_id, spell, AccidentalGroupId, AccidentalId,
    AccidentalRegistryId, AcousticPitch, AcousticRealization, AdaptiveTuningFunctionId,
    ChromaticPitchClass, CmnNominal, CustomGlyphId, DecompositionAlgorithmId, ForeignFormatId,
    IdentifiedPitch, IntervalAlgebraRegistryId, ModificationRegistryId, NominalRegistryId, Pitch,
    PitchRange, PitchSpaceId, PitchSpacePosition, PitchSpelling, PositionRegistryId,
    PositionStructureRegistryId, ReferencePitch, ScalePosition, SpellingAlgorithmId,
    SpellingAttachment, SpellingContext, SpellingDirective, SpellingNominal, SpellingPrecedence,
    SpellingRenderHints, SpellingRule, SpellingRuleSetId, SpellingScope, SpellingSource,
    SpellingSourceKind, StaffGroupKindRegistryId, TieClassRegistryId, TransposeRefusal,
    TranspositionInterval, TranspositionRegistryId, TuningFunctionId, TuningReference,
    TuningSystemId, VoiceSelector,
};

pub use pitch_space::{
    built_in_position_structure, IntervalAlgebra, JiRatio, PitchSpace, PositionStructure,
    SpellingParameters, SpellingRuleSet, TranspositionBehavior,
};

pub use accidental::{
    accidental_modification_compatible_with_space, resolve_accidental, AccidentalCombination,
    AccidentalDefinition, AccidentalEngraving, AnchorPoint, EngravingBoundingBox, GlyphReference,
    PitchSpaceModification, ScoreAccidentalExtensions, SmuflVersion, SmuflVersionRequirement,
};

pub use prepass::{
    derive_annotations, resolve_decomposition, resolve_spelling, simplest_spelling,
    DerivedAnnotations, PrePassError, PrePassProfile, ResolvedSpelling, SpellingProvenance,
    TaxonomyReport,
};

pub use event::{
    ArenaError, ArticulationMark, CueEvent, CueRendering, DynamicMark, Event, EventArena, EventKey,
    GraceKind, GraphicEvent, IndeterminacyHints, IndeterminacyKind, IndeterminateEvent,
    OrnamentMark, PitchedEvent, PlaybackBinding, Rest, StaffPosition, StemConfiguration,
    TrajectoryDisplay, TrajectoryEndpoint, TrajectoryEvent, TrajectoryShape, UnpitchedEvent,
    UnpitchedMemberId,
};

pub use graph::{
    derive_promoted_voice_id, AleatoricAnchoringDiscipline, AleatoricTimeModel, AnalysisLayer,
    AnalyticalAnnotation, AnnotationAnchor, BarlineAlignmentGroup, BarlineAlignmentMember, Beam,
    BeamGeometryOverride, BeatGroup, BracketKind, Canvas, CanvasLayoutDefaults, CanvasMargins,
    CanvasSize, ChordSymbol, Clef, ClefChange, ClefShape, Comment, CoordinateDiscipline,
    CrossCuttingRegistry, CurvatureOverride, CurveDirection, DecompositionAttachment,
    DecompositionSource, EventOrderingDAG, GestureAnchoring, GraphicContent, GraphicGesture,
    GraphicObject, HairpinDirection, Instrument, KeySignature, KeySignatureChange, LineStyle,
    LyricLine, Marker, Measure, MeasureNumberVisibility, MetadataEntry, MetadataValue, MeterChange,
    MetricGrid, MetricTimeModel, NotatedComponent, NoteValue, OctaveOffset, PartDefinition,
    PedalKind, PowerOfTwo, ProportionalTimeModel, Region, RegionContent, RegionTimeModel,
    RepeatKind, RepeatStructure, Score, ScoreMetadata, ScoreTuningContext, Slur, SlurKind,
    SoundConfiguration, SpaceUnit, SpanStyle, Spanner, SpannerKind, Staff, StaffBasedContent,
    StaffBracketKind, StaffExtent, StaffGroup, StaffGroupKind, StaffInstance,
    StaffLineConfiguration, StemDirection, SubBeam, TempoMapReference, TextLineDefinition, Tie,
    TieClass, TimeExtent, TimeSignature, TimeSignatureDisplay, Timestamp, TuningContextSettings,
    Tuplet, TupletRatio, UnpitchedMember, ViewDefinition, Voice, VoiceOrigin, Volta,
};

pub use tempo::{
    inversion_tolerance, Tempo, TempoError, TempoMap, TempoSegment, TempoShape,
    INVERSION_MAX_DENOMINATOR, INVERSION_MAX_ITERATIONS,
};

pub use tuning::{
    built_in_tuning_system, derive_tonal_centre, frequency_for_position, resolve_pitch_frequency,
    resolve_tuning_scope, HarmonicContext, PositionRatio, ResolvedTuning, TuningCatalogEntry,
    TuningOverride, TuningParameters, TuningResolution, TuningResolutionError, TuningScope,
    TuningSystem,
};

pub use codec::{CanonicalValue, ScoreDecodeError};

pub use indexes::ScoreIndexes;

pub use invariants::{
    check_invariant, check_invariants, deferred_checks, measure_anchor_relation, DeferredCheck,
    GraphInvariant, InvariantViolation,
};
