feat: fill the Advent-to-Epiphany temporal block (#17) #334

Merged
manlycucumber merged 1 commit from feature/17-advent-epiphany into develop 2026-07-01 16:08:47 +00:00
manlycucumber commented 2026-07-01 16:07:27 +00:00 (Migrated from github.com)

Closes #17.

The first temporal block-filler. ChristmasCycle fills every day from the First Sunday of Advent through the eve of Septuagesima with its principal temporal office under the 1960 rubrics — the temporal Christmas cycle, counterpart of the Easter cycle built on PaschalSkeleton.

What's here

  • TemporalObservance — a day's per-edition realization: identity (ObservanceId + ObservanceKind) + Season + RankClass + ElementColour + Latin name. Kept distinct from the sanctoral Observance shell, which requires a titular a temporal day doesn't have (see the design note).
  • ChristmasCycleforYear() / firstSundayOfAdvent() / sundaysAfterEpiphany() / isShortAdvent() / days() / on(). First Sunday of Advent is anchored structurally to the Sunday nearest St Andrew (30 Nov), never to Easter. Fills Advent (Sundays, ferias, greater ferias 17–23 Dec, Ember days), the Nativity + octave, the Circumcision, the Epiphany, and the Sundays after Epiphany (counted against Septuagesima via PaschalSkeleton).
  • docs/design/temporal-fill-model.md — the fill rules and explicit scope boundaries (special movable feasts → #22, the Christmas-octave sanctoral → #23, precedence/commemoration → #29 compose on top).

Accuracy

Ranks/colours follow Rubricae Generales 1960: only the First Sunday of Advent is first class; Advent II–IV and all Sundays after Epiphany are second class; greater ferias and Ember days are second class. The 2–5 Jan Sunday is named Dominica post Octavam Nativitatisnot the anachronistic "II Sunday after Christmas" (a 1969-calendar construct).

Verified against known Advent dates (2023‑12‑03, 2024‑12‑01, 2025‑11‑30), the Septuagesima hand-off matching the existing PaschalSkeleton data, and a 1583–2200 invariant sweep (First Sunday always a Sunday in 27 Nov–3 Dec; Sundays-after-Epiphany always 1–6). An adversarial multi-agent review pass ran over the liturgical facts, edge cases, and design.

Gates

composer lint (PSR-12) · composer analyse (PHPStan L6) · composer test202 tests, 7776 assertions green locally.

Closes #17. The first temporal block-filler. `ChristmasCycle` fills every day from the First Sunday of Advent through the eve of Septuagesima with its principal temporal office under the 1960 rubrics — the temporal *Christmas cycle*, counterpart of the Easter cycle built on `PaschalSkeleton`. ## What's here - **`TemporalObservance`** — a day's per-edition realization: identity (`ObservanceId` + `ObservanceKind`) + `Season` + `RankClass` + `ElementColour` + Latin name. Kept distinct from the sanctoral `Observance` shell, which requires a titular a temporal day doesn't have (see the design note). - **`ChristmasCycle`** — `forYear()` / `firstSundayOfAdvent()` / `sundaysAfterEpiphany()` / `isShortAdvent()` / `days()` / `on()`. First Sunday of Advent is anchored structurally to the Sunday nearest St Andrew (30 Nov), never to Easter. Fills Advent (Sundays, ferias, greater ferias 17–23 Dec, Ember days), the Nativity + octave, the Circumcision, the Epiphany, and the Sundays after Epiphany (counted against Septuagesima via `PaschalSkeleton`). - **`docs/design/temporal-fill-model.md`** — the fill rules and explicit scope boundaries (special movable feasts → #22, the Christmas-octave sanctoral → #23, precedence/commemoration → #29 compose on top). ## Accuracy Ranks/colours follow **Rubricae Generales 1960**: only the First Sunday of Advent is first class; Advent II–IV and all Sundays after Epiphany are second class; greater ferias and Ember days are second class. The 2–5 Jan Sunday is named *Dominica post Octavam Nativitatis* — **not** the anachronistic "II Sunday after Christmas" (a 1969-calendar construct). Verified against known Advent dates (2023‑12‑03, 2024‑12‑01, 2025‑11‑30), the Septuagesima hand-off matching the existing `PaschalSkeleton` data, and a 1583–2200 invariant sweep (First Sunday always a Sunday in 27 Nov–3 Dec; Sundays-after-Epiphany always 1–6). An adversarial multi-agent review pass ran over the liturgical facts, edge cases, and design. ## Gates `composer lint` (PSR-12) · `composer analyse` (PHPStan L6) · `composer test` — **202 tests, 7776 assertions** green locally.
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!334
No description provided.