feat: leap-year bissextile placement (St Matthias 24→25 Feb) (#333) #345

Merged
manlycucumber merged 1 commit from feature/333-bissextile into develop 2026-07-02 02:33:12 +00:00
manlycucumber commented 2026-07-02 02:32:03 +00:00 (Migrated from github.com)

Closes #333. Epic #23, issue 6/6 — completes the sanctoral overlay.

What

In a leap year the traditional calendar doubles the sexto Kalendas Martii
(civil 24 February), so every feast on 24–28 February is kept one day later:

  • St Matthias 24 Feb → 25 Feb
  • St Gabriel of Our Lady of Sorrows 27 Feb → 28 Feb
  • a 28 Feb feast → 29 Feb

24 February itself becomes the bis-sextus feria. SanctoralCalendar applies
this from the date alone (month 2, day 24–28 in a leap year) — no per-entry
flag.

Correctness

The rule and its two named consequences (Matthias→25, Gabriel→28) were verified
in the design pass against the 1962 rubric text. A 1583–2200 invariant sweep
proves the shift never collides (exactly one office per realized date) and that
St Matthias lands on its leap-dependent day every year.

Verification

composer lint · composer analyse (PHPStan L6, no errors) · composer test
(395 tests, 30,196 assertions — +5 tests, ~13.6k sweep assertions). Signed + DCO.

Closes #333. Epic #23, issue 6/6 — completes the sanctoral overlay. ## What In a leap year the traditional calendar doubles the *sexto Kalendas Martii* (civil 24 February), so every feast on **24–28 February is kept one day later**: - St Matthias 24 Feb → 25 Feb - St Gabriel of Our Lady of Sorrows 27 Feb → 28 Feb - a 28 Feb feast → 29 Feb 24 February itself becomes the *bis-sextus* feria. `SanctoralCalendar` applies this from the date alone (`month 2, day 24–28` in a leap year) — no per-entry flag. ## Correctness The rule and its two named consequences (Matthias→25, Gabriel→28) were verified in the design pass against the 1962 rubric text. A **1583–2200 invariant sweep** proves the shift never collides (exactly one office per realized date) and that St Matthias lands on its leap-dependent day every year. ## Verification `composer lint` · `composer analyse` (PHPStan L6, no errors) · `composer test` (395 tests, 30,196 assertions — +5 tests, ~13.6k sweep assertions). 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!345
No description provided.