From e713da2d796eabc55d407ad2f8488861e7598798 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 18 Aug 2026 17:33:20 +0200 Subject: fix(ef): two I-class feasts can no longer transfer onto the same day RG 97/98 require a year's impeded I-class transfers to be resolved together. transferIfImpededEF resolved each one independently, so when an early Easter impedes both St Joseph (19 March) and the Annunciation (25 March), both walked to the Monday after Low Sunday -- and St Joseph, losing pickEF there, was observed on NO day of 2008, 2035 or 2046 at all. He appeared only as a commemoration in the Annunciation's tail. RG 96(a) settles it outright, and it is not a tie-break: the Annunciation transferred after Easter has a sedes propria -- "quando est transferendum post Pascha, transfertur, tamquam in sedem propriam, in feriam II post dominicam in albis". It claims the Monday by law; the rest queue in RG 98's order (table position, then the office impeded first) and walk around it. New efTransferPlan resolves the whole year's transfers as a set and hands each feast its target; transferIfImpededEF keeps the single-candidate walk and All Souls. The stale doc comment recording this as a known unfixable limitation is replaced -- its reasoning argued RG 97/98 tie-breaks, when RG 96(a) decides the only collision the universal calendar actually produces. 2008-04-01, 2035-04-03, 2046-04-03 ef-easter-2-tuesday -> St Joseph Matches colitur on all three. Mutation-tested: bypassing the plan reddens the new test on all three years. fix(ef): 13 January's Baptism is omitted when Holy Family falls on it The Holy Family Mass propers, verbatim in both photographic scans of the 1962 Missal: "Si festum S. Familiae occurrerit die 13 ianuarii, Missa dicitur de festo S. Familiae, sine commemoratione Baptismatis D.N.I.C., et sine commemoratione dominicae." Sine commemoratione: the Baptism is omitted outright, not merely outranked, so the candidate is dropped rather than left in Others. Structurally the same answer RG 91 entry 14 gives (Festa Domini II classis: primum mobilia, deinde fixa), but the propers' rubric is the direct authority for the omission. lectio kept the Baptism as the observed office on all seven such years in 2005-2050 -- 2008, 2013, 2019, 2030, 2036, 2041, 2047 -- and never observed the Holy Family Mass on 13 January at all. It already had the Holy Family Mass on every other Sunday after Epiphany, so this was the one date it could not reach. 13 rows of the 16801-day differential fixture change; colitur agrees with all of them. --- internal/calendar/temporal_ef.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'internal/calendar/temporal_ef.go') diff --git a/internal/calendar/temporal_ef.go b/internal/calendar/temporal_ef.go index 0cd4b41..4ac446a 100644 --- a/internal/calendar/temporal_ef.go +++ b/internal/calendar/temporal_ef.go @@ -372,6 +372,32 @@ func firstSundayAfterEpiphany(y int) time.Time { return d } +// efBaptismOmitted reports whether 13 January's Commemoration of the Baptism of +// Our Lord is omitted entirely this year because the feast of the Holy Family +// falls on that date. The Holy Family Mass propers carry the rule verbatim, in +// both photographic scans of the 1962 Missal: +// +// "Si festum S. Familiae occurrerit die 13 ianuarii, Missa dicitur de festo +// S. Familiae, sine commemoratione Baptismatis D.N.I.C., et sine +// commemoratione dominicae." +// +// The Baptism does not merely lose the day -- it is omitted, "sine +// commemoratione" -- which is why this drops the candidate outright instead of +// letting precedenceEF rank it and leave it in Others. +// +// Structurally the same answer RG 91 entry 14 gives ("Festa Domini II classis": +// primum mobilia, deinde fixa -- the movable Holy Family ahead of the fixed +// Baptism), but the propers' rubric is the direct authority for the omission, +// and it is the half that RG 91 alone would not settle. +// +// Live in 7 of the 46 years 2005-2050 (2008, 2013, 2019, 2030, 2036, 2041, +// 2047); lectio kept the Baptism on every one of them and never observed the +// Holy Family Mass there at all. +func efBaptismOmitted(date time.Time) bool { + return date.Month() == time.January && date.Day() == 13 && + sameDay(date, firstSundayAfterEpiphany(date.Year())) +} + // thirdSundayOfSeptember returns the third Sunday in September of year y. func thirdSundayOfSeptember(y int) time.Time { d := time.Date(y, time.September, 1, 0, 0, 0, 0, time.UTC) -- cgit v1.3