feat: assemble the resolved day and wire day() (#37) #353

Merged
manlycucumber merged 1 commit from feature/37-assemble-day into develop 2026-07-02 03:54:41 +00:00
manlycucumber commented 2026-07-02 03:53:43 +00:00 (Migrated from github.com)

Closes #37. Epic #29, issue 8/8 — the resolver; day() now works end to end.

What

day() composes the temporal skeleton and the sanctoral overlay into one
resolved LiturgicalDay.

  • Precedence\DayResolver resolves a whole civil year in one deterministic
    forward sweep (a transferred feast makes any day depend on earlier ones): per
    day it gathers the temporal office + movable feasts + sanctoral offices (+ any
    feast transferred onto the day), orders by tier, takes the top as the
    celebration, and resolves the rest to a commemoration (trimmed by
    CommemorationSelector), a transfer (TransferLedger / forced date), or an
    omission. A second pass fills in the evening concurrence.
  • Precedence\ResolvedYear — the immutable per-year index; day() resolves
    the year once and memoises it.
  • Calendar\LiturgicalDay now carries RealizedObservances in its four roles
    plus secondVespers().

Correctness

Cross-checked end-to-end against a published 2025 traditional (1962) ordo — 11
of 12 sample days matched; the one discrepancy was a real bug now fixed: an
ordinary feria (not Advent/Lent/Passiontide) carries no commemoration when
impeded (n. 108e) — omitted, not commemorated. Verified resolutions: Christmas;
St Joseph over its Lenten feria; the Annunciation on 25 Mar; the Immaculate
Conception; Ss Peter & Paul commemorating their Sunday; the II-class Sunday
outranking St Lawrence; the Christmas-octave interaction; and the whole-year
transfer
(St Joseph off the 2017 Lenten Sunday → celebrated the next day).
Exhaustive multi-oracle re-proving is the validation-harness epic (#45).

Verification

composer lint · composer analyse (PHPStan L6, no errors) · composer test
(472 tests, 30,329 assertions — +18). Commits signed + DCO.

Closes #37. Epic #29, issue 8/8 — **the resolver; day() now works end to end.** ## What `day()` composes the temporal skeleton and the sanctoral overlay into one resolved `LiturgicalDay`. - **`Precedence\DayResolver`** resolves a whole civil year in one deterministic forward sweep (a transferred feast makes any day depend on earlier ones): per day it gathers the temporal office + movable feasts + sanctoral offices (+ any feast transferred onto the day), orders by tier, takes the top as the **celebration**, and resolves the rest to a commemoration (trimmed by `CommemorationSelector`), a transfer (`TransferLedger` / forced date), or an omission. A second pass fills in the evening **concurrence**. - **`Precedence\ResolvedYear`** — the immutable per-year index; `day()` resolves the year once and memoises it. - **`Calendar\LiturgicalDay`** now carries `RealizedObservance`s in its four roles plus `secondVespers()`. ## Correctness Cross-checked end-to-end against a **published 2025 traditional (1962) ordo** — 11 of 12 sample days matched; the one discrepancy was a real bug now fixed: an **ordinary feria** (not Advent/Lent/Passiontide) carries **no commemoration** when impeded (n. 108e) — omitted, not commemorated. Verified resolutions: Christmas; St Joseph over its Lenten feria; the Annunciation on 25 Mar; the Immaculate Conception; Ss Peter & Paul commemorating their Sunday; the II-class Sunday outranking St Lawrence; the Christmas-octave interaction; and the **whole-year transfer** (St Joseph off the 2017 Lenten Sunday → celebrated the next day). Exhaustive multi-oracle re-proving is the validation-harness epic (#45). ## Verification `composer lint` · `composer analyse` (PHPStan L6, no errors) · `composer test` (472 tests, 30,329 assertions — +18). Commits signed + DCO.
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!353
No description provided.