diff --git a/crates/epiphany-core/DECISIONS.md b/crates/epiphany-core/DECISIONS.md index 850531e..f12f7f1 100644 --- a/crates/epiphany-core/DECISIONS.md +++ b/crates/epiphany-core/DECISIONS.md @@ -551,3 +551,30 @@ the notehead without moving the sound). Saturation is the worst possible failure here because it is invisible: it produces a pitch nobody asked for, reports success, and destroys the evidence. See `epiphany-ops/DECISIONS.md` §"Push 4a" for the operation-level consequences and the frozen `Transpose`. + +## Parked: Push 4b (the Chapter 4 tuning catalog) — what must be decided first + +Push 4a proved that transposition needs no tuning catalog. What the catalog is +still needed for — resolving a scale position to a frequency, and applying an +instrument's `transposition` at the written/sounding boundary — remains open, +and Chapter 4 is not implementable as written. Verified blockers: + +- **`cmn-24` cannot exist** (P13-S2). The built-in pitch-space table declares it + as "CMN extended with 24-EDO quarter-tone accidentals", but + `PitchSpacePosition::Cmn.alteration` is an `i8` of *whole semitones*. Either + `cmn-24` is not `Cmn`-representable, or `alteration` changes unit — a + data-model major. +- **The core stores only the default space, tuning, and reference.** The + overrides, accidental extensions, and SMuFL target Chapter 4 requires are + absent, and none of the catalog/resolver types exist + (`ScoreTuningContext` in `graph.rs` is the whole surface today). +- **Chapter 4's nine requirement blocks are unlabeled**, so none is + independently citable in a conformance claim. This is not special to + Chapter 4 — 169 of 207 core_spec requirements are unlabeled (P13-S1) — but it + means Push 4b cannot declare conformance requirement-by-requirement without + first labelling what it implements. + +Two further claims from the Push-4a audit are **unverified** and should be +checked, not inherited: that the JI dimension convention conflicts with its own +prime-2 requirement, and that the named historical tunings lack exact +deterministic ratio data. Neither was needed for 4a, and neither was confirmed. diff --git a/spec/PASS13_CANDIDATES.md b/spec/PASS13_CANDIDATES.md index 7bbbeda..46b206b 100644 --- a/spec/PASS13_CANDIDATES.md +++ b/spec/PASS13_CANDIDATES.md @@ -40,3 +40,14 @@ batch reopens the pass. | P13-I1 | Chapter 7's `ConstrainedLayoutIR` listing elides **three** fields the code carries: `break_origins: Vec` (named by `req:layoutir:break-origin-attribution`, its own shape unlisted), `catalog: GlyphCatalogIdentity` (its type specified, the field unlisted), and `diagnostics: Vec` — which appears **nowhere** in core_spec, though it is how the projection's honesty rule manifests: an unspellable pitch or an unbundled glyph is placed as a fallback *and recorded*, never silently guessed | `crates/epiphany-layout-ir/DECISIONS.md` ("the ConstrainedLayoutIR listing is still abridged") | **resolved** (Pass 13: listing gains all three fields; `BreakOrigin` and `LayoutDiagnostic` shapes added; new `req:layoutir:coverage-diagnostics` ratifies as-implemented that an unengravable object is recorded AND still placed — never guessed, never dropped) | | P13-I2 | `Staff::default_clef` is never consulted: `to_constrained` takes the active clef from the staff instance's `clef_sequence` and falls back to `Clef::default()` (treble), so a bass-clef staff that declares its clef only on the `Staff` engraves as treble. The field is decorative in the projection — is it the fallback, or should it not exist? | `crates/epiphany-layout-ir/DECISIONS.md` ("`Staff::default_clef` is never consulted") | **resolved** (Pass 13: it IS the fallback. `StaffContent` carries it, `active_clef_or` resolves against it, and `editor-core`'s hit-test reads the same function — else a click on a bass staff would resolve its pitch as treble. Removal was rejected: the field is named for its purpose, is encoded on the wire, and dropping it is schema-major) | | P13-I3 | `BRAVURA_METRICS`' `NOTEHEAD_ANCHORS` are hand-written, unconsumed, and doubly suspect: they name `stemUpNW`/`stemDownSE` — the corners a normal notehead's stems do *not* attach to, and a pair Bravura's `noteheadBlack` does not define — 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). They enter only `metrics_hash`, so any correction moves the `GlyphCatalogIdentity` every conformance claim declares. The font is not vendored, so the values cannot be verified in-tree | `crates/epiphany-layout-ir/DECISIONS.md` ("the notehead stem anchors are unusable as written") | **resolved** (Pass 13: deleted. Unverifiable in-tree, unconsumed, and hand-derived where every neighbouring number is machine-extracted. `extract_bravura_outlines.py --anchors` now emits them from the pinned `bravura_metadata.json`, so the table regains them generated rather than remembered; the metadata's SHA-256 is deliberately unpinned and the script refuses until an operator with the font pins it. `GlyphCatalogIdentity` moves once, now, while no conformance claim declares the old one; user "delete them + teach the extractor") | + +## Open candidates (Batch 3 not yet open) + +Filed as found; the pass reopens at three (the house rule). Neither is a live +incorrectness — each is a place where the spec cannot yet support a claim it +makes about itself. + +| Id | One-line statement | Filed in | Status | +|---|---|---|---| +| P13-S1 | **169 of core_spec's 207 `requirement` blocks carry no `\label`**, so no conformance claim can cite them. Chapter 4 (`Tuning Systems and Pitch Spaces`) is 9/9 unlabeled and Chapter 11 (`Determinism Contract`) is 15/15, but the gap is universal, not local: `Semantic Operations` 24/27, `The Score Graph` 22/28, `Pitch` 10/13. The requirements *are* normative and *are* implemented; they simply cannot be named. Every `req:*` label the repo cites was added ad hoc by the pass that needed it | this file | **open** (found while auditing Push 4a; the audit that surfaced it scoped it to Chapter 4, which is where it was noticed, not where it lives) | +| P13-S2 | `cmn-24` is declared in the built-in pitch-space table (`core_spec.tex` §"Built-in Catalog") as "CMN extended with 24-EDO quarter-tone accidentals", but **cannot be represented**: `PitchSpacePosition::Cmn.alteration` is an `i8` documented as *whole semitones*, and a quarter-tone is half of one. Either the space is not `Cmn`-representable (and needs `Integer`/`Registered`), or `alteration` needs a finer unit — a data-model major | `crates/epiphany-core/DECISIONS.md` (Push 4b blockers) | **open** (blocks Push 4b) |