feat: reintroduce pre-1955 sanctoral vigils for the 1954 edition (#66) #450

Merged
manlycucumber merged 1 commit from feature/66-pre-1955-vigils into develop 2026-07-04 17:50:24 +00:00
manlycucumber commented 2026-07-04 17:49:10 +00:00 (Migrated from github.com)

Closes #66.

Reintroduces the pre-1955 (Divino Afflatu) sanctoral vigils for the 1954 edition as corpus data — no new engine, mirroring the octave subsystem (#65).

The 13 vigils

All: kind: vigil, colour violet, legacyRank: vigiliaRankClass IV, vigilOf its feast, titles cited mr-1920, the 1954 block cited ordo-1954. Vigil date = feast − 1.

Vigil Date Anticipates 1962?
9 restored (1954-only) Andrew · Thomas · Matthias · James · Bartholomew · Matthew · Simon & Jude · All Saints · Immaculate Conception Nov 29 · Dec 20 · Feb 23 · Jul 24 · Aug 23 · Sep 20 · Oct 27 · Oct 31 · Dec 7 their feasts suppressed 1955
4 grade-diffed John Baptist · Peter & Paul · Lawrence · Assumption Jun 23 · Jun 28 · Aug 9 · Aug 14 their feasts kept

The four 1962 kept share the same identity but grade vigilia/IV in 1954 vs II/III class in 1960 — a real per-edition difference the edition axis models.

Generator: edition-only entries

A sanctorale.yaml entry may now be edition-only — the mechanism the #64 burndown also needs for feasts 1962 dropped:

  • identity is emitted for every entry (the cross-edition union);
  • base attributes/placement stay gated on the base block;
  • an entry legitimately absent from 1962 marks itself notInBaseEdition: true (a missing base block without the marker still fails closed);
  • a new orphan-identity build gate proves every identity is placed by ≥1 edition.

The vigilia grade is registered in all three layers (Node DEFAULT_RANK_BY_LEGACY, the attributes schema enum, PHP LegacyRank).

Scope / deferrals (by design)

  • Sunday → Saturday anticipation and the Matthias leap-year shift (Feb 23→24) are resolution rules → deferred to Rubrics1954Precedence (#67). Vigils are anchored at their nominal civil date only.
  • A pre-existing duplicate All Saints feast (omnes-sancti / omnium-sanctorum) is left for the #64 burndown; the vigil's vigilOf points at omnes-sancti (the Nov 1 golden-trace winner).

Verification

  • 1962 (roman-rubricae-1960) edition byte-identical — golden fixture untouched by construction.
  • PHPUnit 746 ✓ (new VigilEditionTest: restored vigils, the edition-axis grade difference, 1960 non-placement, + a data-driven check of all 13), phpcs 148/148, PHPStan L6 clean, generator 21/21 + verify OK.
  • Facts established by a research + adversarial-verification pass (roster corrected 12→13 — the Immaculate Conception vigil); the implementation passed an adversarial code+data review (no must-fixes).

Follow-ups (filed against their owning issues, not here)

  • #64: a build gate asserting every vigilOf/octaveOf target is co-placed in its edition (premature now, while the 1954 diff is intentionally sparse).
  • #67: a leap-year characterization test for the Matthias feast/vigil split.
Closes #66. Reintroduces the pre-1955 (Divino Afflatu) **sanctoral vigils** for the 1954 edition as corpus **data** — no new engine, mirroring the octave subsystem (#65). ## The 13 vigils All: `kind: vigil`, colour **violet**, `legacyRank: vigilia` → **RankClass IV**, `vigilOf` its feast, titles cited `mr-1920`, the 1954 block cited `ordo-1954`. Vigil date = feast − 1. | | Vigil | Date | Anticipates | 1962? | |---|---|---|---|---| | **9 restored** (1954-only) | Andrew · Thomas · Matthias · James · Bartholomew · Matthew · Simon & Jude · All Saints · Immaculate Conception | Nov 29 · Dec 20 · Feb 23 · Jul 24 · Aug 23 · Sep 20 · Oct 27 · Oct 31 · Dec 7 | their feasts | suppressed 1955 | | **4 grade-diffed** | John Baptist · Peter & Paul · Lawrence · Assumption | Jun 23 · Jun 28 · Aug 9 · Aug 14 | their feasts | kept | The four 1962 kept share the *same* identity but grade `vigilia`/IV in 1954 vs II/III class in 1960 — a real per-edition difference the edition axis models. ## Generator: edition-only entries A `sanctorale.yaml` entry may now be **edition-only** — the mechanism the #64 burndown also needs for feasts 1962 dropped: - identity is emitted for **every** entry (the cross-edition union); - base attributes/placement stay gated on the base block; - an entry legitimately absent from 1962 marks itself **`notInBaseEdition: true`** (a missing base block *without* the marker still fails closed); - a new **orphan-identity build gate** proves every identity is placed by ≥1 edition. The `vigilia` grade is registered in all three layers (Node `DEFAULT_RANK_BY_LEGACY`, the attributes schema enum, PHP `LegacyRank`). ## Scope / deferrals (by design) - **Sunday → Saturday anticipation** and the **Matthias leap-year shift** (Feb 23→24) are *resolution* rules → deferred to `Rubrics1954Precedence` (**#67**). Vigils are anchored at their nominal civil date only. - A pre-existing **duplicate All Saints feast** (`omnes-sancti` / `omnium-sanctorum`) is left for the **#64** burndown; the vigil's `vigilOf` points at `omnes-sancti` (the Nov 1 golden-trace winner). ## Verification - **1962 (`roman-rubricae-1960`) edition byte-identical** — golden fixture untouched by construction. - PHPUnit **746** ✓ (new `VigilEditionTest`: restored vigils, the edition-axis grade difference, 1960 non-placement, + a data-driven check of all 13), phpcs 148/148, PHPStan L6 clean, generator **21/21** + `verify` OK. - Facts established by a research + adversarial-verification pass (roster corrected 12→13 — the Immaculate Conception vigil); the implementation passed an adversarial code+data review (no must-fixes). ### Follow-ups (filed against their owning issues, not here) - **#64:** a build gate asserting every `vigilOf`/`octaveOf` target is co-placed in its edition (premature now, while the 1954 diff is intentionally sparse). - **#67:** a leap-year characterization test for the Matthias feast/vigil split.
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!450
No description provided.