feat: 1954 Divino Afflatu precedence engine (#67) #451

Merged
manlycucumber merged 1 commit from feature/67-1954-precedence into develop 2026-07-06 13:46:42 +00:00
manlycucumber commented 2026-07-06 13:45:03 +00:00 (Migrated from github.com)

Wires the pre-1955 (Divino Afflatu) precedence rules into the resolver, so the 1954 edition resolves occurrence, transfer, and concurrence under the older Tabella Occurrentiae rather than the 1962 Table of Liturgical Days. Closes #67.

What lands

  • Rubrics1954Precedence implements PrecedenceRules beside Rubrics1962Precedence — branches on the live six-rung legacyRank ladder (Duplex I/II class, Duplex maius, Duplex, Semiduplex, Simplex), the three Divino Afflatu Sunday classes, the lesser-Sunday elevation, transfer restricted to Doubles of the I/II class, per-class octave suppression, and free (odd-orations) commemoration.
  • Data — the pre-1955 tier table is authored whole in facts/editions/roman-divino-afflatu/precedence.yaml (a different order, not a diff of the n.91 table) + a new cited rg-da source; the generator's transformPrecedence is now per-edition.
  • Placement — a common vigil that falls on a Sunday is anticipated to the preceding Saturday, and the Matthias vigil tracks its feast across the leap-year bis-sextum (23 → 24 Feb). Both edition-gated, so 1962 placement is unmoved.
  • HonestyisBuilt stays false: a CalendarCatalog boundary guard refuses public day()/contract('1954') until the dataset burndown (#64) completes the calendar, while tests exercise the engine directly through DayResolver::forEdition().

Accuracy

The rules are verified against the Divino-Afflatu-era Rubricae Generales (Titt. IV–VII) and cross-checked to the St. Lawrence Press pre-1955 Ordo — via a research workflow whose adversarial pass forced three primary-text corrections (chiefly: transfer is restricted to Doubles of the I/II class only). The Candlemas asymmetry holds on real data: the Purification wins and commemorates a green Sunday (1930) but transfers off a II-class Sunday (Septuagesima, 1947). An adversarial code+data review returned SAFE TO MERGE, zero must-fixes; its two deferrals are filed on #64. Design: docs/design/rubric-system-model.md Seam 5a/6.

Verification

  • phpcs (PSR-12) · PHPStan L6 · PHPUnit 775 pass (28 new 1954 tests) — the 1962 golden fixture (1583–2200) is byte-identical
  • generator npm test (22) + reproducible verify (18 files)
Wires the pre-1955 (Divino Afflatu) precedence rules into the resolver, so the 1954 edition resolves occurrence, transfer, and concurrence under the older *Tabella Occurrentiae* rather than the 1962 Table of Liturgical Days. Closes #67. ## What lands - **`Rubrics1954Precedence implements PrecedenceRules`** beside `Rubrics1962Precedence` — branches on the live six-rung `legacyRank` ladder (Duplex I/II class, Duplex maius, Duplex, Semiduplex, Simplex), the three Divino Afflatu Sunday classes, the lesser-Sunday elevation, transfer restricted to Doubles of the I/II class, per-class octave suppression, and free (odd-orations) commemoration. - **Data** — the pre-1955 tier table is authored *whole* in `facts/editions/roman-divino-afflatu/precedence.yaml` (a different order, not a diff of the n.91 table) + a new cited `rg-da` source; the generator's `transformPrecedence` is now per-edition. - **Placement** — a common vigil that falls on a Sunday is anticipated to the preceding Saturday, and the Matthias vigil tracks its feast across the leap-year *bis-sextum* (23 → 24 Feb). Both edition-gated, so 1962 placement is unmoved. - **Honesty** — `isBuilt` stays **false**: a `CalendarCatalog` boundary guard refuses public `day()/contract('1954')` until the dataset burndown (#64) completes the calendar, while tests exercise the engine directly through `DayResolver::forEdition()`. ## Accuracy The rules are verified against the Divino-Afflatu-era *Rubricae Generales* (Titt. IV–VII) and cross-checked to the St. Lawrence Press pre-1955 Ordo — via a research workflow whose adversarial pass forced three primary-text corrections (chiefly: **transfer is restricted to Doubles of the I/II class only**). The **Candlemas asymmetry** holds on real data: the Purification *wins and commemorates* a green Sunday (1930) but *transfers off* a II-class Sunday (Septuagesima, 1947). An adversarial code+data review returned **SAFE TO MERGE, zero must-fixes**; its two deferrals are filed on #64. Design: `docs/design/rubric-system-model.md` Seam 5a/6. ## Verification - phpcs (PSR-12) · PHPStan L6 · **PHPUnit 775 pass** (28 new 1954 tests) — the **1962 golden fixture (1583–2200) is byte-identical** - generator `npm test` (22) + reproducible `verify` (18 files)
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!451
No description provided.