feat: 1954 edition foundation — multi-edition generator + legacy rank scheme (#64) #447

Merged
manlycucumber merged 2 commits from feature/64-1954-foundation into develop 2026-07-04 05:44:49 +00:00
manlycucumber commented 2026-07-04 05:33:52 +00:00 (Migrated from github.com)

Lays the groundwork for the Divino Afflatu (1954) engine (Epic #63). The pre-1955 rank vocabulary (duplex/semiduplex/simplex) is a different scheme from 1962's numeric I–IV classes, so a legacy edition can't inherit 1962's numeric rank — each grade must be authored and carried explicitly. This PR establishes how a legacy edition is authored, generated, and carried before the octave/vigil/precedence work (#65/#66/#67) builds on it.

Why this is the foundation (sequencing note)

A 5-agent code-mapping pass showed the design doc had assumed LegacyRank was already wired — it wasn't (only the value object existed). And the generator was single-edition. Both are prerequisites for octaves/vigils/precedence, so they come first.

Generator (Node, build-time only)

  • meta.editions declares additional editions, each authored as a diff from a base. A new transformSanctoraleEdition materialises only the entries an edition carries into its own dir. The base (1962) pass is untouched — its corpus bytes are byte-identical (proven by the golden fixture + npm run verify).
  • attributes.sanctorale gains an optional legacyRank token — the author states both the native grade and its normalised numeric class, each cited.
  • ordo-1954 (St. Lawrence Press pre-1955 Ordo Recitandi) registered as the 1954 oracle.

Engine (PHP runtime)

  • CorpusSanctoralData reads legacyRank and threads it through SanctoralEntrySanctoralObservance (both trailing-optional — 1962 unaffected), preserved across the rerank overlay op, ready for Rubrics1954Precedence (#67) to order the fine grades the four classes collapse.

Data

  • A first verified 1954 slice: eight great octave/vigil-bearing feasts re-graded to their pre-1955 grades — Assumption, St Joseph, Annunciation, Nativity of the Baptist, SS Peter & Paul (duplex I classis); Lawrence, Nativity BVM, Purification (duplex II classis). Existing feasts only → no shared identity changes → 1962 byte-identical.

Guarantees / gates

  • Golden fixture 1583–2200 byte-identical (1962 calendar unchanged).
  • corpus verify OK (16 files, deterministic + fresh).
  • PHPStan L6 clean; phpcs PSR-12 clean; PHPUnit green (+4 new in LegacyRankEditionTest).

Not in this PR (follows)

  • octaves.ndjson + sanctoral-octave materialisation (#65, safer split — see updated design doc Seam 4).
  • Pre-1955 vigils (#66); Rubrics1954Precedence + turn-on + oracle validation (#67); full 1954 dataset burndown.

Part of Epic #63.

Lays the groundwork for the **Divino Afflatu (1954)** engine (Epic #63). The pre-1955 rank vocabulary (`duplex`/`semiduplex`/`simplex`) is a *different scheme* from 1962's numeric I–IV classes, so a legacy edition can't inherit 1962's numeric rank — each grade must be authored and carried explicitly. This PR establishes how a legacy edition is **authored, generated, and carried** before the octave/vigil/precedence work (#65/#66/#67) builds on it. ### Why this is the foundation (sequencing note) A 5-agent code-mapping pass showed the design doc had assumed `LegacyRank` was already wired — it wasn't (only the value object existed). And the generator was single-edition. Both are prerequisites for octaves/vigils/precedence, so they come first. ### Generator (Node, build-time only) - `meta.editions` declares additional editions, each authored as a **diff from a `base`**. A new `transformSanctoraleEdition` materialises only the entries an edition carries into its own dir. **The base (1962) pass is untouched** — its corpus bytes are byte-identical (proven by the golden fixture + `npm run verify`). - `attributes.sanctorale` gains an optional **`legacyRank`** token — the author states *both* the native grade and its normalised numeric class, each cited. - `ordo-1954` (St. Lawrence Press pre-1955 *Ordo Recitandi*) registered as the 1954 oracle. ### Engine (PHP runtime) - `CorpusSanctoralData` reads `legacyRank` and threads it through `SanctoralEntry` → `SanctoralObservance` (both **trailing-optional** — 1962 unaffected), preserved across the rerank overlay op, ready for `Rubrics1954Precedence` (#67) to order the fine grades the four classes collapse. ### Data - A first **verified** 1954 slice: eight great octave/vigil-bearing feasts re-graded to their pre-1955 grades — Assumption, St Joseph, Annunciation, Nativity of the Baptist, SS Peter & Paul (*duplex I classis*); Lawrence, Nativity BVM, Purification (*duplex II classis*). Existing feasts only → no shared identity changes → 1962 byte-identical. ### Guarantees / gates - **Golden fixture 1583–2200 byte-identical** (1962 calendar unchanged). - `corpus verify` OK (16 files, deterministic + fresh). - PHPStan L6 clean; phpcs PSR-12 clean; PHPUnit green (+4 new in `LegacyRankEditionTest`). ### Not in this PR (follows) - `octaves.ndjson` + sanctoral-octave materialisation (#65, safer split — see updated design doc Seam 4). - Pre-1955 vigils (#66); `Rubrics1954Precedence` + turn-on + oracle validation (#67); full 1954 dataset burndown. Part of Epic #63.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Core!447
No description provided.