feat: load the fixed-date sanctoral onto the calendar grid (#24) #340

Merged
manlycucumber merged 1 commit from feature/24-sanctoral-loader into develop 2026-07-02 02:08:19 +00:00
manlycucumber commented 2026-07-02 02:07:17 +00:00 (Migrated from github.com)

Closes #24. First issue of Epic #23 (the sanctoral overlay).

What

Introduces src/Sanctoral/ — the sanctoral analogue of the temporal
block-fillers — plus the shared Calendar\RealizedObservance seam.

  • SanctoralCalendar::forYear($year, ?SanctoralData) places every entry on
    its civil date (Y-m-d => list<SanctoralObservance>), guarding the 29 Feb
    edge (placed only in leap years). Same-date ordering (#25) and the bissextile
    shift (#333) build on this.
  • SanctoralEntry / SanctoralData / SeedSanctoralData — the
    corpus datum, the source interface, and a provisional cited seed. The
    interface is the swap-seam for the cited corpus generator (#38): the seed is
    replaceable with zero change to the loader.
  • Calendar\RealizedObservance — the shared shape both cycles produce.
    TemporalObservance now implements it (a verified no-op) and the new
    SanctoralObservance (identity shell + rank + colour) implements it too, so
    the resolver (#29) compares temporal and sanctoral offices uniformly. Season
    stays a day property, deliberately off the interface. LiturgicalDay will
    hold RealizedObservances once the resolver assembles days (#37).

Correctness

The seed's ranks, colours, and Latin titles were adversarially verified against
the 1962 books. Two corrections folded in: the Four Crowned Martyrs (8 Nov) are
a commemoration, not a IV-class feast (1962 has no IV-class saints' feast —
IV is the commemoration tier); the Annunciation takes the locative title
"In Annuntiatione B.M.V.". Full seed rationale + sources:
docs/design/sanctoral-overlay-model.md.

Scope

The overlay is a standalone layer; composing it with the temporal skeleton by
precedence/commemoration/transfer is the resolver's work (#29). The complete
cited General Calendar is the corpus epic (#38).

Verification

composer lint (clean) · composer analyse (PHPStan L6, no errors) ·
composer test (363 tests, 16,480 assertions). Commits signed + DCO.

Closes #24. First issue of Epic #23 (the sanctoral overlay). ## What Introduces `src/Sanctoral/` — the sanctoral analogue of the temporal block-fillers — plus the shared `Calendar\RealizedObservance` seam. - **`SanctoralCalendar::forYear($year, ?SanctoralData)`** places every entry on its civil date (`Y-m-d => list<SanctoralObservance>`), guarding the 29 Feb edge (placed only in leap years). Same-date ordering (#25) and the bissextile shift (#333) build on this. - **`SanctoralEntry`** / **`SanctoralData`** / **`SeedSanctoralData`** — the corpus datum, the source interface, and a provisional cited seed. The interface is the swap-seam for the cited corpus generator (#38): the seed is replaceable with zero change to the loader. - **`Calendar\RealizedObservance`** — the shared shape both cycles produce. `TemporalObservance` now `implements` it (a verified no-op) and the new `SanctoralObservance` (identity shell + rank + colour) implements it too, so the resolver (#29) compares temporal and sanctoral offices uniformly. Season stays a day property, deliberately off the interface. `LiturgicalDay` will hold `RealizedObservance`s once the resolver assembles days (#37). ## Correctness The seed's ranks, colours, and Latin titles were adversarially verified against the 1962 books. Two corrections folded in: the Four Crowned Martyrs (8 Nov) are a **commemoration**, not a IV-class feast (1962 has no IV-class saints' feast — IV is the commemoration tier); the Annunciation takes the locative title **"In Annuntiatione B.M.V."**. Full seed rationale + sources: `docs/design/sanctoral-overlay-model.md`. ## Scope The overlay is a standalone layer; composing it with the temporal skeleton by precedence/commemoration/transfer is the resolver's work (#29). The complete cited General Calendar is the corpus epic (#38). ## Verification `composer lint` (clean) · `composer analyse` (PHPStan L6, no errors) · `composer test` (363 tests, 16,480 assertions). 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!340
No description provided.