feat: make the 1954 and 1955 editions publicly resolvable (#453) #467

Merged
manlycucumber merged 2 commits from feature/453-flip-isbuilt into develop 2026-07-07 19:35:01 +00:00
manlycucumber commented 2026-07-07 19:19:26 +00:00 (Migrated from github.com)

The final #453 PR — flip isBuilt for 1954 and 1955

With every calendar-level component built by PRs A–E (octaves, vigils, the full sanctoral, the privileged temporal octaves, the moveable feasts, the Office of the Dead, the Saturday Office of Our Lady), this flips RubricSystem::isBuilt() to true for Divino Afflatu (1954) and Cum nostra (1955). They are now publicly resolvableday(), contract(), and CalendarCatalog::resolver() serve them by name, where they were reachable only through DayResolver::forEdition() before.

The flip

  • Registry: 1954/1955 built => true; 1962 unchanged.
  • The CalendarCatalog guard stays; its meaning narrows. It no longer fires for the three built systems but still refuses a future declared-but-unbuilt edition (Tridentine, Novus Ordo). isBuilt() remains the single source of truth, read by both the Api /meta advertise-filter and this runtime gate — I deliberately kept the boundary check rather than deleting now-dormant code, because the next edition will land unbuilt and wants it. (Open to reversing this if the review disagrees.)
  • Four tests that asserted the boundary refused 1954/1955 are converted to assert it now resolves them; RubricSystemTest asserts all three are built.

Tabella dignity — complete for the universal fixed calendar

An offline scan of the 1954 fixed-date placements finds exactly two same-day Simple-vs-Simple collisions; both are now in the dignior-simple set — 19 Jan (Marius > Canute) and 21 Oct (Hilarion > Ursula). The resolved calendar is byte-identical (Oct 21 already agreed alphabetically); the change makes both rule-driven, not lucky. Under 1955 the reform abolished the simple office, so the set is inert there (documented in its precedence.yaml).

Full-year structural sweep

PreConciliarYearSweepTest resolves every day of five stress-test years (earliest/latest Easter, two leap years, the 1954 anticipated-Sunday year) under each edition — exactly one principal office, a valid colour, a clean contract stamp. This is the offline proof that opening the public boundary exposes no latent crash. It complements, not replaces, the pinned Divinum Officium agreement fixture; the definitive live full-year DO oracle sweep across the whole corpus stays the maintainer's cross-check (the DO Perl checkout does not run on every platform).

One residual tracked in known-differences.ndjson (category renamed deferred-anticipated-sunday): the temporal engine does not yet mint an anticipated Sunday, so a rare Saturday-before-early-Septuagesima shows the Saturday Office instead of yielding; the lady tier is already ranked to yield once that observance is built.

Verification

  • lint + phpstan clean · 989 PHPUnit + 32 generator tests green · corpus reproducible.
  • 1962 golden byte-identical — the corpus delta is only the DA dignior-simple membership rule; 1955 byte-identical (only a comment changed). corpusVersion1962-2026-07-07.3.
  • Docs: rubric-system-model.md Seam 10, KNOWN-LIMITATIONS, ROADMAP v0.3 shipped.

Closes #453.

## The final #453 PR — flip `isBuilt` for 1954 and 1955 With every calendar-level component built by PRs A–E (octaves, vigils, the full sanctoral, the privileged temporal octaves, the moveable feasts, the Office of the Dead, the Saturday Office of Our Lady), this flips `RubricSystem::isBuilt()` to `true` for **Divino Afflatu (1954)** and **Cum nostra (1955)**. They are now **publicly resolvable** — `day()`, `contract()`, and `CalendarCatalog::resolver()` serve them by name, where they were reachable only through `DayResolver::forEdition()` before. ### The flip - Registry: `1954/1955 built => true`; **1962 unchanged**. - **The `CalendarCatalog` guard stays; its meaning narrows.** It no longer fires for the three built systems but still refuses a *future* declared-but-unbuilt edition (Tridentine, Novus Ordo). `isBuilt()` remains the single source of truth, read by both the Api `/meta` advertise-filter and this runtime gate — I deliberately kept the boundary check rather than deleting now-dormant code, because the next edition will land unbuilt and wants it. (Open to reversing this if the review disagrees.) - Four tests that asserted the boundary **refused** 1954/1955 are converted to assert it now **resolves** them; `RubricSystemTest` asserts all three are built. ### Tabella dignity — complete for the universal fixed calendar An offline scan of the 1954 fixed-date placements finds **exactly two** same-day Simple-vs-Simple collisions; both are now in the `dignior-simple` set — 19 Jan (Marius > Canute) and **21 Oct (Hilarion > Ursula)**. The resolved calendar is **byte-identical** (Oct 21 already agreed alphabetically); the change makes both rule-driven, not lucky. Under 1955 the reform abolished the simple office, so the set is inert there (documented in its `precedence.yaml`). ### Full-year structural sweep `PreConciliarYearSweepTest` resolves **every day of five stress-test years** (earliest/latest Easter, two leap years, the 1954 anticipated-Sunday year) under each edition — exactly one principal office, a valid colour, a clean contract stamp. This is the offline proof that opening the public boundary exposes no latent crash. It **complements**, not replaces, the pinned Divinum Officium agreement fixture; the definitive **live full-year DO oracle sweep** across the whole corpus stays the maintainer's cross-check (the DO Perl checkout does not run on every platform). One residual tracked in `known-differences.ndjson` (category renamed `deferred-anticipated-sunday`): the temporal engine does not yet mint an *anticipated* Sunday, so a rare Saturday-before-early-Septuagesima shows the Saturday Office instead of yielding; the lady tier is already ranked to yield once that observance is built. ### Verification - ✅ `lint` + `phpstan` clean · **989 PHPUnit** + **32 generator** tests green · corpus reproducible. - ✅ **1962 golden byte-identical** — the corpus delta is only the DA `dignior-simple` membership rule; 1955 byte-identical (only a comment changed). `corpusVersion` → `1962-2026-07-07.3`. - Docs: `rubric-system-model.md` Seam 10, `KNOWN-LIMITATIONS`, `ROADMAP` v0.3 shipped. Closes #453.
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!467
No description provided.