From 967e911728eefb85dc53065c73c5c5d4cdce6a59 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 18 Aug 2026 15:39:48 +0200 Subject: fix(ef): twelve RG 124 colours -- missalemeum has the rule inverted RG 124, "De coloribus paramentorum", section C, both photographic scans word for word: 124(b) gives red to "Sanctorum Apostolorum et Evangelistarum, in eorum die natalicio, excepto festo S. Ioannis (27 decembris)", and 124(e) to "Sanctorum Martyrum, quorum colitur aut martyrium". Red is for Apostles, Evangelists and Martyrs. A Confessor, Doctor or non-martyr Virgin is white. missalemeum has twelve of these INVERTED IN BOTH DIRECTIONS: ten confessors, doctors and virgins in red (Ephrem, Julia of Falconieri, John Gualbert, Camillus de Lellis, Jerome Emiliani, Martha, Alphonsus Liguori, Augustine, Rose of Lima, John of San Fecundo), and two actual martyrs in white (Apollinaris and Josaphat, both Bishop and Martyr). Both directions failing is why this reads as one rule applied backwards rather than twelve separate slips, and why they are corrected as a block. Adjudicated by colitur against the scans -- its C18 carries the per-slug reasoning and its M21 the oracle side, verdict colitur. Two of its fourteen, conversion-of-st-paul and chair-of-st-peter, already agreed here. Found by a full-year sweep comparing clectio's output against colitur day by day, not by the patch tool that produced the earlier corrections. That tool reads colitur's sanctoral.sexp directly and so misses everything in adjustments.sexp, the overlay where all twenty of colitur's colour edits actually live -- its SECOND structural blind spot, after temporal days. All twelve go into the generator's missalOverrides table, so regeneration preserves them, and into TestTridentineMissalOverrides, now sixteen pinned fields. Mutation-tested in BOTH directions: reverting a martyr to white and a confessor to red each redden the test with the rubric named. Pinning only one direction would have let a careless "make them all white" fix pass ten of twelve. The oracle allow-list gains one entry covering the twelve dates in both years. --- internal/caldata/caldata_test.go | 17 ++++++++++++++ internal/caldata/tridentine-calendar.ini | 24 ++++++++++---------- internal/calendar/oracle_ef_test.go | 31 +++++++++++++++++++++++++ scripts/gen-sanctoral-ef.go | 39 ++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 12 deletions(-) diff --git a/internal/caldata/caldata_test.go b/internal/caldata/caldata_test.go index c0e2d50..95bb7dc 100644 --- a/internal/caldata/caldata_test.go +++ b/internal/caldata/caldata_test.go @@ -434,6 +434,23 @@ func TestTridentineMissalOverrides(t *testing.T) { {"didacus", "rank", "class-3", "Missal calendarium: S. Didaci Conf., III classis"}, {"vigil-of-st-lawrence", "colour", "violet", "RG 128: III-class vigil outside Paschaltide"}, {"vigil-of-the-assumption", "colour", "violet", "RG 128: II-class vigil outside Paschaltide"}, + // RG 124: red is for Apostles, Evangelists and Martyrs. missalemeum has + // these inverted in BOTH directions -- confessors and virgins red, two + // actual martyrs white -- which is why both directions are pinned here. + // A fix that turned every one of them white would pass ten of these + // twelve and fail the two that matter. + {"alphonsus-liguori", "colour", "white", "RG 124: not a martyr, so white"}, + {"apollinaris", "colour", "red", "RG 124(e): Bishop and MARTYR, red"}, + {"augustine", "colour", "white", "RG 124: not a martyr, so white"}, + {"camillus-de-lellis", "colour", "white", "RG 124: not a martyr, so white"}, + {"ephrem-of-syria", "colour", "white", "RG 124: not a martyr, so white"}, + {"jerome-emiliani", "colour", "white", "RG 124: not a martyr, so white"}, + {"john-gualbert", "colour", "white", "RG 124: not a martyr, so white"}, + {"john-of-san-fecundo", "colour", "white", "RG 124: not a martyr, so white"}, + {"josaphat", "colour", "red", "RG 124(e): Bishop and MARTYR, red"}, + {"julia-of-falconieri", "colour", "white", "RG 124: not a martyr, so white"}, + {"martha", "colour", "white", "RG 124: not a martyr, so white"}, + {"rose-of-lima", "colour", "white", "RG 124: not a martyr, so white"}, } { rc, ok := l.Cels[c.slug] if !ok { diff --git a/internal/caldata/tridentine-calendar.ini b/internal/caldata/tridentine-calendar.ini index 51b931a..54c8aa2 100644 --- a/internal/caldata/tridentine-calendar.ini +++ b/internal/caldata/tridentine-calendar.ini @@ -1053,7 +1053,7 @@ name.pl = śś. Bazylidesa, Cyryna, Nabora i Nazariusza, Męczenników [john-of-san-fecundo] date = 06-12 rank = class-3 -colour = red +colour = white name.en = St. John of San Fecundo name.pl = św. Jana z Facundo, Wyznawcy reading.first = Sir 31:8-11 @@ -1096,7 +1096,7 @@ reading.gospel = Matt 25:14-23 [ephrem-of-syria] date = 06-18 rank = class-3 -colour = red +colour = white name.en = St. Ephrem of Syria name.pl = św. Efrema, Diakona, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 @@ -1112,7 +1112,7 @@ name.pl = śś. Marka i Marcelina, Męczenników [julia-of-falconieri] date = 06-19 rank = class-3 -colour = red +colour = white name.en = St. Julia of Falconieri name.pl = św. Juliany Falconieri, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 @@ -1294,7 +1294,7 @@ name.pl = św. Piusa I, Papieża i Męczennika [john-gualbert] date = 07-12 rank = class-3 -colour = red +colour = white name.en = St. John Gualbert name.pl = św. Jana Gwalberta, Opata reading.first = Ecclus 45:1-6 @@ -1342,7 +1342,7 @@ name.pl = św. Aleksego, Wyznawcy [camillus-de-lellis] date = 07-18 rank = class-3 -colour = red +colour = white name.en = Camillus de Lellis name.pl = św. Kamila de Lellis reading.first = 1 John 3:13-18. @@ -1367,7 +1367,7 @@ reading.gospel = Luke 10:1-9 [jerome-emiliani] date = 07-20 rank = class-3 -colour = red +colour = white name.en = St. Jerome Emiliani name.pl = św. Hieronima Emiliani, Wyznawcy reading.first = Isa 58:7-11 @@ -1408,7 +1408,7 @@ reading.gospel = Luke 7:36-50 [apollinaris] date = 07-23 rank = class-3 -colour = white +colour = red name.en = St. Apollinaris name.pl = św. Apolinarego, Biskupa i Męczennika reading.first = 1 Pet. 5:1-11 @@ -1479,7 +1479,7 @@ name.pl = śś. Feliksa, Symplicjusza, Faustyna i Beatryczy, Męczenników [martha] date = 07-29 rank = class-3 -colour = red +colour = white name.en = St. Martha name.pl = św. Marty, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 @@ -1511,7 +1511,7 @@ name.pl = Siedmiu Braci Machabejskich, Męczenników [alphonsus-liguori] date = 08-02 rank = class-3 -colour = red +colour = white name.en = St. Alphonsus Liguori name.pl = św. Alfonsa Marii Liguori, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim. 2:1-7 @@ -1777,7 +1777,7 @@ reading.gospel = Matt 18:1-5 [augustine] date = 08-28 rank = class-3 -colour = red +colour = white name.en = St. Augustine name.pl = św. Augustyna, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 @@ -1809,7 +1809,7 @@ name.pl = św. Sabiny, Męczennicy [rose-of-lima] date = 08-30 rank = class-3 -colour = red +colour = white name.en = St. Rose of Lima name.pl = św. Róży z Limy, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 @@ -2435,7 +2435,7 @@ name.pl = św. Dydaka, Wyznawcy [josaphat] date = 11-14 rank = class-3 -colour = white +colour = red name.en = St. Josaphat name.pl = św. Jozafata, Biskupa i Męczennika reading.first = Heb 5:1-6 diff --git a/internal/calendar/oracle_ef_test.go b/internal/calendar/oracle_ef_test.go index 47983c9..b74d935 100644 --- a/internal/calendar/oracle_ef_test.go +++ b/internal/calendar/oracle_ef_test.go @@ -127,6 +127,37 @@ type efAllow struct { } var efAllowList = []efAllow{ + { + // RG 124, "De coloribus paramentorum", section C "De colore rubro", + // both photographic scans word for word: 124(b) gives red to + // "Sanctorum Apostolorum et Evangelistarum, in eorum die natalicio, + // excepto festo S. Ioannis (27 decembris)", and 124(e) to "Sanctorum + // Martyrum, quorum colitur aut martyrium". Red is for Apostles, + // Evangelists and Martyrs; a Confessor, Doctor or non-martyr Virgin is + // white. + // + // missalemeum has these INVERTED IN BOTH DIRECTIONS -- ten confessors + // and virgins in red, and two actual martyrs (Apollinaris and + // Josaphat, both Bishop and Martyr) in white. Both directions failing + // is why this is read as a systematic upstream error rather than a + // judgement call: a rule applied backwards, not a series of + // individual mistakes. + // + // colitur adjudicated the same fourteen slugs against the scans (its + // C18 carries the per-slug reasoning, its M21 the oracle side, verdict + // colitur). Twelve are corrected here; conversion-of-st-paul and + // chair-of-st-peter already agreed. + match: func(date string, day time.Time, o efOracleDay) bool { + switch date[5:] { + case "06-12", "06-18", "06-19", "07-12", "07-18", "07-20", + "07-23", "07-29", "08-02", "08-28", "08-30", "11-14": + return true + } + return false + }, + field: "colour", + reason: "RG 124: red is for Apostles, Evangelists and Martyrs; missalemeum has ten confessors/virgins red and two martyrs white, inverted in both directions (colitur C18/M21)", + }, { // The 1962 Missal's own universal CALENDARIUM ranks both of these as // bare III-class feasts, with no commemoration rubric: "S. Ubaldi Ep. diff --git a/scripts/gen-sanctoral-ef.go b/scripts/gen-sanctoral-ef.go index ba4d9ce..39826fc 100644 --- a/scripts/gen-sanctoral-ef.go +++ b/scripts/gen-sanctoral-ef.go @@ -333,6 +333,45 @@ var missalOverrides = []missalOverride{ `RG 128, same rule; 14 August is a II-class vigil outside Paschaltide. ` + `The rule's sole exception is the Ascension's vigil, INSIDE Paschaltide, ` + `which is white and is deliberately not listed here`}, + + // RG 124, "De coloribus paramentorum", section C "De colore rubro", both + // photographic scans word for word: 124(b) gives red to "Sanctorum + // Apostolorum et Evangelistarum, in eorum die natalicio, excepto festo S. + // Ioannis (27 decembris)", and 124(e) to "Sanctorum Martyrum, quorum + // colitur aut martyrium". Red is therefore for Apostles, Evangelists and + // Martyrs; a Confessor, Doctor or non-martyr Virgin is white. + // + // missalemeum has these twelve INVERTED IN BOTH DIRECTIONS -- ten + // confessors and virgins in red, and two actual martyrs in white -- which + // is the signature of a systematic upstream error rather than a judgement + // call, and is why they are corrected as a block. colitur adjudicated the + // same fourteen slugs against the scans (its C18 carries the per-slug + // reasoning, its M21 the oracle side); the two not listed here, + // conversion-of-st-paul and chair-of-st-peter, already agree. + {"alphonsus-liguori", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"apollinaris", "colour", "red", + `RG 124 Bishop and MARTYR -- RG 124(e), red`}, + {"augustine", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"camillus-de-lellis", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"ephrem-of-syria", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"jerome-emiliani", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"john-gualbert", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"john-of-san-fecundo", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"josaphat", "colour", "red", + `RG 124 Bishop and MARTYR -- RG 124(e), red`}, + {"julia-of-falconieri", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"martha", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, + {"rose-of-lima", "colour", "white", + `RG 124 not a martyr (Confessor/Virgin/Doctor) -- RG 124 gives red only to Apostles, Evangelists and Martyrs, so white`}, } // applyMissalOverrides rewrites the harvested entries in place and reports -- cgit v1.3