From 25aa1fa687ec714e145a998714c29a5f5728a603 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 18 Aug 2026 16:35:41 +0200 Subject: feat(ef): Rogation Monday and Tuesday (RG 87) RG 87: "Litaniae minores seu Rogationes, per se, assignantur feriis II, III et IV ante festum Ascensionis Domini." Easter+36 and +37 are that Monday and Tuesday. RG 128(d) gives them violet -- "for the procession and Mass of the Greater and Lesser Litanies" -- a penitential note inside white Paschaltide. lectio computed no Rogation days at all and showed a plain paschaltide feria. The WEDNESDAY is deliberately not built, and the test asserts its absence. Easter+38 is by construction the Vigil of the Ascension, II class, which wins the day outright; what the rubric asks for there is a COMMEMORATION, and this function returns one office per day. colitur reaches it through a movable-date entry in its sanctoral overlay. Extending the Rogation branch to +38 to "complete" the rubric would silently displace the Vigil, so the test pins the Vigil rather than leaving the omission to a comment. Rank is left as the feria's: these are IV-class days and any III-class saint displaces them, which is what makes the office rare. In 2026 all three are impeded and none appears; 2027 has the Monday unimpeded, and lectio and colitur are byte-identical across 2-5 May that year. One oracle allow-list entry: missalemeum builds no Rogation days either and shows a white feria, so it is the outlier here rather than lectio. --- internal/calendar/oracle_ef_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'internal/calendar/oracle_ef_test.go') diff --git a/internal/calendar/oracle_ef_test.go b/internal/calendar/oracle_ef_test.go index b765a34..79b31a5 100644 --- a/internal/calendar/oracle_ef_test.go +++ b/internal/calendar/oracle_ef_test.go @@ -127,6 +127,26 @@ type efAllow struct { } var efAllowList = []efAllow{ + { + // RG 87: "Litaniae minores seu Rogationes, per se, assignantur feriis + // II, III et IV ante festum Ascensionis Domini." The Monday and + // Tuesday before the Ascension are Rogation days, and RG 128(d) gives + // violet to "the procession and Mass of the Greater and Lesser + // Litanies" -- a penitential note inside white Paschaltide. + // + // missalemeum builds no Rogation days and shows a plain white + // paschaltide feria. It is the outlier here, not lectio: colitur has + // had these since its own v0.1 and the two engines now agree day for + // day. Rare in practice, because a III-class saint displaces them -- + // in 2026 all three are impeded and none appears. + match: func(date string, day time.Time, o efOracleDay) bool { + e := calendar.Easter(day.Year()) + off := int(day.Sub(e).Hours() / 24) + return off == 36 || off == 37 + }, + field: "colour", + reason: "RG 87 + RG 128(d): the Rogation Monday and Tuesday before the Ascension are violet; missalemeum builds no Rogation days (colitur C8)", + }, { // RG 124, "De coloribus paramentorum", section C "De colore rubro", // both photographic scans word for word: 124(b) gives red to -- cgit v1.3