From f40eb498c612aeda2ff7f3d5b898e4d1ddcec352 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 13:04:53 +0200 Subject: temporal_ef: Sunday ranks, Rose Sundays, Holy Thursday white Four fixes to internal/calendar/temporal_ef.go, all found by the strengthened oracle test (previous commit): 1. Sunday ranks (defect 4). The generic Sunday branch assigned class-2 to every Sunday except Advent I. RG 11-12 / RG 91 entry 6: every Sunday of Advent and every Sunday of Lent is I class (as are Passiontide's own two Sundays and Low Sunday, already correct via their named-feast cases). Fixes St Joseph wrongly taking a Sunday of Lent (defect 3, precedence_ef_repro_test.go's TestJosephYieldsToSundayOfLent) as a direct consequence: once Lent Sundays are I class, Joseph (also I class) no longer wins the tie outright and correctly transfers to the 20th via the existing RG 96 walk -- no separate code change was needed for defect 3. 2. Rose (defect 5). efColour had no Rose case at all; Gaudete (Advent III) and Laetare (Lent IV) now get Rose on that Sunday specifically (RG 131: rose vestments may be used "in Officio et Missa diei dominici tantum", for that Sunday's Office and Mass only), not the surrounding Sundays. 3. Holy Thursday's colour (defect 6). RG 128(b) names the Missa in Cena Domini as a whole-Mass exception to Passiontide's violet; RG 122 states the same fact affirmatively, in the White section itself. Good Friday and Holy Saturday, either side, are unchanged (still violet -- their own black/no-colour treatment is a separate, unmodelled gap, noted in precedence_ef.go's own doc comments). 4. Beyond the seven, found by the same strengthened test and fixed for the same RG 91 entry 18 reason defect 2 (next commit) relies on: the Ember days of Lent had no case in efEmberSlug at all (only September and Advent did), so they fell through to the ordinary III-class Lenten-feria rank instead of the II class RG 91 entry 18 requires. The late-Advent ferias (17-23 Dec, RG 91 entry 18) and the days within the Octave of the Nativity (26-31 Dec, RG 67-68) had no elevation at all, defaulting to III/IV class. All three are one-line, unambiguous, primary-cited additions to the same rank logic already being touched here -- left unfixed, the strengthened oracle test could only reach green by allow-listing them as if they were defensible divergences, which they are not. Witnesses (temporal_ef_test.go): TestTemporalEFSundayRanks, TestTemporalEFRoseSundays, TestTemporalEFHolyThursdayColour, TestTemporalEFEmberDayRanks. All fail before this commit; see the report for the exact pre-fix failure messages. --- internal/calendar/precedence_ef_repro_test.go | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 internal/calendar/precedence_ef_repro_test.go (limited to 'internal/calendar/precedence_ef_repro_test.go') diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go new file mode 100644 index 0000000..6c333d0 --- /dev/null +++ b/internal/calendar/precedence_ef_repro_test.go @@ -0,0 +1,45 @@ +package calendar_test + +// Reproduction tests for three named EF precedence defects (colitur's +// differential/oracle audit against lectio's ~66-line EF precedence +// approximation, internal/calendar/precedence_ef.go). Each test fails before +// its fix and passes after -- see the report for the exact pre-fix failure +// message. These exercise the REAL tridentine sanctoral data +// (caldata.Tridentine()) through the public Compute entry point, since the +// bugs are about how real fixed-date feasts interact with the temporal +// calendar, not about precedenceEF's arithmetic in isolation (that is +// covered separately, package-internal, in precedence_ef_test.go). + +import ( + "testing" + "time" + + "github.com/lukaszkasprzak/lectio/internal/caldata" + "github.com/lukaszkasprzak/lectio/internal/calendar" +) + +func efCompute(date string) calendar.LiturgicalDay { + sel := calendar.DefaultSelection() + sel.Form = "old" + d, _ := time.Parse("2006-01-02", date) + return calendar.Compute(d.UTC(), sel, []calendar.Layer{caldata.Tridentine()}) +} + +// TestJosephYieldsToSundayOfLent: RG 91 entry 6 (Sundays of Lent, I class) +// vs entry 11 (I-class feasts of the universal Church not above) -- the +// Sunday holds; St Joseph (19 March) transfers to the next free day (RG 95, +// RG 96), landing on the 20th. Before the fix (defect 4: Sunday ranks), Lent +// Sundays were wrongly II class, so Joseph (I class) won outright every time +// this collision occurred. +func TestJosephYieldsToSundayOfLent(t *testing.T) { + for _, year := range []string{"2006", "2017", "2023", "2028", "2034", "2045"} { + sunday := efCompute(year + "-03-19") + if sunday.Observed.Slug == "joseph-spouse-of-the-bl-virgin-mary" { + t.Errorf("%s-03-19 observed = %q want the Lent Sunday (RG 91 entry 6 beats entry 11)", year, sunday.Observed.Slug) + } + next := efCompute(year + "-03-20") + if next.Observed.Slug != "joseph-spouse-of-the-bl-virgin-mary" { + t.Errorf("%s-03-20 observed = %q want joseph-spouse-of-the-bl-virgin-mary (transferred one day, RG 96)", year, next.Observed.Slug) + } + } +} -- cgit v1.3 From 00a32e549493b0fb51ae23e8a5e73aa54a5205b1 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 13:05:34 +0200 Subject: calendar: RG 96 transfers must skip II-class days too (defect 1) transferIfImpededEF's forward walk only skipped days whose temporal office was I class. RG 96 requires skipping to "the next following day that is not I or II class" -- II class also blocks. 2011: the Sacred Heart (Friday after the Corpus Christi octave) falls on 1 July and impedes the Precious Blood, also fixed on 1 July. The walk landed the Precious Blood on 2 July, displacing the Visitation (II class, fixed) outright, and never reached 3 July (an ordinary II-class Sunday) at all. Two changes were needed together, not one: 1. The walk's continuation threshold widens from "temporal band <= 2" to "<= 3", which is what actually captures every II-class temporal day (an ordinary Sunday, or a II-class named feast) as well as every I-class one -- band 3 is precedenceEF's own value for any non-Sunday-privileged II-class temporal candidate, unchanged by this commit. 2. A FIXED sanctoral II-class feast (the Visitation) has no temporal band at all -- the walk needs to also check whether some OTHER fixed celebration, class 1 or 2, already resolves onto the candidate day. computeEF now builds this check once (occupiedByRank, parameterised by which ranks count) and passes it in. Widening (1) alone is wrong on its own: a class-1 feast is NEVER actually impeded by a mere II-class day (I class always outranks II class outright, no tie exists) -- naively applying the wide "<=3" threshold to decide whether the ORIGINAL date is impeded, not just where to land afterwards, wrongly bumped unimpeded feasts landing on an ordinary Sunday (caught while testing this: All Saints, 1 Nov 2026, a Sunday that year, was wrongly pushed to 3 Nov). transferIfImpededEF now uses two different thresholds for two different questions -- class 1 only to decide IF a candidate is impeded at all, class 1 OR 2 to decide where an already-impeded one may land -- see its own doc comment for the full reasoning. Witness (precedence_ef_repro_test.go): TestTransferSkipsBothIAndIIClass. Fails before this commit with: 2011-07-02 observed = "precious-blood-of-our-lord-jesus-christ" want visitation-of-the-blessed-virgin-mary (RG 96: the Precious Blood must skip past it, not displace it) 2011-07-04 observed = "ef-time-after-pentecost-3-monday" want precious-blood-of-our-lord-jesus-christ (RG 96: first day that is neither I nor II class) --- internal/calendar/calendar.go | 76 ++++++++++++++++++++++----- internal/calendar/precedence_ef_repro_test.go | 22 ++++++++ 2 files changed, 86 insertions(+), 12 deletions(-) (limited to 'internal/calendar/precedence_ef_repro_test.go') diff --git a/internal/calendar/calendar.go b/internal/calendar/calendar.go index 33706d8..f364321 100644 --- a/internal/calendar/calendar.go +++ b/internal/calendar/calendar.go @@ -35,14 +35,43 @@ func TemporalSlug(date time.Time, sel Selection) string { func computeEF(date time.Time, sel Selection, layers []Layer) LiturgicalDay { td := temporalEF(date) merged := mergeLayers(layers) - cands := []candidate{{Cel: td.Cel, Temporal: true, Season: td.Season}} + year := date.Year() + // occupiedByRank reports whether some OTHER fixed-date sanctoral + // celebration whose rank passes `allowed` resolves onto d this year. + // transferIfImpededEF uses this at two different thresholds: class 1 + // only, to decide whether a candidate is impeded in the first place (a + // class-2 occupant never impedes a class-1 feast -- class 1 always beats + // class 2 outright, no tie exists); and class 1 OR 2, for RG 96's "next + // day that is not I or II class" once a transfer is already under way + // (e.g. the Visitation, 2 July, blocking the Precious Blood's transfer + // off 1 July in 2011). + occupiedByRank := func(d time.Time, exceptSlug string, allowed func(Rank) bool) bool { + for slug2, rc2 := range merged { + if slug2 == exceptSlug { + continue + } + cel2 := buildCelebration(slug2, rc2) + if !allowed(cel2.Rank) { + continue + } + if when2, ok := celebrationDate(cel2, year, sel); ok && sameDay(when2, d) { + return true + } + } + return false + } + isClass1 := func(r Rank) bool { return r == RankClass1 } + isClass1Or2 := func(r Rank) bool { return r == RankClass1 || r == RankClass2 } + cands := []candidate{{Cel: td.Cel, Temporal: true, Season: td.Season, Sunday: td.Sunday}} for slug, rc := range merged { cel := buildCelebration(slug, rc) - when, ok := celebrationDate(cel, date.Year(), sel) + when, ok := celebrationDate(cel, year, sel) if !ok { continue } - effective := transferIfImpededEF(cel, when) + effective := transferIfImpededEF(cel, when, + func(d time.Time) bool { return occupiedByRank(d, cel.Slug, isClass1) }, + func(d time.Time) bool { return occupiedByRank(d, cel.Slug, isClass1Or2) }) if sameDay(effective, date) { cands = append(cands, candidate{Cel: cel, Temporal: false, Season: td.Season}) } @@ -199,12 +228,29 @@ func transferIfImpeded(cel Celebration, when time.Time, sel Selection) time.Time // transferIfImpededEF moves an EF sanctoral feast off a date it cannot be kept // on. Two rules cover the 1962 cases: All Souls, when Nov 2 is a Sunday, is -// transferred to the Monday (Nov 3); and a I class feast impeded by a I class -// temporal day (Holy Week, the Easter octave) is pushed forward to the next free -// day — for the Annunciation in Holy Week this lands on the Monday after Low -// Sunday, past the whole privileged octave. Lower-rank feasts are only -// commemorated, never transferred. -func transferIfImpededEF(cel Celebration, when time.Time) time.Time { +// transferred to the Monday (Nov 3); and a I class feast genuinely impeded is +// pushed forward to the next day that is itself neither I nor II class (RG +// 96: "the next following day that is not I or II class"). Lower-rank feasts +// are only commemorated, never transferred (RG 95). +// +// occupiedByClass1 and occupiedByClass1Or2 are deliberately different +// thresholds, not the same check reused twice: +// - a candidate is impeded IN THE FIRST PLACE only by a genuine class-1 +// collision -- the temporal office of `when` is itself I class (a Sunday +// of Advent/Lent/Passiontide, Holy Week, a named I-class feast), or +// another FIXED I-class sanctoral feast already sits on `when` (RG +// 97/98). A II-class occupant, temporal or sanctoral, never impedes a +// I-class feast at all -- I class always outranks II class outright, no +// tie-break is even reached -- so using the wider I-OR-II threshold here +// would (and, before this fix, did: e.g. All Saints, 1 Nov, was wrongly +// bumped to 3 Nov merely for landing on an ordinary II-class Sunday it +// would have won outright) send an unimpeded I-class feast on an +// unnecessary walk. +// - once a transfer is under way, the DESTINATION must avoid landing on +// ANY I- or II-class day (RG 96's own wider "not I or II class" text) -- +// e.g. the Visitation, 2 July, blocks the Precious Blood's transfer off 1 +// July in 2011, and 3 July's ordinary Sunday blocks it a second time. +func transferIfImpededEF(cel Celebration, when time.Time, occupiedByClass1, occupiedByClass1Or2 func(time.Time) bool) time.Time { if when.Month() == time.November && when.Day() == 2 && when.Weekday() == time.Sunday && strings.Contains(cel.Slug, "all-souls") { return when.AddDate(0, 0, 1) @@ -212,11 +258,17 @@ func transferIfImpededEF(cel Celebration, when time.Time) time.Time { if cel.Rank != RankClass1 { return when } - day := when + startTemporal := temporalEF(when) + startImpeded := startTemporal.Cel.Rank == RankClass1 || occupiedByClass1(when) + if !startImpeded { + return when + } + day := when.AddDate(0, 0, 1) for i := 0; i < 30; i++ { b := temporalEF(day) - if precedenceEF(candidate{Cel: b.Cel, Temporal: true, Season: b.Season}) <= 2 { - day = day.AddDate(0, 0, 1) // impeded by a I class temporal day; push forward + band := precedenceEF(candidate{Cel: b.Cel, Temporal: true, Season: b.Season, Sunday: b.Sunday}) + if band <= 3 || occupiedByClass1Or2(day) { + day = day.AddDate(0, 0, 1) // still I- or II-class; keep walking continue } return day diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go index 6c333d0..1f38996 100644 --- a/internal/calendar/precedence_ef_repro_test.go +++ b/internal/calendar/precedence_ef_repro_test.go @@ -43,3 +43,25 @@ func TestJosephYieldsToSundayOfLent(t *testing.T) { } } } + +// TestTransferSkipsBothIAndIIClass: RG 96 -- an impeded I-class feast +// transfers to the next day that is NOT ITSELF I OR II CLASS (not merely "not +// I class"). 2011: the Sacred Heart (Friday after the Corpus Christi octave) +// falls on 1 July and impedes the Precious Blood (also 1 July, fixed). 2 +// July is the Visitation (II class, fixed); 3 July is an ordinary II-class +// Sunday. Both must be skipped; the Precious Blood lands on 4 July, and the +// Visitation is observed, undisplaced, on its own day. +func TestTransferSkipsBothIAndIIClass(t *testing.T) { + if got := efCompute("2011-07-01").Observed.Slug; got != "ef-sacred-heart" { + t.Fatalf("2011-07-01 observed = %q want ef-sacred-heart", got) + } + if got := efCompute("2011-07-02").Observed.Slug; got != "visitation-of-the-blessed-virgin-mary" { + t.Errorf("2011-07-02 observed = %q want visitation-of-the-blessed-virgin-mary (RG 96: the Precious Blood must skip past it, not displace it)", got) + } + if got := efCompute("2011-07-03").Observed.Slug; got != "ef-time-after-pentecost-sunday-3" { + t.Errorf("2011-07-03 observed = %q want ef-time-after-pentecost-sunday-3 (an ordinary II-class Sunday also blocks a I-class transfer)", got) + } + if got := efCompute("2011-07-04").Observed.Slug; got != "precious-blood-of-our-lord-jesus-christ" { + t.Errorf("2011-07-04 observed = %q want precious-blood-of-our-lord-jesus-christ (RG 96: first day that is neither I nor II class)", got) + } +} -- cgit v1.3 From 61a2d658fea1c9a1640cb54bb203a8441bbb17a9 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 13:06:18 +0200 Subject: precedence_ef: a II-class privileged feria yields to a feast (defect 2) precedenceEF's equal-class tie-break only distinguished "ordinary III/IV-class feria yields" from "everything else wins" -- Sundays, named feasts, Lent/Passiontide ferias, AND II-class privileged ferias (the Ember days, the late-Advent 17-23 Dec ferias) were all bucketed into the same "wins its tie" branch. RG 91 disagrees at class 2: entry 15 (Sundays) sits ABOVE entry 16 (II-class feasts of the universal Church), so a Sunday wins -- but entry 16 sits ABOVE entry 18 (II-class ferias, including the Ember days), so those FERIAS yield instead, the opposite direction from a Sunday. St Matthew (21 September, II class) was losing to the September Ember Wednesday every time the two coincided; St Thomas (21 December, II class) was losing to an ordinary late-Advent feria the same way once the previous commit correctly promoted those ferias to II class. The fix distinguishes a II-class Sunday from a II-class feria using a Sunday flag that already existed on `candidate` (used by the OF path) but was never wired up for EF: temporal_ef.go's efCel always set Sunday: false, even on an actual Sunday. A new efSunday helper (efCel plus the flag) replaces the three efCel calls inside temporalEF's Sunday branch, and computeEF now propagates td.Sunday into the day's temporal candidate. precedence_ef_test.go's own pre-existing witness ("at equal class, the temporal office wins") encoded exactly the bug: a bare class-2 temporal candidate with no Sunday/season information, standing in for "the temporal office" in general. It is rewritten into two explicit cases (Sunday wins its tie; a privileged feria yields) plus the existing Lent/Passiontide-vs-ordinary III/IV-class case restated explicitly rather than left implicit. Witness (precedence_ef_repro_test.go): TestMatthewBeatsSeptemberEmberWednesday. Fails before this commit with: 2016-09-21 observed = "ef-september-ember-wed" want matthew (RG 91 entry 16 beats entry 18) 2022-09-21 observed = "ef-september-ember-wed" want matthew (RG 91 entry 16 beats entry 18) With this commit, all seven named defects are fixed: LECTIO_EF_ORACLE_STRICT=1 go test ./internal/calendar/... -run TestOracleEF passes (0 unallow-listed rank/colour mismatches over 730 days). The gate stays in place for this commit; a following commit removes it. --- internal/calendar/precedence_ef.go | 49 ++++++++++++++------ internal/calendar/precedence_ef_repro_test.go | 16 +++++++ internal/calendar/precedence_ef_test.go | 67 +++++++++++++++++++++++---- 3 files changed, 110 insertions(+), 22 deletions(-) (limited to 'internal/calendar/precedence_ef_repro_test.go') diff --git a/internal/calendar/precedence_ef.go b/internal/calendar/precedence_ef.go index 4fda626..a1788be 100644 --- a/internal/calendar/precedence_ef.go +++ b/internal/calendar/precedence_ef.go @@ -22,24 +22,47 @@ func efRankOrder(r Rank) int { } // precedenceEF ranks an EF candidate for occurrence (lower = higher precedence): -// by class first, then a tie-break at equal class (1960 occurrence table). +// by class first, then a tie-break at equal class (RG 91's Table of +// Precedence, read entry-by-entry within each class). // -// The tie-break is asymmetric by season. An ORDINARY feria (per annum, Advent, -// Septuagesima) yields to an equal-class feast — the feast is celebrated and the -// feria commemorated (e.g. St Francis Xavier, Dec 3, on an Advent feria). The -// ferias of Lent and Passiontide are privileged: they outrank an equal-class -// feast, which is only commemorated. Sundays and named temporal feasts likewise -// win their ties. The *2 class spacing means the ±1 tie-break never crosses a -// class boundary. +// The tie-break is asymmetric by season AND, at class 2, by whether the +// temporal day is a Sunday or a privileged FERIA: +// - III/IV class: an ORDINARY feria (per annum, Advent to 16 Dec, +// Septuagesima) yields to an equal-class feast (entries 24/25 above the +// feria) -- the feast is celebrated, the feria commemorated (e.g. St +// Francis Xavier, Dec 3). The ferias of Lent and Passiontide are +// privileged (entry 22, ABOVE entry 24): they outrank an equal-class +// feast, which is only commemorated. +// - II class: an ordinary SUNDAY wins its tie (entry 15, above entry 16's +// feasts) -- but a II-class privileged FERIA (the Ember days, the +// late-Advent 17-23 Dec ferias, entry 18) sits BELOW entry 16 and yields +// to an equal-class feast, the opposite of a Sunday's own tie. This is +// the same table shape as III class's Advent/per-annum ferias, just +// inverted for which II-class temporal days count as "privileged". +// - I class: Sundays (entry 6) and I-class ferias (entry 7, Ash +// Wednesday/Holy Week) both sit above entry 11's feasts, so they always +// win -- there is no I-class "ordinary feria yields" case at all. +// +// The *2 class spacing means the ±1 tie-break never crosses a class boundary. func precedenceEF(c candidate) int { p := (6 - efRankOrder(c.Cel.Rank)) * 2 // class-1 -> 2, ferial -> 12 if c.Temporal { - ordinaryFeria := (c.Cel.Rank == RankClass3 || c.Cel.Rank == RankClass4) && - c.Season != Lent && c.Season != Passiontide - if ordinaryFeria { - p++ // an ordinary feria yields to an equal-class feast + yieldsToFeast := false + switch c.Cel.Rank { + case RankClass3, RankClass4: + yieldsToFeast = c.Season != Lent && c.Season != Passiontide + case RankClass2: + // A II-class Sunday (entry 15) wins; a II-class privileged feria -- + // Ember days, the late-Advent 17-23 Dec ferias (entry 18) -- yields + // to an equal-class feast (entry 16), e.g. St Matthew (21 Sep) + // beating the September Ember Wednesday, or St Thomas (21 Dec) + // beating an Advent late feria. + yieldsToFeast = !c.Sunday + } + if yieldsToFeast { + p++ } else { - p-- // Sundays, named feasts, and penitential ferias win their ties + p-- // Sundays, I-class ferias, and penitential (Lent/Passiontide) ferias win their ties } } else if c.Cel.Class == ClassLord && c.Cel.Rank == RankClass2 { // A II class feast of the Lord takes the place of a II class Sunday it diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go index 1f38996..77919d9 100644 --- a/internal/calendar/precedence_ef_repro_test.go +++ b/internal/calendar/precedence_ef_repro_test.go @@ -65,3 +65,19 @@ func TestTransferSkipsBothIAndIIClass(t *testing.T) { t.Errorf("2011-07-04 observed = %q want precious-blood-of-our-lord-jesus-christ (RG 96: first day that is neither I nor II class)", got) } } + +// TestMatthewBeatsSeptemberEmberWednesday: RG 91 -- St Matthew (21 September, +// II class) and the September Ember Wednesday are both II class; the table +// decides the tie. Entry 16 (II-class feasts of the universal Church) sits +// ABOVE entry 18 (II-class ferias, including the Ember days) -- the feast +// wins, the Ember feria is only commemorated. +func TestMatthewBeatsSeptemberEmberWednesday(t *testing.T) { + // 21 September falls on the September Ember Wednesday whenever the third + // Sunday of September is the 18th -- 2016 and 2022 both qualify. + for _, date := range []string{"2016-09-21", "2022-09-21"} { + day := efCompute(date) + if day.Observed.Slug != "matthew" { + t.Errorf("%s observed = %q want matthew (RG 91 entry 16 beats entry 18)", date, day.Observed.Slug) + } + } +} diff --git a/internal/calendar/precedence_ef_test.go b/internal/calendar/precedence_ef_test.go index 818b452..d5e254f 100644 --- a/internal/calendar/precedence_ef_test.go +++ b/internal/calendar/precedence_ef_test.go @@ -6,6 +6,14 @@ func efCand(rank Rank, temporal bool) candidate { return candidate{Cel: Celebration{Rank: rank}, Temporal: temporal} } +// efTemporalCand builds a temporal candidate with the season/Sunday flags +// precedenceEF's tie-break actually reads, so a test claiming to exercise +// "a Sunday" or "a Lenten feria" genuinely sets those fields rather than +// happening to pass for an unrelated reason (e.g. a class difference alone). +func efTemporalCand(rank Rank, season Season, sunday bool) candidate { + return candidate{Cel: Celebration{Rank: rank}, Temporal: true, Season: season, Sunday: sunday} +} + func TestPrecedenceEF(t *testing.T) { c1 := efCand(RankClass1, false) c3 := efCand(RankClass3, false) @@ -14,16 +22,57 @@ func TestPrecedenceEF(t *testing.T) { if !(precedenceEF(c1) < precedenceEF(c3) && precedenceEF(c3) < precedenceEF(c4) && precedenceEF(c4) < precedenceEF(comm)) { t.Error("EF class ordering broken (class-1 > class-3 > class-4 > commemoration)") } - // at equal class, the temporal office wins. - temp := efCand(RankClass2, true) + // a I-class feast beats a II-class Sunday (RG 91 entry 11 vs entry 15 -- + // different classes, so this holds regardless of the tie-break, but the + // candidate is still marked Sunday so the test means what its name says). + sunday2 := efTemporalCand(RankClass2, TimeAfterPentecost, true) + feast1 := efCand(RankClass1, false) + obs, others := pickEF([]candidate{sunday2, feast1}) + if obs.Cel.Rank != RankClass1 || len(others) != 1 { + t.Errorf("I-class feast should win over II-class Sunday, got %+v", obs.Cel) + } +} + +// TestPrecedenceEFClass2SundayVsFeria: RG 91 entries 15/16/18 -- at class 2, +// a SUNDAY wins its tie against an equal-class feast (entry 15 above 16), but +// a privileged FERIA (the Ember days, the late-Advent 17-23 Dec ferias, entry +// 18) YIELDS to one (entry 16 above 18) -- the opposite of the Sunday case. +// This is defect 2's own witness: before the fix, precedenceEF treated every +// non-ordinaryFeria temporal candidate the same way, so an Ember/late-Advent +// feria wrongly won its tie exactly like a Sunday does. +func TestPrecedenceEFClass2SundayVsFeria(t *testing.T) { saint := efCand(RankClass2, false) - obs, _ := pickEF([]candidate{saint, temp}) - if !obs.Temporal { - t.Error("equal-class: temporal office should be observed") + + sunday := efTemporalCand(RankClass2, TimeAfterPentecost, true) + obsSunday, _ := pickEF([]candidate{saint, sunday}) + if !obsSunday.Temporal { + t.Errorf("a II-class Sunday should win its tie against an equal-class feast, got %+v observed", obsSunday.Cel) } - // a I-class feast beats a II-class Sunday. - obs2, others := pickEF([]candidate{efCand(RankClass2, true), efCand(RankClass1, false)}) - if obs2.Cel.Rank != RankClass1 || len(others) != 1 { - t.Errorf("I-class feast should win over II-class Sunday, got %+v", obs2.Cel) + + emberFeria := efTemporalCand(RankClass2, TimeAfterPentecost, false) // e.g. the September Ember Wednesday + obsFeria, _ := pickEF([]candidate{saint, emberFeria}) + if obsFeria.Temporal { + t.Errorf("a II-class privileged feria should yield its tie to an equal-class feast, got %+v observed (temporal)", obsFeria.Cel) + } +} + +// TestPrecedenceEFClass3FeriaSeason: the pre-existing rule (unchanged by +// defect 2's fix), stated explicitly rather than left implicit: an ORDINARY +// III/IV-class feria (per annum, Advent to 16 Dec, Septuagesima) yields to an +// equal-class feast; the ferias of Lent and Passiontide are privileged and +// win instead. +func TestPrecedenceEFClass3FeriaSeason(t *testing.T) { + saint := efCand(RankClass3, false) + + ordinary := efTemporalCand(RankClass3, Advent, false) + obsOrdinary, _ := pickEF([]candidate{saint, ordinary}) + if obsOrdinary.Temporal { + t.Errorf("an ordinary Advent feria should yield to an equal-class feast, got %+v observed (temporal)", obsOrdinary.Cel) + } + + lenten := efTemporalCand(RankClass3, Lent, false) + obsLenten, _ := pickEF([]candidate{saint, lenten}) + if !obsLenten.Temporal { + t.Errorf("a Lenten feria should win its tie against an equal-class feast, got %+v observed", obsLenten.Cel) } } -- cgit v1.3 From b4d44c88fe3c92c5fb06b43fe94be0049059ef6e Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 13:46:01 +0200 Subject: calendar, precedence_ef: two more RG 91 gaps exposed by defect 4 Found during the mandated 2005-2050 before/after verification (not one of the seven, but caused by defect 4's own fix, so fixed in the same pass rather than left as a self-introduced regression). Neither is a hypothetical: both are live in the fixed calendar and both were individually confirmed via cmd/lectio-ef-dump before being written up as tests. 1. RG 91 entry 4 (Immaculate Conception, Assumption BVM) sits ABOVE entry 6 (Sundays of Advent/Lent/Passiontide) -- unlike an ORDINARY I-class feast (entry 11, e.g. St Joseph), the Immaculate Conception (8 December) is not impeded by an Advent Sunday at all. Before defect 4, Advent Sundays were wrongly II class, so this was accidentally right (I beats II outright, no tie reached); once Sundays became I class the tie-break mattered for the first time, and precedenceEF had no branch for it -- the Sunday wrongly won. 2. RG 91 entry 5 (Vigil & Octave day of the Nativity) sits above entry 6 the same way, and its own gap was worse than a wrong winner: the Vigil of Christmas (24 December) falling on Advent IV, once defect 4 made that a genuine I-class tie, sent the Vigil into transferIfImpededEF's forward walk -- which has no way to re-place a transfer crossing the Dec 31/Jan 1 boundary (celebrationDate re-resolves a fixed date using the YEAR OF THE DAY BEING QUERIED, so a walk landing in the following January can never match the query that produced it). The Vigil did not move to the wrong day; it vanished for the whole year, for every year 24 December is a Sunday (2006, 2017, 2023, 2028, 2034, 2045). Both fixed the same way as the existing II-class-feast-of-the-Lord bonus in precedenceEF (a one-line precedence adjustment keyed on slug), generalised into a single beatsClass1Sunday helper covering both RG 91 entries. A separate, unrelated bug surfaced by the SAME verification pass and fixed alongside it: transferIfImpededEF's destination check reused precedenceEF's tie-break BAND to decide "is this day I or II class", but band encodes a different question (which of two EQUAL-class candidates wins a tie) -- an ordinary, non-Sunday II-class temporal candidate YIELDS under defect 2's own fix (band 5), even though it is genuinely II class. A day within the Octave of the Nativity (26-31 Dec, RG 67) is exactly such a day, so band<=3 alone let a transfer wrongly land inside it (a real reproduction: "vigil-of-christmas" would have landed on 29 December 2006 instead of vanishing outright, caught while tracing the entry-5 bug above). Replaced with a direct class test (isHighClass), which is both correct and simpler -- it no longer needs the Sunday flag at all for this particular check. Witnesses (precedence_ef_repro_test.go): TestImmaculateConceptionBeatsAdventSunday, TestVigilOfChristmasSurvivesAdventSunday. Fail before this commit with: 2013-12-08 observed = "ef-advent-sunday-2" want immaculate-conception-of-the-blessed-virgin-mary (RG 91 entry 4 beats entry 6) 2006-12-24 observed = "ef-advent-sunday-4" want vigil-of-christmas (RG 91 entry 5 beats entry 6; must not vanish) (full set: 2013/2019/2024 for the first, 2006/2017/2023/2028 for the second) --- internal/calendar/calendar.go | 29 +++++++++++++++++--- internal/calendar/precedence_ef.go | 37 ++++++++++++++++++++++++- internal/calendar/precedence_ef_repro_test.go | 39 +++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 4 deletions(-) (limited to 'internal/calendar/precedence_ef_repro_test.go') diff --git a/internal/calendar/calendar.go b/internal/calendar/calendar.go index f364321..19c0efb 100644 --- a/internal/calendar/calendar.go +++ b/internal/calendar/calendar.go @@ -258,16 +258,39 @@ func transferIfImpededEF(cel Celebration, when time.Time, occupiedByClass1, occu if cel.Rank != RankClass1 { return when } + // Is cel actually impeded on `when` at all? Compare its OWN precedence + // (via precedenceEF, the same function pickEF uses to decide the day) + // against the temporal office's, rather than testing the temporal + // office's class in isolation -- a plain "is the temporal day I class" + // test wrongly impedes a candidate that would in fact WIN a tie against + // it: RG 91 entry 4 (the Immaculate Conception, the Assumption) sits + // ABOVE entry 6 (Sundays), so the Immaculate Conception is not impeded + // by the Advent Sunday it may fall on at all, unlike an ordinary I-class + // feast (entry 11, e.g. St Joseph), which is. occupiedByClass1 still + // covers the separate case of a competing FIXED I-class SANCTORAL + // feast, which this temporal-only comparison cannot see. startTemporal := temporalEF(when) - startImpeded := startTemporal.Cel.Rank == RankClass1 || occupiedByClass1(when) + tCand := candidate{Cel: startTemporal.Cel, Temporal: true, Season: startTemporal.Season, Sunday: startTemporal.Sunday} + sCand := candidate{Cel: cel, Temporal: false} + startImpeded := precedenceEF(tCand) < precedenceEF(sCand) || occupiedByClass1(when) if !startImpeded { return when } day := when.AddDate(0, 0, 1) for i := 0; i < 30; i++ { b := temporalEF(day) - band := precedenceEF(candidate{Cel: b.Cel, Temporal: true, Season: b.Season, Sunday: b.Sunday}) - if band <= 3 || occupiedByClass1Or2(day) { + // A direct CLASS test, not precedenceEF's tie-break band: band + // encodes which of two EQUAL-class candidates wins a tie (e.g. a + // Sunday beats an equal-class feast, but a privileged Ember/late- + // Advent FERIA of the same class yields to one, defect 2) -- an + // unrelated question from RG 96's own "is this day itself I or II + // class" test. Reusing band here undercounted: a day within the + // Octave of the Nativity (26-31 Dec) is genuinely II class (RG 67), + // but as an ordinary, non-Sunday II-class temporal candidate its OWN + // band yields (5, not <=3) -- so band<=3 alone let an impeded I-class + // feast wrongly land there. isHighClass tests the class directly. + isHighClass := b.Cel.Rank == RankClass1 || b.Cel.Rank == RankClass2 + if isHighClass || occupiedByClass1Or2(day) { day = day.AddDate(0, 0, 1) // still I- or II-class; keep walking continue } diff --git a/internal/calendar/precedence_ef.go b/internal/calendar/precedence_ef.go index a1788be..9f5016f 100644 --- a/internal/calendar/precedence_ef.go +++ b/internal/calendar/precedence_ef.go @@ -1,6 +1,9 @@ package calendar -import "sort" +import ( + "sort" + "strings" +) // efRankOrder orders EF (1960) ranks: class-1 highest, then class-2..4, // commemoration, ferial lowest. @@ -69,10 +72,42 @@ func precedenceEF(c candidate) int { // falls on (unlike a saint's feast, which is only commemorated). Give it // the edge over the Sunday's tie-break bonus. p -= 2 + } else if c.Cel.Rank == RankClass1 && beatsClass1Sunday(c.Cel.Slug) { + // RG 91 entries 4 (Immaculate Conception, Assumption BVM) and 5 + // (Vigil & Octave day of the Nativity) both sit ABOVE entry 6 + // (Sundays of Advent/Lent/Passiontide, Low Sunday) -- unlike an + // ORDINARY I-class feast (entry 11, e.g. St Joseph, the Precious + // Blood), which yields to a I-class Sunday, these win the tie. + // Found while verifying defect 4 (Sunday ranks): before that fix, + // Advent/Lent Sundays were wrongly II class, so these feasts beat + // them outright on base class alone, accidentally right; once + // Sundays became I class the tie-break mattered, and without this + // branch the Sunday would wrongly win. Two live cases in the fixed + // calendar: the Immaculate Conception (8 December) on an Advent + // Sunday, and the Vigil of Christmas (24 December) on Advent IV -- + // the latter is not merely a wrong winner but a WORSE bug without + // this branch: transferIfImpededEF has no way to re-place a + // transfer that crosses the Dec31/Jan1 boundary (celebrationDate + // re-resolves a fixed date using the YEAR OF THE DAY BEING QUERIED, + // so a walk landing in January of the following year can never + // match the query that produced it), so the Vigil simply vanished + // for the year instead of landing on the wrong day. The Assumption + // (15 August) never falls in Advent or Lent, so its own share of + // this branch is citation-complete but not live. + p -= 2 } return p } +// beatsClass1Sunday reports whether slug is one of RG 91's entries 4 or 5 -- +// the Immaculate Conception, the Assumption, or the Vigil of Christmas -- +// all of which sit above entry 6's Sundays in the Table of Precedence. +func beatsClass1Sunday(slug string) bool { + return strings.Contains(slug, "immaculate-conception") || + strings.Contains(slug, "assumption-of-the-blessed-virgin-mary") || + slug == "vigil-of-christmas" +} + // pickEF returns the observed EF celebration and the commemorations, ordered // deterministically by precedence then slug. func pickEF(cands []candidate) (candidate, []candidate) { diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go index 77919d9..09cadbd 100644 --- a/internal/calendar/precedence_ef_repro_test.go +++ b/internal/calendar/precedence_ef_repro_test.go @@ -81,3 +81,42 @@ func TestMatthewBeatsSeptemberEmberWednesday(t *testing.T) { } } } + +// TestImmaculateConceptionBeatsAdventSunday: found, not named among the +// seven, while verifying defect 4 (Sunday ranks) against the real sanctoral +// data. RG 91 entry 4 (Immaculate Conception, Assumption BVM) sits ABOVE +// entry 6 (Sundays of Advent/Lent/Passiontide) -- unlike an ORDINARY +// I-class feast (entry 11, e.g. St Joseph), the Immaculate Conception +// (8 December) is not impeded by the Advent Sunday it falls on at all. Before +// defect 4's own fix, Advent Sundays were wrongly II class, so this was +// accidentally right (I class beats II class outright); once Sundays became +// I class the tie mattered for the first time. +func TestImmaculateConceptionBeatsAdventSunday(t *testing.T) { + for _, year := range []string{"2013", "2019", "2024"} { + day := efCompute(year + "-12-08") + if day.Observed.Slug != "immaculate-conception-of-the-blessed-virgin-mary" { + t.Errorf("%s-12-08 observed = %q want immaculate-conception-of-the-blessed-virgin-mary (RG 91 entry 4 beats entry 6)", year, day.Observed.Slug) + } + } +} + +// TestVigilOfChristmasSurvivesAdventSunday: found, not named among the +// seven, while verifying defect 4 against the real sanctoral data -- and +// worse than a wrong winner. RG 91 entry 5 (Vigil & Octave day of the +// Nativity) also sits above entry 6, so the Vigil of Christmas (24 December) +// is not impeded by falling on Advent IV either. Without this, defect 4 +// alone would have made the Advent Sunday win a genuine tie, sending the +// Vigil into transferIfImpededEF's forward walk -- which has no way to +// re-place a transfer that crosses the Dec31/Jan1 boundary (celebrationDate +// re-resolves a fixed date using the year of whatever day is being queried, +// so a walk landing in the following January can never match the query that +// produced it). The Vigil did not move to the wrong day; it vanished for the +// whole year. +func TestVigilOfChristmasSurvivesAdventSunday(t *testing.T) { + for _, year := range []string{"2006", "2017", "2023", "2028"} { + day := efCompute(year + "-12-24") + if day.Observed.Slug != "vigil-of-christmas" { + t.Errorf("%s-12-24 observed = %q want vigil-of-christmas (RG 91 entry 5 beats entry 6; must not vanish)", year, day.Observed.Slug) + } + } +} -- cgit v1.3 From e122fa4368e156b9c90c128a8daad9545b22ed11 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 14:50:34 +0200 Subject: gen-sanctoral-ef, caldata: fix round 2 -- review found five real problems External review of the seven-defect fix (round 1) confirmed all seven correctly and structurally fixed, then found five further problems in what shipped alongside, two of them critical. All five verified independently before being fixed, not applied on the review's say-so alone -- see each item below for the primary-source check performed. CRITICAL 1: the regeneration destroyed all 322 Polish display names. main() preserved name.la across a regeneration (missalemeum has no Latin titles) but had no equivalent for name.pl, and never emitted one -- name.pl count went 322 -> 0 (confirmed: `git show 2386a45:internal/caldata/tridentine-calendar.ini | grep -c '^name.pl'` = 322; the pre-round-2 file = 0). naming.CelebrationName's own name[lang] -> name.en fallback then silently substituted English for every Polish EF display, reaching mobile.Day(date, "ef", version, "pl") -- a shipped dlectio entry point -- with no error anywhere in the chain, and nothing in this repo's test suite asserting any name.* field at all. Fixed at the root, not by re-adding name.pl specifically: `entry.la` (one hardcoded language) is replaced by `entry.otherNames map[string]string`, populated from every "name." field already present except name.en (English always comes fresh from missalemeum) and re-emitted verbatim, sorted for deterministic output -- a third or fourth language added later survives a regeneration without this function changing again. CRITICAL 2: St Romanus was deleted, and St Eusebius (14 August) excluded, on a primary-source claim the primary source itself contradicts. The exclusion cited the calendarium's 9 August row as reading only "Vigilia, III classis.", no "Com." line -- checked against ONE of the three local Missal scans, "1962-06-23,...LT.pdf", an ELECTRONIC TRANSCRIPTION. The other two, PHOTOGRAPHIC scans of the actual 1962 Missale Romanum, both carry it: "missale-romanum-1962.pdf" calendarium, 9 August: "XVI d V 9 Vigilia, III classis, Commemoratio S. Romani Mart.", with the saint's own proper text elsewhere in the same scan ("Et fit commemoratio S. Romani Mar-") and its own back-of-book index ("Romani Mart., 9 augusti ... 621"). The transcription silently drops vigil commemorations generally (also missing there, present in both photographic scans: 7 August Donatus, 25 December Anastasia). 14 August's "St. Eusebius" is the identical shape (calendarium: "XI b XIX 14 Vigilia, II classis, Commemoratio S. Eusebii Conf.") and genuinely a DIFFERENT person from 16 December's "St. Eusebius, Ep. et Mart." (calendarium: "V XVII S. Eusebii Ep. et Mart., III classis.") -- a Confessor and a Bishop-and-Martyr, not the same saint duplicated. knownSpuriousComm (both entries) is removed outright; slugOverride gains "08-14/eusebius" -> "eusebius-confessor" so the two no longer collide by slug. Going forward: the photographic scans are the primary source; the electronic transcription is a convenience index only; where they disagree, the scan wins -- recorded in the generator's own comments, not just here. IMPORTANT 3+4: Thomas Becket (29 Dec) and Silvester (31 Dec) were silently promoted to class-4 by a hidden coupling. RG 68(d)/(e): "die 29 decembris, fit commemoratio S. Thomae Episcopi et Mart.; die 31 decembris, fit commemoratio S. Silvestri I Papae et Conf." -- both a bare "Commemoratio" with NO class of their own; the DAY they fall on (within the Nativity Octave) is II class, confirmed in the same calendarium row. refYearExplainsAbsence calls calendar.Compute and trusts a commemoration's own id-rank when the temporal day looks class-1/2-strong; after this task's own earlier fix promoted 26-31 December from class-4 to class-2 (RG 67/68), that trust flipped for these two from "not explained" to "explained" purely as a side effect of an unrelated temporal_ef.go change -- the generator's data inference reads the engine's own computed ranks, so a temporal_ef.go rank change can silently rewrite generated data. Fixed narrowly (6-31 December excluded from ever trusting the id-rank, citing RG 68(d)/(e) directly) and the coupling itself documented in refYearExplainsAbsence's own doc comment as a standing hazard for the next temporal_ef.go rank change, not just this one instance. Separately, the SAME function's doc comment overstated its own guarantee ("ANY class-1..4 saint would lose there") -- false for its Lent/Passiontide limb, where a III-class privileged feria does not beat a I- or II-class feast (RG 109(e) is privilege over an equal-or-lower class only) -- and the "commemoration id names the saint's TRUE rank" claim at the call site was falsified by its own worked example (St Blaise's id claims rank 4, and he is still correctly ruled RankCommemoration). Both rewritten to describe this as the rank-blind sampling heuristic it actually is, not a rubric evaluator. IMPORTANT 5: the Purification's own citation, strengthened. Three fixes to classOf's doc comment, no data change (the tag stays "lord", per round 1's own decision): the colitur cross-reference is removed (colitur bootstraps from lectio and was reading the same oracle a second time, not independent corroboration, and citing a sibling project's in-flight branch is not itself an argument); the rule that actually makes the occurrence pattern diagnostic is now named -- RG 91 entry 14 ("Festa Domini II classis") above entry 15 ("Dominicae II classis") above entry 16 ("Festa II classis... quae non [sunt Domini]"), each verified directly against the scan, not paraphrased; RG 120(b) is recorded as genuine primary-text counter-evidence ("Adhibetur color albus... b) B. Mariae Virg., etiam in benedictione et processione candelarum die 2 februarii" -- 2 February filed under the white-colour rule's OWN "B. Mariae Virg." heading, separate from 120(a)'s "Domini" heading), and RG 112(b) ("Officium, Missa aut commemoratio de dominica excludit commemorationem... de festo vel mysterio Domini, et vicissim") is cited as independently backing the empty commemoration list. A new committed fixture test replaces reliance on the report alone, since the deciding years (2 February on a Sunday) fall outside this repo's committed 2026-2027 oracle snapshot: TestPurificationBeatsFebruarySunday (internal/calendar/precedence_ef_repro_test.go), five independently fetched years. One of the years this reasoning is sometimes quoted against, 2036, is corrected in passing: 2 February 2036 is in fact a Saturday, not a Sunday (`date -d 2036-02-02 +%A`) -- checked here rather than repeated, 2042 used instead. Witnesses (internal/caldata/caldata_test.go): TestTridentineNamesPreservedAcrossRegeneration, TestTridentineRomanusAndEusebiusPresent (replaces TestTridentineNoSpuriousRomanus, whose own name asserted the now-corrected wrong claim). Pre-fix failures (captured against the committed pre-round-2 state, commit 50e3970): name.pl coverage = 0 entries, want >= 315 assumption-of-the-blessed-virgin-mary: name.pl = "", want the preserved Polish name romanus missing: the calendarium's photographic scans both carry "Commemoratio S. Romani Mart." on 9 August missing "eusebius-confessor" (08-14) internal/caldata/tridentine-calendar.ini regenerated from the ORIGINAL branch-point data (`git show 2386a45:...`), not from this session's own already-damaged intermediate file -- regenerating from an already-corrupted source would have preserved nothing, since the preservation mechanism can only preserve what is actually on disk when it runs. Verified directly (not merely re-tested): all 322 name.en/name.pl values byte-identical to the branch point; 15 rank fields and 2 class fields differ (the round-1 Lenten-rank and class-tag fixes, unchanged by this round); 5 new slugs added (agnes-secundo, boniface-martyr, eusebius-confessor, evaristus, theodore); 0 slugs removed. --- internal/caldata/caldata_test.go | 94 ++++++- internal/caldata/tridentine-calendar.ini | 342 +++++++++++++++++++++++++- internal/calendar/precedence_ef_repro_test.go | 38 +++ scripts/gen-sanctoral-ef.go | 264 +++++++++++++------- 4 files changed, 641 insertions(+), 97 deletions(-) (limited to 'internal/calendar/precedence_ef_repro_test.go') diff --git a/internal/caldata/caldata_test.go b/internal/caldata/caldata_test.go index a9bc860..2ba052d 100644 --- a/internal/caldata/caldata_test.go +++ b/internal/caldata/caldata_test.go @@ -216,18 +216,49 @@ func TestTridentineNoMissingEntries(t *testing.T) { } } -// TestTridentineNoSpuriousRomanus: the calendarium's 9 August row reads only -// "Vigilia, III classis.", with no "Com." line -- missalemeum's own "St. -// Romanus" commemoration that day has no calendarium support and is a -// genuine upstream data quirk (the same standard already applied to "St. -// Eusebius" on 14 August, also excluded). -func TestTridentineNoSpuriousRomanus(t *testing.T) { +// TestTridentineRomanusAndEusebiusPresent: CORRECTED after review found the +// opposite claim resting on an incomplete primary-source check. An earlier +// version of this test (and of scripts/gen-sanctoral-ef.go's +// knownSpuriousComm) asserted Romanus ABSENT, on the strength of ONE of the +// three local Missal scans -- "1962-06-23,…LT.pdf", an ELECTRONIC +// TRANSCRIPTION that silently drops vigil commemorations generally (also +// missing: 7 August Donatus, 25 December Anastasia, both present elsewhere). +// The other two, PHOTOGRAPHIC scans of the actual 1962 Missale Romanum, both +// carry it: "missale-romanum-1962.pdf" calendarium, 9 August row: "XVI d V +// 9 Vigilia, III classis, Commemoratio S. Romani Mart.", with the saint's +// own proper text elsewhere in the same scan ("Et fit commemoratio S. Romani +// Mar-"), and its own back-of-book index ("Romani Mart., 9 augusti ... 621"). +// Where the scans and the transcription disagree, the scans win -- see +// gen-sanctoral-ef.go's own primary-source note, same rule recorded there so +// it is not lost a second time. +// +// 14 August's "St. Eusebius" is the identical shape (calendarium: "XI b XIX +// 14 Vigilia, II classis, Commemoratio S. Eusebii Conf.") and a DIFFERENT +// person from 16 December's "St. Eusebius, Ep. et Mart." (calendarium: "V +// XVII S. Eusebii Ep. et Mart., III classis.") -- a Confessor and a Bishop +// and Martyr, not the same saint moved or duplicated. missalemeum gives both +// the same bare English title, so they collide by slug; slugOverride +// disambiguates rather than either being dropped. +func TestTridentineRomanusAndEusebiusPresent(t *testing.T) { l := Tridentine() - if _, ok := l.Cels["romanus"]; ok { - t.Error("romanus present: the calendarium's 9 August row has no Com. line to support it") + if rc, ok := l.Cels["romanus"]; !ok { + t.Error("romanus missing: the calendarium's photographic scans both carry \"Commemoratio S. Romani Mart.\" on 9 August") + } else if rc.Fields["date"] != "08-09" { + t.Errorf("romanus: date = %q, want 08-09", rc.Fields["date"]) } - if rc, ok := l.Cels["eusebius"]; ok && rc.Fields["date"] != "12-16" { - t.Errorf("eusebius: date = %q, want 12-16 (14 August's Eusebius has no calendarium support)", rc.Fields["date"]) + want := map[string]string{ + "eusebius-confessor": "08-14", // "S. Eusebii Conf." -- a Confessor + "eusebius": "12-16", // "S. Eusebii Ep. et Mart." -- a Bishop and Martyr, a different person + } + for slug, date := range want { + rc, ok := l.Cels[slug] + if !ok { + t.Errorf("missing %q (%s)", slug, date) + continue + } + if rc.Fields["date"] != date { + t.Errorf("%s: date = %q, want %q", slug, rc.Fields["date"], date) + } } } @@ -252,3 +283,46 @@ func TestTridentineNoTransferArtifacts(t *testing.T) { } } } + +// TestTridentineNamesPreservedAcrossRegeneration is the coverage guard a +// regeneration silently destroying a whole language's names needed and did +// not have: an earlier version of scripts/gen-sanctoral-ef.go's main() +// preserved existing name.la values across a regeneration (missalemeum +// supplies English only) but had no equivalent for name.pl -- and, because +// the bootstrapped file has in fact never carried a name.la value, that +// mechanism looked correct while doing nothing at all. A regeneration +// deleted all 322 Polish names outright (name.pl count 322 -> 0), silently: +// no test here asserted anything about a name.* field, and +// `len(l.Cels) < 250` (TestTridentineLoads) does not notice a field going +// missing within entries that still exist. `naming.CelebrationName`'s own +// name[lang] -> name.en fallback (internal/naming/naming.go) then quietly +// substituted English for Polish on every EF display in that language, +// reaching mobile.Day(date, "ef", version, "pl") -- a shipped dlectio entry +// point -- with no error anywhere in the chain. +// +// Checks both a broad coverage floor (not exactly 322: a handful of entries +// added by this same task's own fixes -- St Agnes secundo, St Boniface +// Martyr, St Evaristus, St Theodore, St Romanus, St Eusebius Confessor -- +// never had a curated Polish name to preserve in the first place, so 322 is +// not achievable) and one specific, checkable value (the coordinator's own +// example) so a coverage-only guard cannot itself be satisfied by silently +// wrong values. +func TestTridentineNamesPreservedAcrossRegeneration(t *testing.T) { + l := Tridentine() + n := 0 + for _, rc := range l.Cels { + if rc.Fields["name.pl"] != "" { + n++ + } + } + if n < 315 { + t.Errorf("name.pl coverage = %d entries, want >= 315 (was 322 before any of this task's fixes; a regeneration must preserve it, not merely not-crash)", n) + } + rc, ok := l.Cels["assumption-of-the-blessed-virgin-mary"] + if !ok { + t.Fatal("missing assumption-of-the-blessed-virgin-mary") + } + if got := rc.Fields["name.pl"]; got != "Wniebowzięcie N. M. P." { + t.Errorf("assumption-of-the-blessed-virgin-mary: name.pl = %q, want the preserved Polish name", got) + } +} diff --git a/internal/caldata/tridentine-calendar.ini b/internal/caldata/tridentine-calendar.ini index 9010845..55564d7 100644 --- a/internal/caldata/tridentine-calendar.ini +++ b/internal/caldata/tridentine-calendar.ini @@ -4,7 +4,9 @@ ; by internal/calendar (temporalEF) and is NOT listed here. ; Ranks use the 1960 Code of Rubrics: class-1..class-4. ; Generated by scripts/gen-sanctoral-ef.go from missalemeum (Divinum Officium 1962 -; data). Latin names are hand-curated where present. See NOTICE. +; data). name.en is always regenerated fresh from missalemeum; every other +; name. (missalemeum supplies English only) is preserved verbatim from +; whatever this file already carried before regeneration. See NOTICE. [layer] id = tridentine @@ -16,12 +18,14 @@ date = 01-05 rank = commemoration colour = red name.en = St. Telesphorus Pope and Martyr +name.pl = św. Telesfora, Papieża i Męczennika [hyginus-pope-and-martyr] date = 01-11 rank = commemoration colour = red name.en = St. Hyginus Pope and Martyr +name.pl = św. Hygina, Papieża i Męczennika [commemoration-of-the-baptism-of-the-lord] date = 01-13 @@ -29,6 +33,7 @@ rank = class-2 colour = white class = lord name.en = Commemoration of the Baptism of the Lord +name.pl = Wspomnienie Chrztu Pańskiego reading.first = Isa 60:1-6 reading.gospel = John 1:29-34 @@ -37,12 +42,14 @@ date = 01-14 rank = commemoration colour = red name.en = S. Felicis +name.pl = św. Feliksa, Kapłana i Męczennika [hilary] date = 01-14 rank = class-3 colour = white name.en = St. Hilary +name.pl = św. Hilarego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -51,12 +58,14 @@ date = 01-15 rank = commemoration colour = white name.en = St. Maur, Abbot +name.pl = św. Maura, Opata [paul-the-first-hermit] date = 01-15 rank = class-3 colour = white name.en = St. Paul, the First Hermit +name.pl = św. Pawła, Pierwszego Pustelnika, Wyznawcy reading.first = Phil 3:7-12 reading.gospel = Matt 11:25-30 @@ -65,6 +74,7 @@ date = 01-16 rank = class-3 colour = red name.en = St. Marcellus I +name.pl = św. Marcelego I, Papieża i Męczennika reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -73,6 +83,7 @@ date = 01-17 rank = class-3 colour = white name.en = St. Anthony +name.pl = św. Antoniego, Opata reading.first = Ecclus 45:1-6 reading.gospel = Luke 12:35-40 @@ -81,24 +92,28 @@ date = 01-18 rank = commemoration colour = white name.en = St. Prisca +name.pl = św. Pryski, Dziewicy [canute-martyr] date = 01-19 rank = commemoration colour = red name.en = St. Canute, Martyr +name.pl = św. Kanuta, Króla i Męczennika [sts-marius-martha-audifax-abachum] date = 01-19 rank = commemoration colour = red name.en = Sts. Marius, Martha, Audifax & Abachum +name.pl = śś. Mariusza, Marty, Audifaksa i Abachuma [sts-fabian-sebastian] date = 01-20 rank = class-3 colour = red name.en = Sts. Fabian & Sebastian +name.pl = śś. Fabiana, Papieża i Sebastiana, Męczenników reading.first = Heb 11:33-39 reading.gospel = Luke 6:17-23 @@ -107,6 +122,7 @@ date = 01-21 rank = class-3 colour = red name.en = St. Agnes +name.pl = św. Agnieszki, Dziewicy i Męczennicy reading.first = Sir 51:1-8; 51:12 reading.gospel = Matt 25:1-13. @@ -115,6 +131,7 @@ date = 01-22 rank = class-3 colour = red name.en = Sts. Vincent & Anastasius +name.pl = śś. Wincentego i Anastazego, Męczenników reading.first = Wis 3:1-8 reading.gospel = Luke 21:9-19 @@ -123,12 +140,14 @@ date = 01-23 rank = commemoration colour = red name.en = St. Emerentiana +name.pl = św. Emercjanny, Dziewicy i Męczennicy [raymond-of-pe-afort] date = 01-23 rank = class-3 colour = white name.en = St. Raymond of Peñafort +name.pl = św. Rajmunda z Pennafort, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -137,6 +156,7 @@ date = 01-24 rank = class-3 colour = red name.en = St. Timothy +name.pl = św. Tymoteusza, Biskupa i Męczennika reading.first = 1 Tim. 6:11-16 reading.gospel = Luke 14:26-33. @@ -145,6 +165,7 @@ date = 01-25 rank = class-3 colour = white name.en = Conversion of St. Paul +name.pl = Nawrócenie św. Pawła, Apostoła reading.first = Acts 9:1-22 reading.gospel = Matt 19:27-29. @@ -153,12 +174,14 @@ date = 01-25 rank = commemoration colour = white name.en = St. Peter +name.pl = św. Piotra, Apostoła [polycarp] date = 01-26 rank = class-3 colour = red name.en = St. Polycarp +name.pl = św. Polikarpa, Biskupa i Męczennika reading.first = 1 John 3:10-16 reading.gospel = Matt 10:26-32. @@ -167,6 +190,7 @@ date = 01-27 rank = class-3 colour = white name.en = St. John Chrysostom +name.pl = św. Jana Chryzostoma, Wyznawcy, Biskupa i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -181,6 +205,7 @@ date = 01-28 rank = class-3 colour = white name.en = St. Peter Nolasco +name.pl = św. Piotra Nolasco, Wyznawcy reading.first = 1 Cor. 4:9-14 reading.gospel = Luke 12:32-34 @@ -189,6 +214,7 @@ date = 01-29 rank = class-3 colour = white name.en = St. Francis de Sales +name.pl = św. Franciszka Salezego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -197,6 +223,7 @@ date = 01-30 rank = class-3 colour = red name.en = St. Martina +name.pl = św. Martyny, Dziewicy i Męczennicy reading.first = Sir 51:1-8; 51:12 reading.gospel = Matt 25:1-13. @@ -205,6 +232,7 @@ date = 01-31 rank = class-3 colour = white name.en = St. John Bosco +name.pl = św. Jana Bosco, Wyznawcy reading.first = Phil 4:4-9 reading.gospel = Matt 18:1-5 @@ -213,6 +241,7 @@ date = 02-01 rank = class-3 colour = red name.en = St. Ignatius of Antioch +name.pl = św. Ignacego, Biskupa i Męczennika reading.first = Rom 8:35-39 reading.gospel = John 12:24-26 @@ -222,6 +251,7 @@ rank = class-2 colour = white class = lord name.en = Purification of the Blessed Virgin Mary +name.pl = Oczyszczenie N. M. P. reading.first = Mal 3:1-4 reading.gospel = Luke 2:22-32 @@ -230,12 +260,14 @@ date = 02-03 rank = commemoration colour = red name.en = St. Blaise +name.pl = św. Błażeja, Biskupa i Męczennika [andrew-corsini] date = 02-04 rank = class-3 colour = white name.en = St. Andrew Corsini +name.pl = św. Andrzeja Corsini, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -244,6 +276,7 @@ date = 02-05 rank = class-3 colour = red name.en = St. Agatha +name.pl = św. Agaty, Dziewicy i Męczennicy reading.first = 1 Cor. 1:26-31 reading.gospel = Matt 19:3-12. @@ -252,12 +285,14 @@ date = 02-06 rank = commemoration colour = red name.en = St. Dorothy +name.pl = św. Doroty, Dziewicy i Męczennicy [titus] date = 02-06 rank = class-3 colour = white name.en = St. Titus +name.pl = św. Tytusa, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Luke 10:1-9 @@ -266,6 +301,7 @@ date = 02-07 rank = class-3 colour = white name.en = St. Romuald +name.pl = św. Romualda, Opata reading.first = Ecclus 45:1-6 reading.gospel = Matt 19:27-29. @@ -274,6 +310,7 @@ date = 02-08 rank = class-3 colour = white name.en = St. John of Matha +name.pl = św. Jana z Maty, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -282,12 +319,14 @@ date = 02-09 rank = commemoration colour = red name.en = St. Appollonia +name.pl = św. Apolonii, Dziewicy i Męczennicy [cyril-of-alexandria] date = 02-09 rank = class-3 colour = white name.en = St. Cyril of Alexandria +name.pl = św. Cyryla Aleksandryjskiego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -296,6 +335,7 @@ date = 02-10 rank = class-3 colour = white name.en = St. Scholastica +name.pl = św. Scholastyki reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -304,6 +344,7 @@ date = 02-11 rank = class-3 colour = white name.en = Our Lady of Lourdes +name.pl = Objawienie się N. M. P. Niepokalanie Poczętej w Lourdes reading.first = Apoc 11:19; 12:1, 10 reading.gospel = Luke 1:26-31. @@ -312,6 +353,7 @@ date = 02-12 rank = class-3 colour = white name.en = Seven Holy Servite Founders +name.pl = Siedmiu Założycieli Zakonu Serwitów N. M. P., Wyznawców reading.first = Ecclus 44:1-15 reading.gospel = Matt 19:27-29. @@ -320,24 +362,28 @@ date = 02-14 rank = commemoration colour = red name.en = St. Valentine +name.pl = św. Walentego, Kapłana i Męczennika [sts-faustinus-jovita] date = 02-15 rank = commemoration colour = red name.en = Sts. Faustinus & Jovita +name.pl = śś. Faustyna i Jowity, Męczenników [simeon] date = 02-18 rank = commemoration colour = red name.en = St. Simeon +name.pl = św. Symeona, Biskupa i Męczennika [chair-of-st-peter] date = 02-22 rank = class-2 colour = white name.en = Chair of St. Peter +name.pl = Katedry św. Piotra Apostoła reading.first = 1 Pet 1:1-7 reading.gospel = Matt 16:13-19 @@ -346,12 +392,14 @@ date = 02-22 rank = commemoration colour = red name.en = St. Paul +name.pl = św. Pawła [peter-damien] date = 02-23 rank = class-3 colour = white name.en = St. Peter Damien +name.pl = św. Piotra Damiana, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -360,6 +408,7 @@ date = 02-24 rank = class-2 colour = red name.en = St. Matthias +name.pl = św. Macieja Apostoła reading.first = Acts 1:15-26 reading.gospel = Matt 11:25-30 @@ -368,6 +417,7 @@ date = 02-27 rank = class-3 colour = white name.en = St. Gabriel of Our Lady of Sorrows +name.pl = św. Gabriela od Matki Bożej Bolesnej reading.first = 1 John 2:14-17 reading.gospel = Mark 10:13-21 @@ -376,6 +426,7 @@ date = 03-04 rank = class-3 colour = white name.en = St. Casimir +name.pl = św. Kazimierza, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -384,60 +435,70 @@ date = 03-04 rank = commemoration colour = red name.en = St. Lucius +name.pl = św. Lucjusza I, Papieża i Męczennika [sts-felicitas-perpetua] date = 03-06 rank = class-3 colour = red name.en = Sts. Felicitas & Perpetua +name.pl = śś. Perpetui i Felicyty, Męczennic [thomas-aquinas] date = 03-07 rank = class-3 colour = white name.en = St. Thomas Aquinas +name.pl = św. Tomasza z Akwinu, Wyznawcy i Doktora Kościoła [john-of-god] date = 03-08 rank = class-3 colour = white name.en = St. John of God +name.pl = św. Jana Bożego, Wyznawcy [frances-rome] date = 03-09 rank = class-3 colour = white name.en = St. Frances Rome +name.pl = św. Franciszki Rzymianki, Wdowy [forty-holy-martyrs-of-sebaste] date = 03-10 rank = class-3 colour = red name.en = Forty Holy Martyrs of Sebaste +name.pl = śś. Czterdziestu Męczenników [gregory-the-great] date = 03-12 rank = class-3 colour = white name.en = St. Gregory the Great +name.pl = św. Grzegorza Wielkiego, Papieża, Wyznawcy i Doktora Kościoła [patrick] date = 03-17 rank = class-3 colour = white name.en = St. Patrick +name.pl = św. Patryka, Biskupa i Wyznawcy [cyril-of-jerusalem] date = 03-18 rank = class-3 colour = white name.en = St. Cyril of Jerusalem +name.pl = św. Cyryla Jerozolimskiego, Biskupa, Wyznawcy i Doktora Kościoła [joseph-spouse-of-the-bl-virgin-mary] date = 03-19 rank = class-1 colour = white name.en = St. Joseph, Spouse of the Bl. Virgin Mary +name.pl = św. Józefa, Oblubieńca N. M. P. reading.first = Ecclus 45:1-6 reading.gospel = Matt 1:18-21 @@ -446,18 +507,21 @@ date = 03-21 rank = class-3 colour = white name.en = St. Benedict +name.pl = św. Benedykta, Opata [gabriel-the-archangel] date = 03-24 rank = class-3 colour = white name.en = St. Gabriel the Archangel +name.pl = św. Gabriela Archanioła [annunciation-of-the-blessed-virgin-mary] date = 03-25 rank = class-1 colour = white name.en = Annunciation of the Blessed Virgin Mary +name.pl = Zwiastowanie N. M. P. reading.first = Isa 7:10-15 reading.gospel = Luke 1:26-38 @@ -466,36 +530,42 @@ date = 03-27 rank = class-3 colour = white name.en = St. John Damascene +name.pl = św. Jana Damasceńskiego, Wyznawcy i Doktora Kościoła [john-of-capistrano] date = 03-28 rank = class-3 colour = white name.en = St. John of Capistrano +name.pl = św. Jana Kapistrana, Wyznawcy [francis-of-paola] date = 04-02 rank = class-3 colour = white name.en = St. Francis of Paola +name.pl = św. Franciszka z Pauli, Wyznawcy [isidore-of-seville] date = 04-04 rank = class-3 colour = white name.en = St. Isidore of Seville +name.pl = św. Izydora, Biskupa, Wyznawcy i Doktora Kościoła [vincent-ferrer] date = 04-05 rank = class-3 colour = white name.en = St. Vincent Ferrer +name.pl = św. Wincentego Fereriusza, Wyznawcy [leo-the-great] date = 04-11 rank = class-3 colour = white name.en = St. Leo the Great +name.pl = św. Leona Wielkiego, Papieża, Wyznawcy i Doktora Kościoła reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -504,6 +574,7 @@ date = 04-13 rank = class-3 colour = red name.en = St. Hermenegild +name.pl = św. Hermenegilda, Męczennika reading.first = Wis 10:10-14 reading.gospel = Luke 14:26-33. @@ -512,6 +583,7 @@ date = 04-14 rank = class-3 colour = red name.en = St. Justin +name.pl = św. Justyna, Męczennika reading.first = 1 Cor 1:18-25; 1:30; reading.gospel = Luke 12:2-8 @@ -520,18 +592,21 @@ date = 04-14 rank = commemoration colour = red name.en = Sts. Tiburtius, Valerian et Maximus, Martyrs +name.pl = śś. Tyburcjusza, Waleriana i Maksyma, Męczenników [anicetus] date = 04-17 rank = commemoration colour = red name.en = St. Anicetus +name.pl = św. Aniceta, Papieża i Męczennika [anselm] date = 04-21 rank = class-3 colour = white name.en = St. Anselm +name.pl = św. Anzelma, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -540,6 +615,7 @@ date = 04-22 rank = class-3 colour = red name.en = Sts. Soter & Caius +name.pl = śś. Sotera i Kajusa, Papieży i Męczenników reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -548,12 +624,14 @@ date = 04-23 rank = commemoration colour = red name.en = St. George +name.pl = św. Jerzego, Męczennika [fidelis-of-sigmaringen] date = 04-24 rank = class-3 colour = red name.en = St. Fidelis of Sigmaringen +name.pl = św. Fidelisa z Sigmaringen, Męczennika reading.first = Wis 5:1-5 reading.gospel = John 15:1-7 @@ -562,6 +640,7 @@ date = 04-25 rank = class-2 colour = red name.en = St. Mark +name.pl = św. Marka Ewangelisty reading.first = Ezek 1:10-14 reading.gospel = Luke 10:1-9 @@ -570,6 +649,7 @@ date = 04-26 rank = class-3 colour = red name.en = Sts. Cletus & Marcellinus +name.pl = śś. Kleta i Marcelina, Papieży i Męczenników reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -578,6 +658,7 @@ date = 04-27 rank = class-3 colour = white name.en = St. Peter Canisius +name.pl = św. Piotra Kanizjusza, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -586,6 +667,7 @@ date = 04-28 rank = class-3 colour = white name.en = St. Paul of the Cross +name.pl = św. Pawła od Krzyża, Wyznawcy reading.first = 1 Cor 1:17-25. reading.gospel = Luke 10:1-9 @@ -594,6 +676,7 @@ date = 04-29 rank = class-3 colour = red name.en = St. Peter of Verona +name.pl = św. Piotra z Werony, Męczenika reading.first = 2 Tim. 2:8-10; 3:10-12. reading.gospel = Matt 10:34-42 @@ -602,6 +685,7 @@ date = 04-30 rank = class-3 colour = white name.en = St. Catherine of Siena +name.pl = św. Katarzyny Sieneńskiej, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -610,6 +694,7 @@ date = 05-01 rank = class-1 colour = white name.en = St. Joseph the Workman +name.pl = św. Józefa Robotnika, Oblubieńca N. M. P reading.first = Col. 3:14-15, 17, 23-24 reading.gospel = Matt 13:54-58 @@ -618,6 +703,7 @@ date = 05-02 rank = class-3 colour = white name.en = St. Athanasius +name.pl = św. Atanazego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Cor. 4:5-14 reading.gospel = Matt 10:23-28 @@ -626,12 +712,14 @@ date = 05-03 rank = commemoration colour = red name.en = Sts. Alexander & Companions +name.pl = śś. Aleksandra i Towarzyszy, Męczenników [monica] date = 05-04 rank = class-3 colour = white name.en = St. Monica +name.pl = św. Moniki, Wdowy reading.first = 1 Tim. 5:3-10. reading.gospel = Luke 7:11-16 @@ -640,6 +728,7 @@ date = 05-05 rank = class-3 colour = white name.en = St. Pius V +name.pl = św. Piusa V, Papieża i Wyznawcy reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -648,6 +737,7 @@ date = 05-07 rank = class-3 colour = red name.en = St. Stanislaus +name.pl = św. Stanisława, Biskupa i Męczennika reading.first = Wis 5:1-5 reading.gospel = John 15:1-7 @@ -656,6 +746,7 @@ date = 05-09 rank = class-3 colour = white name.en = St. Gregory of Nazianzen +name.pl = św. Grzegorza z Nazjanzu, Biskupa, Wyznawcy i Doktora Kościoła reading.first = Ecclus 39:6-14 reading.gospel = Matt 5:13-19 @@ -664,6 +755,7 @@ date = 05-10 rank = class-3 colour = white name.en = St. Antoninus +name.pl = św. Antonina, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -672,12 +764,14 @@ date = 05-10 rank = commemoration colour = red name.en = St. Gordiano and Epimacho +name.pl = śś. Gordiana i Epimacha, Męczenników [sts-philip-james] date = 05-11 rank = class-2 colour = red name.en = Sts. Philip & James +name.pl = Świętych Filipa i Jakuba, Apostołów reading.first = Wis. 5:1-5 reading.gospel = John 14:1-13 @@ -686,6 +780,7 @@ date = 05-12 rank = class-3 colour = red name.en = Sts. Nereus, Achilleus, Domitilla, & Pancras +name.pl = Świętych Nereusza, Achillesa, Domicylli i Pankracego, Męczenników reading.first = Wis. 5:1-5 reading.gospel = John 4:46-53 @@ -694,6 +789,7 @@ date = 05-13 rank = class-3 colour = white name.en = St. Robert Bellarmine +name.pl = św. Roberta Bellarmina, Biskupa, Wyznawcy i Doktora Kościoła reading.first = Wis 7:7-14. reading.gospel = Matt 5:13-19 @@ -708,6 +804,7 @@ date = 05-15 rank = class-3 colour = white name.en = St. John Baptist de la Salle +name.pl = św. Jana Chrzciciela de la Salle, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Matt 18:1-5 @@ -716,12 +813,14 @@ date = 05-16 rank = commemoration colour = white name.en = St. Ubaldus +name.pl = św. Ubalda, Biskupa i Wyznawcy [paschal-baylon] date = 05-17 rank = class-3 colour = white name.en = St. Paschal Baylon +name.pl = św. Paschalisa Baylon, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -730,6 +829,7 @@ date = 05-18 rank = class-3 colour = red name.en = St. Venantius +name.pl = św. Wenancjusza, Męczennika reading.first = Wis 5:1-5 reading.gospel = John 15:1-7 @@ -738,6 +838,7 @@ date = 05-19 rank = class-3 colour = white name.en = St. Peter Celestine +name.pl = św. Piotra Celestyna, Papieża i Wyznawcy reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -746,12 +847,14 @@ date = 05-19 rank = commemoration colour = white name.en = St. Pudentiana Virginis +name.pl = św. Pudencjany, Dziewicy [bernardine-of-siena] date = 05-20 rank = class-3 colour = white name.en = St. Bernardine of Siena +name.pl = św. Bernardyna ze Sieny, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Matt 19:27-29. @@ -760,6 +863,7 @@ date = 05-25 rank = class-3 colour = white name.en = St. Gregory VII +name.pl = św. Grzegorza VII, Papieża i Wyznawcy reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -768,18 +872,21 @@ date = 05-25 rank = commemoration colour = red name.en = St. Urban, Pope and Martyr +name.pl = św. Urbana I, Papieża i Męczennika [eleutherius] date = 05-26 rank = commemoration colour = red name.en = S. Eleutherius +name.pl = św. Eleuteriusza, Papieża i Męczennika [philip-neri] date = 05-26 rank = class-3 colour = white name.en = St. Philip Neri +name.pl = św. Filipa Nereusza, Wyznawcy reading.first = Wis 7:7-14. reading.gospel = Luke 12:35-40 @@ -788,6 +895,7 @@ date = 05-27 rank = class-3 colour = white name.en = St. Bede the Venerable +name.pl = św. Bedy Czcigodnego, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -796,12 +904,14 @@ date = 05-27 rank = commemoration colour = red name.en = St. John I +name.pl = św. Jana I, Papieża i Męczennika [augustine-of-canterbury] date = 05-28 rank = class-3 colour = white name.en = St. Augustine of Canterbury +name.pl = św. Augustyna z Canterbury, Biskupa i Wyznawcy reading.first = 1 Thess 2:2-9 reading.gospel = Luke 10:1-9 @@ -810,6 +920,7 @@ date = 05-29 rank = class-3 colour = white name.en = St. Mary Magdalene de Pazzi +name.pl = św. Marii Magdaleny Pazzi, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -818,18 +929,21 @@ date = 05-30 rank = commemoration colour = red name.en = St. Felix I +name.pl = św. Feliksa I, Papieża i Męczennika [petronilla] date = 05-31 rank = commemoration colour = white name.en = St. Petronilla +name.pl = św. Petroneli, Dziewicy [queenship-of-the-blessed-virgin-mary] date = 05-31 rank = class-2 colour = white name.en = Queenship of the Blessed Virgin Mary +name.pl = N. M. P. Królowej reading.first = Eccli 24:5; 14:7; 14:9-11; 24:30-31 reading.gospel = Luke 1:26-33 @@ -838,6 +952,7 @@ date = 06-01 rank = class-3 colour = white name.en = St. Angela Merici +name.pl = św. Anieli Merici, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -846,12 +961,14 @@ date = 06-02 rank = commemoration colour = red name.en = Sts. Marcellinus, Peter, & Erasmus +name.pl = śś. Marcelina i Piotra, Męczenników oraz Erazma, Biskupa [francis-caracciolo] date = 06-04 rank = class-3 colour = white name.en = St. Francis Caracciolo +name.pl = św. Franciszka Caracciolo, Wyznawcy reading.first = Wis. 4:7-14. reading.gospel = Luke 12:35-40 @@ -860,6 +977,7 @@ date = 06-05 rank = class-3 colour = red name.en = St. Boniface +name.pl = św. Bonifacego, Biskupa i Męczennika reading.first = Ecclus 44:1-15 reading.gospel = Matt 5:1-12 @@ -868,6 +986,7 @@ date = 06-06 rank = class-3 colour = white name.en = St. Norbert +name.pl = św. Norberta, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -876,12 +995,14 @@ date = 06-09 rank = commemoration colour = red name.en = Sts. Primus & Felicianus +name.pl = śś. Pryma i Felicjana, Męczenników [margaret-of-scotland] date = 06-10 rank = class-3 colour = white name.en = St. Margaret of Scotland +name.pl = św. Małgorzaty, Królowej Szkockiej, Wdowy reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -890,6 +1011,7 @@ date = 06-11 rank = class-3 colour = red name.en = St. Barnabas +name.pl = św. Barnaby, Apostoła reading.first = Acts 11:21-26; 13:1-3 reading.gospel = Matt 10:16-22 @@ -898,12 +1020,14 @@ date = 06-12 rank = commemoration colour = red name.en = St. Basilidus +name.pl = śś. Bazylidesa, Cyryna, Nabora i Nazariusza, Męczenników [john-of-san-fecundo] date = 06-12 rank = class-3 colour = red name.en = St. John of San Fecundo +name.pl = św. Jana z Facundo, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -912,6 +1036,7 @@ date = 06-13 rank = class-3 colour = white name.en = St. Anthony of Padua +name.pl = św. Antoniego z Padwy, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -920,6 +1045,7 @@ date = 06-14 rank = class-3 colour = white name.en = St. Basil the Great +name.pl = św. Bazylego Wielkiego, Wyznawcy, Biskupa i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Luke 14:26-35 @@ -928,12 +1054,14 @@ date = 06-15 rank = commemoration colour = white name.en = St. Vitus +name.pl = śś. Wita, Modesta i Krescencji, Męczenników [gregory-barbarigo] date = 06-17 rank = class-3 colour = white name.en = St. Gregory Barbarigo +name.pl = św. Grzegorza Barbarigo, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -942,6 +1070,7 @@ date = 06-18 rank = class-3 colour = red name.en = St. Ephrem of Syria +name.pl = św. Efrema, Diakona, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -950,12 +1079,14 @@ date = 06-18 rank = commemoration colour = red name.en = Ss. Marcus and Marcellianus +name.pl = śś. Marka i Marcelina, Męczenników [julia-of-falconieri] date = 06-19 rank = class-3 colour = red name.en = St. Julia of Falconieri +name.pl = św. Juliany Falconieri, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -964,18 +1095,21 @@ date = 06-19 rank = commemoration colour = red name.en = Sts. Gervasius and Protasius +name.pl = śś. Gerwazego i Protazego, Męczenników [silverius] date = 06-20 rank = commemoration colour = red name.en = St. Silverius +name.pl = św. Sylweriusza, Papieża i Męczennika [aloysius-gongzaga] date = 06-21 rank = class-3 colour = white name.en = St. Aloysius Gongzaga +name.pl = św. Alojzego Gonzagi, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Matt 22:29-40 @@ -984,6 +1118,7 @@ date = 06-22 rank = class-3 colour = white name.en = St. Paulinus of Nola +name.pl = św. Paulina, Biskupa i Wyznawcy reading.first = 2 Cor. 8:9-15 reading.gospel = Luke 12:32-34 @@ -992,6 +1127,7 @@ date = 06-23 rank = class-2 colour = violet name.en = Vigil of the Nativity of St. John the Baptist +name.pl = Wigilia Narodzenia Św. Jana Chrzciciela reading.first = Jer 1:4-10 reading.gospel = Luke 1:5-17 @@ -1000,6 +1136,7 @@ date = 06-24 rank = class-1 colour = white name.en = Nativity of St. John the Baptist +name.pl = Narodzenie Św. Jana Chrzciciela reading.first = Isa 49:1-3, 5-7. reading.gospel = Luke 1:57-68 @@ -1008,6 +1145,7 @@ date = 06-25 rank = class-3 colour = white name.en = St. William +name.pl = św. Wilhelma, Opata reading.first = Ecclus 45:1-6 reading.gospel = Matt 19:27-29. @@ -1016,6 +1154,7 @@ date = 06-26 rank = class-3 colour = red name.en = Sts. John & Paul +name.pl = śś. Jana i Pawła, Męczenników reading.first = Eccli 44:10-15 reading.gospel = Luke 12:1-8 @@ -1024,6 +1163,7 @@ date = 06-28 rank = class-2 colour = violet name.en = Vigil of Sts. Peter & Paul +name.pl = Wigilia śś. Apostołów Piotra i Pawła reading.first = Acts 3:1-10 reading.gospel = John 21:15-19 @@ -1032,6 +1172,7 @@ date = 06-29 rank = class-1 colour = red name.en = Sts. Peter & Paul +name.pl = Świętych Piotra i Pawła, Apostołów reading.first = Acts 12:1-11 reading.gospel = Matt 16:13-19 @@ -1040,6 +1181,7 @@ date = 06-30 rank = class-3 colour = red name.en = In Commemoratione Sancti Pauli Apostoli +name.pl = Wspomnienie św. Pawła, Apostoła reading.first = Gal 1:11-20 reading.gospel = Matt 10:16-22 @@ -1049,6 +1191,7 @@ rank = class-1 colour = red class = lord name.en = The Precious Blood of Our Lord Jesus Christ +name.pl = Uroczystość Najdroższej Krwi Pana Naszego Jezusa Chrystusa reading.first = Heb 9:11-15. reading.gospel = John 19:30-35 @@ -1057,12 +1200,14 @@ date = 07-02 rank = commemoration colour = red name.en = SS. Processus and Martinian +name.pl = śś. Procesa i Martyniana, Męczenników [visitation-of-the-blessed-virgin-mary] date = 07-02 rank = class-2 colour = white name.en = Visitation of the Blessed Virgin Mary +name.pl = Nawiedzenia N. M. P. reading.first = Song 2:8-14 reading.gospel = Luke 1:39-47 @@ -1071,6 +1216,7 @@ date = 07-03 rank = class-3 colour = red name.en = St. Irenaeus +name.pl = św. Ireneusza, Biskupa i Męczennika reading.first = 2 Tim. 3:14-17; 4:1-5 reading.gospel = Matt 10:28-33 @@ -1079,6 +1225,7 @@ date = 07-05 rank = class-3 colour = white name.en = St. Anthony Mary Zaccariah +name.pl = św. Antoniego Marii Zaccaria, Wyznawcy reading.first = 1 Tim. 4:8-16 reading.gospel = Mark 10:15-21 @@ -1087,6 +1234,7 @@ date = 07-07 rank = class-3 colour = white name.en = Sts. Cyril & Methodius +name.pl = śś. Cyryla i Metodego, Biskupów i Wyznawców reading.first = Heb 7:23-27 reading.gospel = Luke 10:1-9 @@ -1095,6 +1243,7 @@ date = 07-08 rank = class-3 colour = white name.en = St. Elizabeth of Portugal +name.pl = św. Elżbiety, Królowej i Wdowy reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -1103,6 +1252,7 @@ date = 07-10 rank = class-3 colour = red name.en = Seven Holy Brothers and Sts. Rufina & Secunda +name.pl = Siedmiu Braci Męczenników oraz Śś. Rufiny i Sekundy, Dziewic i Męczennic reading.first = Prov 31:10-31 reading.gospel = Matt 12:46-50 @@ -1111,12 +1261,14 @@ date = 07-11 rank = commemoration colour = red name.en = St. Pius I +name.pl = św. Piusa I, Papieża i Męczennika [john-gualbert] date = 07-12 rank = class-3 colour = red name.en = St. John Gualbert +name.pl = św. Jana Gwalberta, Opata reading.first = Ecclus 45:1-6 reading.gospel = Matt 5:43-48 @@ -1125,12 +1277,14 @@ date = 07-12 rank = commemoration colour = red name.en = Ss. Naboris et Felicis +name.pl = śś. Nabora i Feliksa, Męczenników [bonaventure] date = 07-14 rank = class-3 colour = white name.en = St. Bonaventure +name.pl = św. Bonawentury, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -1139,6 +1293,7 @@ date = 07-15 rank = class-3 colour = white name.en = St. Henry the Emperor +name.pl = św. Henryka, Cesarza i Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1147,18 +1302,21 @@ date = 07-16 rank = commemoration colour = white name.en = Our Lady of Mt. Carmel +name.pl = Wspomnienie N. M. P. z Góry Karmelu [alexis] date = 07-17 rank = commemoration colour = white name.en = St. Alexis +name.pl = św. Aleksego, Wyznawcy [camillus-de-lellis] date = 07-18 rank = class-3 colour = red name.en = Camillus de Lellis +name.pl = św. Kamila de Lellis reading.first = 1 John 3:13-18. reading.gospel = John 15:12-16 @@ -1167,12 +1325,14 @@ date = 07-18 rank = commemoration colour = red name.en = Ss. Symphorosa and sons +name.pl = śś. Symforozy i Siedmiu Jej Synów [vincent-de-paul] date = 07-19 rank = class-3 colour = white name.en = St. Vincent de Paul +name.pl = św. Wincentego a Paulo, Wyznawcy reading.first = 1 Cor. 4:9-14 reading.gospel = Luke 10:1-9 @@ -1181,6 +1341,7 @@ date = 07-20 rank = class-3 colour = red name.en = St. Jerome Emiliani +name.pl = św. Hieronima Emiliani, Wyznawcy reading.first = Isa 58:7-11 reading.gospel = Matt 19:13-21 @@ -1189,12 +1350,14 @@ date = 07-20 rank = commemoration colour = white name.en = St. Margaret +name.pl = św. Małgorzaty, Dziewicy i Męczennicy [laurence-of-brindisi] date = 07-21 rank = class-3 colour = white name.en = St. Laurence of Brindisi +name.pl = św. Wawrzyńca z Brindisi, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -1203,12 +1366,14 @@ date = 07-21 rank = commemoration colour = white name.en = St. Praxedis Virginis +name.pl = św. Praksedy, Dziewicy [mary-magdalene] date = 07-22 rank = class-3 colour = white name.en = St. Mary Magdalene +name.pl = św. Marii Magdaleny, Pokutnicy reading.first = Song 3:2-5; 8:6-7 reading.gospel = Luke 7:36-50 @@ -1217,6 +1382,7 @@ date = 07-23 rank = class-3 colour = white name.en = St. Apollinaris +name.pl = św. Apolinarego, Biskupa i Męczennika reading.first = 1 Pet. 5:1-11 reading.gospel = Luke 22:24-30 @@ -1225,24 +1391,28 @@ date = 07-23 rank = commemoration colour = red name.en = S. Liborii +name.pl = św. Liboriusza, Biskupa i Wyznawcy [christina] date = 07-24 rank = commemoration colour = red name.en = St. Christina +name.pl = św. Krystyny, Dziewicy i Męczennicy [christopher] date = 07-25 rank = commemoration colour = red name.en = St. Christopher +name.pl = św. Krzysztofa, Męczennika [james-the-greater] date = 07-25 rank = class-2 colour = red name.en = St. James the Greater +name.pl = św. Jakuba, Apostoła reading.first = 1 Cor. 4:9-15 reading.gospel = Matt 20:20-23 @@ -1251,6 +1421,7 @@ date = 07-26 rank = class-2 colour = white name.en = St. Anne, Mother of the Blessed Virgin +name.pl = św. Anny, Matki N. M. P. reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -1259,12 +1430,14 @@ date = 07-27 rank = commemoration colour = red name.en = St. Pantaleon +name.pl = św. Pantaleona, Męczennika [sts-nazarius-celsus-st-victor-i-st-innocent-i] date = 07-28 rank = class-3 colour = red name.en = Sts. Nazarius & Celsus, St. Victor I & St. Innocent I +name.pl = śś. Nazariusza i Celsa, Męczenników, Wiktora I, Papieża i Męczennika, oraz Innocentego I, Papieża i Wyznawcy reading.first = Wis 10:17-20 reading.gospel = Luke 21:9-19 @@ -1273,12 +1446,14 @@ date = 07-29 rank = commemoration colour = red name.en = Ss. Felicis, Simplicii, Faustini et Beatricis +name.pl = śś. Feliksa, Symplicjusza, Faustyna i Beatryczy, Męczenników [martha] date = 07-29 rank = class-3 colour = red name.en = St. Martha +name.pl = św. Marty, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Luke 10:38-42 @@ -1287,12 +1462,14 @@ date = 07-30 rank = commemoration colour = red name.en = Sts. Abdon & Sennen +name.pl = śś. Abdona i Sennena, Męczenników [ignatius-loyola] date = 07-31 rank = class-3 colour = white name.en = St. Ignatius Loyola +name.pl = św. Ignacego Loyoli, Wyznawcy reading.first = 2 Tim. 2:8-10; 3:10-12. reading.gospel = Luke 10:1-9 @@ -1301,12 +1478,14 @@ date = 08-01 rank = commemoration colour = red name.en = Holy Machabees +name.pl = Siedmiu Braci Machabejskich, Męczenników [alphonsus-liguori] date = 08-02 rank = class-3 colour = red 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 reading.gospel = Luke 10:1-9 @@ -1315,12 +1494,14 @@ date = 08-02 rank = commemoration colour = red name.en = St. Stephen I, Pope and Martyr +name.pl = św. Stefana I, Papieża i Męczennika [dominic] date = 08-04 rank = class-3 colour = white name.en = St. Dominic +name.pl = św. Dominika, Wyznawcy reading.first = 2 Tim. 4:1-8 reading.gospel = Luke 12:35-40 @@ -1329,6 +1510,7 @@ date = 08-05 rank = class-3 colour = white name.en = Dedication of the Basilica of St. Mary Major +name.pl = Rocznica Konsekracji N. M. P. Śnieżnej reading.first = Ecclus 24:14-16 reading.gospel = Luke 11:27-28 @@ -1337,6 +1519,7 @@ date = 08-06 rank = commemoration colour = red name.en = Pope Sixtus II, Felicissimus and Agapitus, Martyrs +name.pl = śś. Sykstusa II, Papieża, Felicysyma i Agapita, Męczenników [transfiguration-of-our-lord] date = 08-06 @@ -1344,6 +1527,7 @@ rank = class-2 colour = white class = lord name.en = Transfiguration of Our Lord +name.pl = Przemienienie Pańskie reading.first = 2 Pet. 1:16-19 reading.gospel = Matt 17:1-9 @@ -1352,6 +1536,7 @@ date = 08-07 rank = class-3 colour = white name.en = St. Cajetan +name.pl = św. Kajetana, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Matt 6:24-33 @@ -1360,26 +1545,37 @@ date = 08-07 rank = commemoration colour = red name.en = St. Donatus +name.pl = św. Donata, Biskupa i Męczennika [cyriacus-largus-and-smaragdus-martyrs] date = 08-08 rank = commemoration colour = red name.en = Ss. Cyriacus, Largus and Smaragdus, Martyrs +name.pl = śś. Cyriaka, Larga i Szmaragda, Męczenników [john-mary-vianney] date = 08-08 rank = class-3 colour = white name.en = St. John Mary Vianney +name.pl = św. Jana Marii Vianney, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 +[romanus] +date = 08-09 +rank = commemoration +colour = red +name.en = St. Romanus +name.pl = św. Romana, Męczennika + [vigil-of-st-lawrence] date = 08-09 rank = class-3 colour = red name.en = Vigil of St. Lawrence +name.pl = Wigilia św. Wawrzyńca, Męczennika reading.first = Ecclus 51:1-8, 12 reading.gospel = Matt 16:24-27 @@ -1388,6 +1584,7 @@ date = 08-10 rank = class-2 colour = red name.en = St. Lawrence +name.pl = św. Wawrzyńca reading.first = 2 Cor. 9:6-10 reading.gospel = John 12:24-26 @@ -1396,12 +1593,14 @@ date = 08-11 rank = commemoration colour = red name.en = Sts. Tiburtius & Susanna +name.pl = śś. Tyburcjusza i Zuzanny, Męczenników [clare] date = 08-12 rank = class-3 colour = white name.en = St. Clare +name.pl = św. Klary, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -1410,12 +1609,20 @@ date = 08-13 rank = commemoration colour = red name.en = Sts. Hippolytus & Cassian +name.pl = śś. Hipolita i Kasjana, Męczenników + +[eusebius-confessor] +date = 08-14 +rank = commemoration +colour = red +name.en = St. Eusebius [vigil-of-the-assumption] date = 08-14 rank = class-2 colour = white name.en = Vigil of the Assumption +name.pl = Wigilia Wniebowzięcia N. M. P. reading.first = Sir 24:23-31 reading.gospel = Luke 11:27-28 @@ -1424,6 +1631,7 @@ date = 08-15 rank = class-1 colour = white name.en = Assumption of the Blessed Virgin Mary +name.pl = Wniebowzięcie N. M. P. reading.first = Judith 13:22-25; 13:15; 13:10 reading.gospel = Luke 1:41-50 @@ -1432,6 +1640,7 @@ date = 08-16 rank = class-2 colour = white name.en = St. Joachim, Father of the Blessed Virgin +name.pl = św. Joachima, Ojca N. M. P. reading.first = Sir 31:8-11 reading.gospel = Matt 1:1-16 @@ -1440,6 +1649,7 @@ date = 08-17 rank = class-3 colour = white name.en = St. Hyacinth +name.pl = św. Jacka, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1448,12 +1658,14 @@ date = 08-18 rank = commemoration colour = white name.en = St. Agapitus +name.pl = św. Agapita, Męczennika [john-eudes] date = 08-19 rank = class-3 colour = white name.en = St. John Eudes +name.pl = św. Jana Eudes, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1462,6 +1674,7 @@ date = 08-20 rank = class-3 colour = white name.en = St. Bernard of Clairvaux +name.pl = św. Bernarda, Opata i Doktora Kościoła reading.first = Ecclus 39:6-14 reading.gospel = Matt 5:13-19 @@ -1470,6 +1683,7 @@ date = 08-21 rank = class-3 colour = white name.en = St. Jane Frances de Chantal +name.pl = św. Joanny Franciszki Frémiot de Chantal, Wdowy reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -1478,6 +1692,7 @@ date = 08-22 rank = class-2 colour = white name.en = Immaculate Heart of Mary +name.pl = Uroczystość Niepokalanego Serca N. M. P. reading.first = Sir 24:23-31 reading.gospel = John 19:25-27 @@ -1486,12 +1701,14 @@ date = 08-22 rank = commemoration colour = red name.en = Sts. Timothy, Hippolytus and Symphorianus, Martyrs +name.pl = śś. Tymoteusza, Hipolita i Symforiana, Męczenników [philip-benizi] date = 08-23 rank = class-3 colour = white name.en = St. Philip Benizi +name.pl = św. Filipa Benicjusza, Wyznawcy reading.first = 1 Cor. 4:9-14 reading.gospel = Luke 12:32-34 @@ -1500,6 +1717,7 @@ date = 08-24 rank = class-2 colour = red name.en = St. Bartholomew +name.pl = św. Bartłomieja, Apostoła reading.first = 1 Cor. 12:27-31 reading.gospel = Luke 6:12-19 @@ -1508,6 +1726,7 @@ date = 08-25 rank = class-3 colour = white name.en = St. Louis IX +name.pl = św. Ludwika, Króla i Wyznawcy reading.first = Wis 10:10-14 reading.gospel = Luke 19:12-26 @@ -1516,12 +1735,14 @@ date = 08-26 rank = commemoration colour = red name.en = St. Zephyrinus +name.pl = św. Zefiryna, Papieża i Męczennika [joseph-calasance] date = 08-27 rank = class-3 colour = white name.en = St. Joseph Calasance +name.pl = św. Józefa Kalasantego, Wyznawcy reading.first = Wis 10:10-14 reading.gospel = Matt 18:1-5 @@ -1530,6 +1751,7 @@ date = 08-28 rank = class-3 colour = red name.en = St. Augustine +name.pl = św. Augustyna, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -1538,12 +1760,14 @@ date = 08-28 rank = commemoration colour = red name.en = St. Hermes +name.pl = św. Hermesa, Męczennika [beheading-of-st-john-the-baptist] date = 08-29 rank = class-3 colour = red name.en = Beheading of St. John the Baptist +name.pl = Ścięcie Św. Jana Chrzciciela reading.first = Jer 1:17-19 reading.gospel = Mark 6:17-29 @@ -1552,12 +1776,14 @@ date = 08-29 rank = commemoration colour = red name.en = St. Sabina +name.pl = św. Sabiny, Męczennicy [rose-of-lima] date = 08-30 rank = class-3 colour = red name.en = St. Rose of Lima +name.pl = św. Róży z Limy, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -1566,12 +1792,14 @@ date = 08-30 rank = commemoration colour = red name.en = Sts. Felix and Adauctus +name.pl = śś. Feliksa i Adaukta, Męczenników [raymond-nonnatus] date = 08-31 rank = class-3 colour = white name.en = St. Raymond Nonnatus +name.pl = św. Rajmunda Nonnata, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1580,18 +1808,21 @@ date = 09-01 rank = commemoration colour = white name.en = St. Giles +name.pl = św. Idziego, Opata [twelve-holy-brothers-martyrs] date = 09-01 rank = commemoration colour = red name.en = Twelve Holy Brothers, Martyrs +name.pl = śś. Dwunastu Braci, Męczenników [stephen-of-hungary] date = 09-02 rank = class-3 colour = white name.en = St. Stephen of Hungary +name.pl = św. Stefana, Króla i Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 19:12-26 @@ -1600,6 +1831,7 @@ date = 09-03 rank = class-3 colour = white name.en = St. Pius X +name.pl = św. Piusa X, Papieża i Wyznawcy reading.first = 1 Thess. 2:2-8 reading.gospel = John 21:15-17 @@ -1608,6 +1840,7 @@ date = 09-05 rank = class-3 colour = white name.en = St. Lawrence Justinian +name.pl = św. Wawrzyńca Justiniani, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -1616,12 +1849,14 @@ date = 09-08 rank = commemoration colour = red name.en = S. Hadriani +name.pl = św. Hadriana, Męczennika [nativity-of-the-blessed-virgin-mary] date = 09-08 rank = class-2 colour = white name.en = Nativity of the Blessed Virgin Mary +name.pl = Narodzenie N. M. P. reading.first = Prov 8:22-35 reading.gospel = Matt 1:1-16 @@ -1630,12 +1865,14 @@ date = 09-09 rank = commemoration colour = red name.en = St. Gorgonius +name.pl = św. Gorgoniusza, Męczennika [nicholas-of-tolentino] date = 09-10 rank = class-3 colour = white name.en = St. Nicholas of Tolentino +name.pl = św. Mikołaja z Tolentynu, Wyznawcy reading.first = 1 Cor. 4:9-14 reading.gospel = Luke 12:32-34 @@ -1644,12 +1881,14 @@ date = 09-11 rank = commemoration colour = red name.en = Sts. Protus & Hyacinth +name.pl = św. Prota i Jacka, Męczenników [most-holy-name-of-mary] date = 09-12 rank = class-3 colour = white name.en = Most Holy Name of Mary +name.pl = Najświętszego Imienia Maryi reading.first = Sir 24:23-31 reading.gospel = Luke 1:26-38 @@ -1659,6 +1898,7 @@ rank = class-2 colour = red class = lord name.en = Exaltation of the Holy Cross +name.pl = Podwyższenia Świętego Krzyża reading.first = Phil 2:5-11 reading.gospel = John 12:31-36 @@ -1667,12 +1907,14 @@ date = 09-15 rank = commemoration colour = red name.en = S. Nicomedes +name.pl = św. Nikomedesa, Męczennika [seven-sorrows-of-the-blessed-virgin-mary] date = 09-15 rank = class-2 colour = white name.en = Seven Sorrows of the Blessed Virgin Mary +name.pl = Siedmiu Boleści N. M. P. reading.first = Judith 13:22; 13:25 reading.gospel = John 19:25-27 @@ -1681,6 +1923,7 @@ date = 09-16 rank = class-3 colour = red name.en = Sts. Cornelius & Cyprian +name.pl = św. Korneliusza, Papieża i Cypriana, Męczenników reading.first = Wis 3:1-8 reading.gospel = Luke 21:9-19 @@ -1689,18 +1932,21 @@ date = 09-16 rank = commemoration colour = red name.en = Sts. Euphemia, Lucy and Geminianus +name.pl = śś. Eufemii, Łucji i Geminiana, Męczenników [stigmata-of-st-francis] date = 09-17 rank = commemoration colour = white name.en = Stigmata of St. Francis +name.pl = Stygmatów św. Franciszka, Wyznawcy [joseph-of-cupertino] date = 09-18 rank = class-3 colour = white name.en = St. Joseph of Cupertino +name.pl = św. Józefa z Kupertynu, Wyznawcy reading.first = 1 Cor 13:1-8 reading.gospel = Matt 22:1-14 @@ -1709,6 +1955,7 @@ date = 09-19 rank = class-3 colour = red name.en = St. Januarius & Companions +name.pl = św. Januarego i Towarzyszy, Męczenników reading.first = Heb 10:32-38 reading.gospel = Matt 24:3-13 @@ -1717,12 +1964,14 @@ date = 09-20 rank = commemoration colour = red name.en = Sts. Eustace & Companions +name.pl = św. Eustachego i Towarzyszy, Męczenników [matthew] date = 09-21 rank = class-2 colour = red name.en = St. Matthew +name.pl = św. Mateusza, Apostoła i Ewangelisty reading.first = Ezek 1:10-14 reading.gospel = Matt 9:9-13 @@ -1731,12 +1980,14 @@ date = 09-22 rank = commemoration colour = red name.en = St. Maurice and Companions, Martyrs +name.pl = śś. Maurycego i Towarzyszy, Męczenników [thomas-of-villanova] date = 09-22 rank = class-3 colour = white name.en = St. Thomas of Villanova +name.pl = św. Tomasza z Villanueva, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -1745,6 +1996,7 @@ date = 09-23 rank = class-3 colour = red name.en = St. Linus +name.pl = św. Linusa, Papieża i Męczennika reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -1753,24 +2005,28 @@ date = 09-23 rank = commemoration colour = red name.en = St. Thecla +name.pl = św. Tekli, Dziewicy i Męczennicy [our-lady-of-ransom] date = 09-24 rank = commemoration colour = white name.en = Our Lady of Ransom +name.pl = N. M. P. od Wykupu Jeńców [sts-cyprian-justina] date = 09-26 rank = commemoration colour = red name.en = Sts. Cyprian & Justina +name.pl = śś. Cypriana i Justyny, Męczenników [sts-cosmas-damian] date = 09-27 rank = class-3 colour = red name.en = Sts. Cosmas & Damian +name.pl = św. Kosmy i Damiana, Męczenników reading.first = Wis 5:16-20 reading.gospel = Luke 6:17-23 @@ -1779,6 +2035,7 @@ date = 09-28 rank = class-3 colour = red name.en = St. Wenceslaus +name.pl = św. Wacława, Księcia i Męczennika reading.first = Wis 10:10-14 reading.gospel = Matt 10:34-42 @@ -1787,6 +2044,7 @@ date = 09-29 rank = class-1 colour = white name.en = Dedication of St. Michael the Archangel +name.pl = Świętego Michała Archanioła reading.first = Rev 1:1-5 reading.gospel = Matt 18:1-10 @@ -1795,6 +2053,7 @@ date = 09-30 rank = class-3 colour = white name.en = St. Jerome +name.pl = św. Hieronima, Kapłana, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -1803,12 +2062,14 @@ date = 10-01 rank = commemoration colour = white name.en = St. Remigius +name.pl = św. Remigiusza, Biskupa i Wyznawcy [holy-guardian-angels] date = 10-02 rank = class-3 colour = white name.en = Holy Guardian Angels +name.pl = Świętych Aniołów Stróżów reading.first = Exod 23:20-23 reading.gospel = Matt 18:1-10 @@ -1817,6 +2078,7 @@ date = 10-03 rank = class-3 colour = white name.en = St. Theresa of the Infant Jesus +name.pl = św. Teresy od Dzieciątka Jezus, Dziewicy reading.first = Isa 66:12-14 reading.gospel = Matt 18:1-4 @@ -1825,6 +2087,7 @@ date = 10-04 rank = class-3 colour = white name.en = St. Francis of Assisi +name.pl = św. Franciszka, Wyznawcy reading.first = Gal 6:14-18 reading.gospel = Matt 11:25-30 @@ -1833,12 +2096,14 @@ date = 10-05 rank = commemoration colour = red name.en = St. Placid & Companions +name.pl = śś. Placyda i Towarzyszy, Męczenników [bruno] date = 10-06 rank = class-3 colour = white name.en = St. Bruno +name.pl = św. Brunona, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1847,12 +2112,14 @@ date = 10-07 rank = commemoration colour = red name.en = St. Mark I +name.pl = św. Marka I, Papieża i Wyznawcy [our-lady-of-the-rosary] date = 10-07 rank = class-2 colour = white name.en = Our Lady of the Rosary +name.pl = N. M. P. Różańcowej reading.first = Prov 8:22-24, 32-35. reading.gospel = Luke 1:26-38 @@ -1861,6 +2128,7 @@ date = 10-08 rank = class-3 colour = white name.en = St. Bridget of Sweden +name.pl = św. Brygidy, Wdowy reading.first = 1 Tim. 5:3-10. reading.gospel = Matt 13:44-52. @@ -1869,18 +2137,21 @@ date = 10-08 rank = commemoration colour = red name.en = Ss. Sergio, Baccho, Marcello and Apulejo Martyrs +name.pl = śś. Sergiusza, Bachusa, Marcelego i Apulejusza [dionysius-and-companions] date = 10-09 rank = commemoration colour = red name.en = St. Dionysius and companions +name.pl = śś. Dionizego, Rustyka i Eleuteriusza [john-leonardi] date = 10-09 rank = class-3 colour = white name.en = St. John Leonardi +name.pl = św. Jana Leonardi, Wyznawcy reading.first = 2 Cor 4:1-6; 4:15-18 reading.gospel = Luke 10:1-9 @@ -1889,6 +2160,7 @@ date = 10-10 rank = class-3 colour = white name.en = St. Francis Borgia +name.pl = św. Franciszka Borgiasza, Wyznawcy reading.first = Ecclus 45:1-6 reading.gospel = Matt 19:27-29. @@ -1897,6 +2169,7 @@ date = 10-11 rank = class-2 colour = white name.en = Maternity of the Blessed Virgin Mary +name.pl = Macierzyństwa N. M. P. reading.first = Sir 24:23-31 reading.gospel = Luke 2:43-51 @@ -1905,6 +2178,7 @@ date = 10-13 rank = class-3 colour = white name.en = St. Edward +name.pl = św. Edwarda, króla i wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -1913,6 +2187,7 @@ date = 10-14 rank = class-3 colour = red name.en = St. Callistus I +name.pl = św. Kaliksta, papieża i męczennika reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -1921,6 +2196,7 @@ date = 10-15 rank = class-3 colour = white name.en = St. Teresa of Avila +name.pl = św. Teresy z Avili, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -1929,6 +2205,7 @@ date = 10-16 rank = class-3 colour = white name.en = St. Hedwig +name.pl = św. Jadwigi, Wdowy reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -1937,6 +2214,7 @@ date = 10-17 rank = class-3 colour = white name.en = St. Margaret Mary Alacoque +name.pl = św. Małgorzaty Marii Alacoque, Dziewicy reading.first = Eph 3:8-9, 14-19 reading.gospel = Matt 11:25-30 @@ -1945,6 +2223,7 @@ date = 10-18 rank = class-2 colour = red name.en = St. Luke the Evangelist +name.pl = św. Łukasza, Ewangelisty reading.first = 2 Cor. 8:16-24 reading.gospel = Luke 10:1-9 @@ -1953,6 +2232,7 @@ date = 10-19 rank = class-3 colour = white name.en = St. Peter of Alcantara +name.pl = św. Piotra z Alkantary, Wyznawcy reading.first = Phil 3:7-12 reading.gospel = Luke 12:32-34 @@ -1961,6 +2241,7 @@ date = 10-20 rank = class-3 colour = white name.en = St. John Cantius +name.pl = św. Jana Kantego, Wyznawcy reading.first = James 2:12-17 reading.gospel = Luke 12:35-40 @@ -1969,18 +2250,21 @@ date = 10-21 rank = commemoration colour = white name.en = St. Hilarion +name.pl = św. Hilariona, Opata [ursula-and-companions] date = 10-21 rank = commemoration colour = red name.en = St. Ursula and Companions +name.pl = śś. Urszuli i Towarzyszek, Dziewic i Męczennic [anthony-mary-claret] date = 10-23 rank = class-3 colour = white name.en = St. Anthony Mary Claret +name.pl = św. Antoniego Marii Claret, Biskupa i Wyznawcy reading.first = Heb 7:23-27 reading.gospel = Matt 24:42-47 @@ -1989,6 +2273,7 @@ date = 10-24 rank = class-3 colour = white name.en = St. Raphael the Archangel +name.pl = św. Rafała Archanioła reading.first = Tob 12:7-15 reading.gospel = John 5:1-4 @@ -1997,6 +2282,7 @@ date = 10-25 rank = commemoration colour = red name.en = Sts. Chrysanthus & Daria +name.pl = śś. Chryzanta i Darii, Męczenników [evaristus] date = 10-26 @@ -2009,6 +2295,7 @@ date = 10-28 rank = class-2 colour = red name.en = Sts. Simon & Jude +name.pl = Świętych Szymona i Judy Tadeusza, Apostołów reading.first = Eph. 4:7-13. reading.gospel = John 15:17-25 @@ -2017,6 +2304,7 @@ date = 11-01 rank = class-1 colour = white name.en = All Saints +name.pl = Uroczystość Wszystkich Świętych reading.first = Apoc 7:2-12 reading.gospel = Matt 5:1-12 @@ -2025,6 +2313,7 @@ date = 11-02 rank = class-1 colour = black name.en = Commemoration of All Souls +name.pl = Dzień Zaduszny reading.first = 1 Cor. 15:51-57 reading.gospel = John 5:25-29 @@ -2033,6 +2322,7 @@ date = 11-04 rank = class-3 colour = white name.en = St. Charles Borromeo +name.pl = św. Karola Boromeusza, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Matt 25:14-23 @@ -2041,12 +2331,14 @@ date = 11-04 rank = commemoration colour = red name.en = Sts. Vitalis and Agricola, Martyrs +name.pl = śś. Witalisa i Agrykoli, Męczenników [four-holy-crowned-martyrs] date = 11-08 rank = commemoration colour = red name.en = Four Holy Crowned Martyrs +name.pl = Świętych Czterech Ukoronowanych Męczenników [dedication-of-the-archbasilica-of-our-holy-savior] date = 11-09 @@ -2054,6 +2346,7 @@ rank = class-2 colour = white class = lord name.en = Dedication of the Archbasilica of Our Holy Savior +name.pl = Rocznica Konsekracji Bazyliki Najświętszego Zbawiciela na Lateranie reading.first = Rev 21:2-5 reading.gospel = Luke 19:1-10 @@ -2068,6 +2361,7 @@ date = 11-10 rank = class-3 colour = white name.en = St. Andrew Avellino +name.pl = św. Andrzeja z Avellino, Wyznawcy reading.first = Sir 31:8-11 reading.gospel = Luke 12:35-40 @@ -2076,12 +2370,14 @@ date = 11-10 rank = commemoration colour = red name.en = Sts. Tryphonis, Respicii, et Nymphae +name.pl = śś. Tryfona, Respicjusza i Nimfy, Męczenników [martin-of-tours] date = 11-11 rank = class-3 colour = white name.en = St. Martin of Tours +name.pl = św. Marcina, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Luke 11:33-36 @@ -2090,12 +2386,14 @@ date = 11-11 rank = commemoration colour = red name.en = St. Menna +name.pl = św. Mennasa, Męczennika [martin-i] date = 11-12 rank = class-3 colour = red name.en = St. Martin I +name.pl = św. Marcina I, Papieża i Męczennika reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -2104,12 +2402,14 @@ date = 11-13 rank = commemoration colour = white name.en = St. Didacus +name.pl = św. Dydaka, Wyznawcy [josaphat] date = 11-14 rank = class-3 colour = white name.en = St. Josaphat +name.pl = św. Jozafata, Biskupa i Męczennika reading.first = Heb 5:1-6 reading.gospel = John 10:11-16 @@ -2118,6 +2418,7 @@ date = 11-15 rank = class-3 colour = white name.en = St. Albert the Great +name.pl = św. Alberta Wielkiego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -2126,6 +2427,7 @@ date = 11-16 rank = class-3 colour = white name.en = St. Gertrude the Great +name.pl = św. Gertrudy, Dziewicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 25:1-13. @@ -2134,6 +2436,7 @@ date = 11-17 rank = class-3 colour = white name.en = St. Gregory the Wonderworker +name.pl = św. Grzegorza Cudotwórcy, Biskupa i Wyznawcy reading.first = Sir 44:16-27; 45:3-20 reading.gospel = Mark 11:22-24 @@ -2142,6 +2445,7 @@ date = 11-18 rank = class-3 colour = white name.en = Dedication of the Basilicas of Sts. Peter & Paul +name.pl = Rocznica Konsekracji Bazylik Świętych Apostołów Piotra i Pawła reading.first = Rev 21:2-5 reading.gospel = Luke 19:1-10 @@ -2150,6 +2454,7 @@ date = 11-19 rank = class-3 colour = white name.en = St. Elizabeth of Hungary +name.pl = św. Elżbiety, Wdowy reading.first = Prov 31:10-31 reading.gospel = Matt 13:44-52. @@ -2158,12 +2463,14 @@ date = 11-19 rank = commemoration colour = red name.en = St. Pontian +name.pl = św. Poncjana, Papieża i Męczennika [felix-of-valois] date = 11-20 rank = class-3 colour = white name.en = St. Felix of Valois +name.pl = św. Feliksa Walezego, Wyznawcy reading.first = 1 Cor. 4:9-14 reading.gospel = Luke 12:32-34 @@ -2172,6 +2479,7 @@ date = 11-21 rank = class-3 colour = white name.en = Presentation of the Blessed Virgin Mary +name.pl = Ofiarowanie N. M. P. reading.first = Ecclus 24:14-16 reading.gospel = Luke 11:27-28 @@ -2180,6 +2488,7 @@ date = 11-22 rank = class-3 colour = red name.en = St. Cecilia +name.pl = św. Cecylii, Dziewicy i Męczennicy reading.first = Sir 51:13-17. reading.gospel = Matt 25:1-13. @@ -2188,6 +2497,7 @@ date = 11-23 rank = class-3 colour = red name.en = St. Clement I +name.pl = św. Klemensa I, Papieża i Męczennika reading.first = Phil 3:17-21; 4:1-3 reading.gospel = Matt 16:13-19 @@ -2196,18 +2506,21 @@ date = 11-23 rank = commemoration colour = red name.en = St. Felicity +name.pl = św. Felicyty, Męczennicy [chrysogonus] date = 11-24 rank = commemoration colour = red name.en = St. Chrysogonus +name.pl = św. Chryzogona, Męczennika [john-of-the-cross] date = 11-24 rank = class-3 colour = white name.en = St. John of the Cross +name.pl = św. Jana od Krzyża, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -2216,6 +2529,7 @@ date = 11-25 rank = class-3 colour = red name.en = St. Catherine of Alexandria +name.pl = św. Katarzyny, Dziewicy i Męczennicy reading.first = Sir 51:1-8; 51:12 reading.gospel = Matt 25:1-13. @@ -2224,12 +2538,14 @@ date = 11-26 rank = commemoration colour = red name.en = St. Peter of Alexandria +name.pl = św. Piotra z Aleksandrii, Biskupa i Męczennika [sylvester] date = 11-26 rank = class-3 colour = white name.en = St. Sylvester +name.pl = św. Sylwestra, Opata reading.first = Ecclus 45:1-6 reading.gospel = Matt 19:27-29. @@ -2238,12 +2554,14 @@ date = 11-29 rank = commemoration colour = red name.en = St. Saturninus +name.pl = św. Saturnina, Męczennika [andrew] date = 11-30 rank = class-2 colour = red name.en = St. Andrew +name.pl = św. Andrzeja, Apostoła reading.first = Rom 10:10-18 reading.gospel = Matt 4:18-22 @@ -2252,6 +2570,7 @@ date = 12-02 rank = class-3 colour = red name.en = St. Vivian +name.pl = św. Bibiany, Dziewicy i Męczennicy reading.first = Sir 51:13-17. reading.gospel = Matt 13:44-52. @@ -2260,6 +2579,7 @@ date = 12-03 rank = class-3 colour = white name.en = St. Francis Xavier +name.pl = św. Franciszka Ksawerego, Wyznawcy reading.first = Rom 10:10-18 reading.gospel = Mark 16:15-18 @@ -2268,6 +2588,7 @@ date = 12-04 rank = class-3 colour = white name.en = St. Peter Chrysologus +name.pl = św. Piotra Chryzologa, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -2276,12 +2597,14 @@ date = 12-05 rank = commemoration colour = white name.en = St. Sabbas +name.pl = św. Saby, Opata [nicholas] date = 12-06 rank = class-3 colour = white name.en = St. Nicholas +name.pl = św. Mikołaja, Biskupa i Wyznawcy reading.first = Heb 13:7-17 reading.gospel = Matt 25:14-23 @@ -2290,6 +2613,7 @@ date = 12-07 rank = class-3 colour = white name.en = St. Ambrose +name.pl = św. Ambrożego, Biskupa, Wyznawcy i Doktora Kościoła reading.first = 2 Tim 4:1-8 reading.gospel = Matt 5:13-19 @@ -2298,6 +2622,7 @@ date = 12-08 rank = class-1 colour = white name.en = Immaculate Conception of the Blessed Virgin Mary +name.pl = Niepokalane Poczęcie N. M. P. reading.first = Prov 8:22-35 reading.gospel = Luke 1:26-28 @@ -2306,12 +2631,14 @@ date = 12-10 rank = commemoration colour = red name.en = St. Melchiades +name.pl = św. Melchiadesa, Papieża i Męczennika [damasus-i] date = 12-11 rank = class-3 colour = white name.en = St. Damasus I +name.pl = św. Damazego, Papieża i Wyznawcy reading.first = 1 Pet 5:1-4; 5:10-11. reading.gospel = Matt 16:13-19 @@ -2320,6 +2647,7 @@ date = 12-13 rank = class-3 colour = red name.en = St. Lucy +name.pl = św. Łucji, Dziewicy i Męczennicy reading.first = 2 Cor 10:17-18; 11:1-2 reading.gospel = Matt 13:44-52. @@ -2328,6 +2656,7 @@ date = 12-16 rank = class-3 colour = red name.en = St. Eusebius +name.pl = św. Euzebiusza, Biskupa i Męczennika reading.first = 2 Cor. 1:3-7 reading.gospel = Matt 16:24-27. @@ -2336,6 +2665,7 @@ date = 12-21 rank = class-2 colour = red name.en = St. Thomas +name.pl = św. Tomasza, Apostoła reading.first = Eph 2:19-22 reading.gospel = John 20:24-29 @@ -2344,6 +2674,7 @@ date = 12-24 rank = class-1 colour = violet name.en = Vigil of Christmas +name.pl = Wigilia Bożego Narodzenia reading.first = Rom 1:1-6 reading.gospel = Matt 1:18-21 @@ -2352,6 +2683,7 @@ date = 12-26 rank = class-2 colour = red name.en = St. Stephen +name.pl = św. Szczepana, Pierwszego Męczennika reading.first = Acts 6:8-10; 7:54-59 reading.gospel = Matt 23:34-39 @@ -2360,6 +2692,7 @@ date = 12-27 rank = class-2 colour = white name.en = St. John the Evangelist +name.pl = św. Jana, Apostoła i Ewangelisty reading.first = Ecclus 15:1-6 reading.gospel = John 21:19-24 @@ -2368,17 +2701,20 @@ date = 12-28 rank = class-2 colour = red name.en = Holy Innocents +name.pl = Świętych Młodzianków reading.first = Apoc 14:1-5 reading.gospel = Matt 2:13-18 [thomas-becket] date = 12-29 -rank = class-4 +rank = commemoration colour = red name.en = St. Thomas Becket +name.pl = św. Tomasza z Canterbury, Biskupa i Męczennika [silvester] date = 12-31 -rank = class-4 +rank = commemoration colour = white name.en = St. Silvester +name.pl = św. Sylwestra I, papieża i wyznawcy diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go index 09cadbd..11fd6ca 100644 --- a/internal/calendar/precedence_ef_repro_test.go +++ b/internal/calendar/precedence_ef_repro_test.go @@ -120,3 +120,41 @@ func TestVigilOfChristmasSurvivesAdventSunday(t *testing.T) { } } } + +// TestPurificationBeatsFebruarySunday: the fixture behind classOf's own +// Purification decision (scripts/gen-sanctoral-ef.go), committed here rather +// than left as an assertion only, because the deciding years (2 February on +// a Sunday: 2014, 2020, 2025, 2031, 2042, 2048) fall entirely outside this +// repo's own missalemeum oracle snapshot (sources/snapshot.tar.gz, +// 2026-01-01 .. 2027-12-31), so nothing else in this repository can +// reproduce the evidence classOf's decision rests on. (2036, sometimes +// quoted alongside 2025/2031 as a third example: 2 February 2036 is in fact +// a SATURDAY, `date -d 2036-02-02 +%A` -- checked here rather than repeated; +// 2042 is the correct next instance after 2031.) +// +// RG 91 entry 14 ("Festa Domini II classis") sits above entry 15 +// ("Dominicae II classis"), which sits above entry 16 ("Festa II classis +// Ecclesiae universae, quae non [sunt Domini]") -- entry 14 takes an +// occurring Sunday's place outright, entry 16 is merely commemorated on +// one. The Purification (2 February) matches entry 14's pattern, not entry +// 16's, independently fetched live from missalemeum for five different +// Sundays: 2014-02-02, 2020-02-02, 2025-02-02, 2031-02-02, 2042-02-02 (all +// "id":"sancti:02-02:2:w", "commemorations":[]). Control: +// nativity-of-the-blessed-virgin-mary (8 September, an undisputed ordinary +// Marian feast, entry 16's own pattern) on a Sunday -- 2019-09-08 -- shows +// the SUNDAY observed, the feast commemorated instead: the opposite shape, +// proving the Purification's own treatment is a deliberate pattern in the +// oracle, not a gap. This is a decision AGAINST the calendarium's own title +// ("IN PURIFICATIONE B. MARIAE VIRG.") and RG 120(b) (which files 2 +// February under the white-colour rule's "B. Mariae Virg." heading, kept +// separate from 120(a)'s "Domini" heading) -- both point BVM; the +// occurrence-behaviour evidence here points Domini. See classOf's own doc +// comment for the fuller account; not re-argued here. +func TestPurificationBeatsFebruarySunday(t *testing.T) { + for _, year := range []string{"2014", "2020", "2025", "2031", "2042"} { + day := efCompute(year + "-02-02") + if day.Observed.Slug != "purification-of-the-blessed-virgin-mary" { + t.Errorf("%s-02-02 observed = %q want purification-of-the-blessed-virgin-mary (RG 91 entry 14 beats entry 15)", year, day.Observed.Slug) + } + } +} diff --git a/scripts/gen-sanctoral-ef.go b/scripts/gen-sanctoral-ef.go index 75ee70d..0812472 100644 --- a/scripts/gen-sanctoral-ef.go +++ b/scripts/gen-sanctoral-ef.go @@ -10,8 +10,10 @@ // (Lectio) and Gospel (Evangelium) citations, plus any sancti co-celebrations // listed as commemorations. Several reference years are tried per date so a // saint whose date is a Sunday (or under a higher feast) in one year is still -// captured, observed with its own readings, from another. Existing Latin names -// in the file are preserved (missalemeum has no Latin titles). +// captured, observed with its own readings, from another. Existing +// non-English names (Polish, Latin, or any other language already present +// in the file) are preserved verbatim -- missalemeum supplies English +// titles only. // // One-time; requires network. Run from the repo root: // @@ -123,32 +125,54 @@ func rankOf(n int) calendar.Rank { // this function produced -- but "purification" is a THIRD, DELIBERATELY // DIFFERENT case, kept matching rather than narrowed, and the reason is // itself worth recording: +// // - "purification" IS kept as a lord match, even though the calendarium's // own title is "IN PURIFICATIONE B. MARIAE VIRG." (a feast of the BLESSED -// VIRGIN by name). The tag's actual job here is not naming/colour -// categorisation -- it exists solely to drive the occurrence rule -// ("a II-class feast of the Lord takes an occurring Sunday's place -// outright"), and on THAT question the calendarium's title is not the -// decisive evidence: missalemeum -- the same oracle this generator's own -// data is bootstrapped from -- shows the Purification taking a II-class -// Sunday's place OUTRIGHT with commemorations EMPTY (confirmed live, -// 2014-02-02, 2020-02-02, 2025-02-02), the exact "festum Domini" pattern, -// not the ordinary-BVM-feast pattern (control: the Nativity of the BVM, -// 8 September, on a Sunday -- 2019-09-08 -- shows the SUNDAY observed, -// the feast merely commemorated, the opposite shape). An earlier version -// of this comment (and this codebase) untagged it on the calendarium's -// title alone; that was reversed after the same live check colitur's own -// review independently ran (colitur git history: cab8b07 retags it BVM, -// then 7d3b5ec reverses that "follow the oracle... a different project -// could reasonably rule the other way on the same evidence" -- recorded -// as a genuinely contested point, not a clean-cut error, but the -// occurrence-behaviour evidence is what this tag is FOR). +// VIRGIN by name) -- a DECISION AGAINST that primary text, made on +// occurrence-behaviour evidence, not a reading of it, and recorded as +// such rather than dressed up as textually clean. +// +// The tag's actual job is not naming/colour categorisation: it exists +// solely to drive the occurrence rule that separates RG 91 entry 14 +// ("Festa Domini II classis" -- takes an occurring II-class Sunday's +// place outright) from entry 16 ("Festa II classis Ecclesiae universae, +// quae non [sunt Domini]" -- merely commemorated on one), entry 15 +// ("Dominicae II classis") sitting between the two. Checked live against +// missalemeum (this generator's own data source): the Purification +// takes a II-class Sunday's place OUTRIGHT, commemorations EMPTY +// (2014-02-02, 2020-02-02, 2025-02-02, 2031-02-02, 2042-02-02, all +// fetched independently) -- entry 14's pattern, not entry 16's (control: +// the Nativity of the BVM, an undisputed ordinary Marian feast, on a +// Sunday -- 2019-09-08 -- shows the SUNDAY observed, the feast merely +// commemorated, entry 16's own pattern). RG 112(b), "Officium, Missa aut +// commemoratio de dominica excludit commemorationem... de festo vel +// mysterio Domini, et vicissim" (a Sunday's office and a feast/mystery +// OF THE LORD mutually exclude each other as commemorations), backs the +// empty commemoration list independently of RG 91's table position. +// +// Genuine primary-text counter-evidence exists and is not discarded: +// RG 120(b), "Adhibetur color albus... b) B. Mariae Virg., etiam in +// benedictione et processione candelarum die 2 februarii" -- 2 February +// is filed under the WHITE-colour rule's "B. Mariae Virg." heading, +// kept separate there from 120(a)'s own "Domini" heading. Both textual +// tests available (the calendarium's title, RG 120's own taxonomy) +// point BVM; the occurrence-behaviour evidence points Domini. This is a +// live, acknowledged disagreement with the primary text on the +// strength of oracle evidence about what the day actually DOES, not a +// claim that the text is wrong or ambiguous. See +// internal/calendar/precedence_ef_repro_test.go's +// TestPurificationBeatsFebruarySunday for the fixture this rests on -- +// committed, not merely asserted, since the deciding years (2 February +// on a Sunday) fall outside this repo's own 2026-2027 oracle snapshot +// window. +// // - "holy name" alone is ambiguous: it matches BOTH "Holy Name of Jesus" // (a feast of the Lord) and "Most Holy Name of Mary"/"Holy Name of Mary" // (a feast of the BVM, calendarium: "Sanctissimi Nominis Mariae") -- // wrongly matching the latter too. Excluded whenever the title also // names Mary. Unlike the Purification, this one is NOT contested: its // occurrence behaviour matches the ordinary-BVM pattern too. +// // - "baptism" is a new case: "Commemoration of the Baptism of the Lord" (13 // January, calendarium: "IN COMMEMORATIONE BAPTISMATIS D. N. I. C.") did // not match any existing case -- the HasSuffix check below requires "of @@ -240,9 +264,16 @@ func fetch(date string) (*mmDay, error) { } type entry struct { - slug, date, colour, class, en, la, first, gospel string - rank calendar.Rank - observed bool // has readings / reliable rank + slug, date, colour, class, en, first, gospel string + rank calendar.Rank + observed bool // has readings / reliable rank + // otherNames holds every "name." field already present in the + // existing file for this slug, EXCLUDING "name.en" (English always + // comes fresh from missalemeum, in `en` above). Keyed by the full + // field name (e.g. "name.pl") so main() can emit it verbatim without + // hardcoding a language list -- see main()'s own preservedNames + // comment for why a hardcoded list is exactly the bug this fixes. + otherNames map[string]string } // idParts splits "sancti:MM-DD[sfx]:RANK:COLOUR" into rank word and colour word. @@ -300,21 +331,25 @@ func readingsFrom(d *mmDay) (first, gospel string) { return } -// knownSpuriousComm excludes specific missalemeum commemorations, keyed -// "MM-DD/slug", that the 1962 calendarium's own row for that date does NOT -// support -- confirmed by checking the primary text directly, not inferred. -// 9 August's row reads only "Vigilia, III classis.", with no "Com." line, so -// missalemeum's own "St. Romanus" commemoration that day has no calendarium -// backing. This is a genuine upstream (missalemeum) data quirk, not something -// derivable from the API response itself, so it is recorded here rather than -// silently reproduced -- see the report for the primary-source citation. -var knownSpuriousComm = map[string]bool{ - "08-09/romanus": true, - // 14 August's row in the calendarium reads only "Vigilia, II classis.", - // no "Com." line; the genuine St Eusebius (Bishop and Martyr) is - // commemorated 16 December instead, where he is correctly present. - "08-14/eusebius": true, -} +// PRIMARY-SOURCE NOTE (found and corrected during review): of the three +// local scans this generator's citations are checked against +// (docs/research/*.pdf in the sibling colitur repo), ONE -- +// "1962-06-23,…LT.pdf", the Archivum Liturgicum ELECTRONIC TRANSCRIPTION -- +// silently drops vigil commemorations that the other two, PHOTOGRAPHIC +// scans of the actual 1962 Missale Romanum, both carry. Confirmed on four +// entries: 7 August (Donatus), 9 August (Romanus), 14 August (Eusebius), +// 25 December (Anastasia) -- all present in both photographic scans' +// calendarium AND their own Proprium Sanctorum text ("Et fit +// commemoratio S. Romani Mar-", "...S. Eusebii Con-", etc.), all silently +// absent from the transcription. A `knownSpuriousComm` exclusion list once +// stood here, built by checking ONLY the transcription and concluding two +// of these four ("Romanus", "Eusebius" on 14 August) were spurious -- WRONG, +// on evidence that itself was incomplete, not on a genuine absence. Treat +// the photographic scans as the primary source and the electronic +// transcription as a convenience index only; where they disagree, the scan +// wins. (14 August's "St. Eusebius, Conf." and 16 December's "St. Eusebius, +// Ep. et Mart." are two different people, both genuinely in the calendarium +// -- see slugOverride below, not a reason to drop either.) // slugOverride gives a proper, distinct slug to a small number of // commemorations whose title slugifies IDENTICALLY to an unrelated feast on @@ -323,44 +358,73 @@ var knownSpuriousComm = map[string]bool{ // feast (the same saint, repeated, not a coincidence); 14 May's "St. // Boniface" is a different early martyr from 5 June's Boniface of Mainz, an // entirely different person whose title happens to abbreviate to the same -// English string. Keyed "MM-DD/original-slug" -> replacement slug. +// English string; 14 August's "St. Eusebius" (a Confessor, calendarium "S. +// Eusebii Conf.") is likewise a different person from 16 December's "St. +// Eusebius" (a Bishop and Martyr, calendarium "S. Eusebii Ep. et Mart."), +// both genuinely commemorated, missalemeum giving both the same bare +// English title. Keyed "MM-DD/original-slug" -> replacement slug. var slugOverride = map[string]string{ "01-28/agnes": "agnes-secundo", + "08-14/eusebius": "eusebius-confessor", "05-14/boniface": "boniface-martyr", } -// refYearExplainsAbsence reports whether the TEMPORAL day alone (no -// sanctoral data at all -- an empty layer stack) on this specific reference -// date was already strong enough that ANY class-1..4 saint would lose there -// regardless of its own merit: a Sunday or a named I/II-class feast, an -// Ember day, the late-Advent or Christmas-octave privilege (I or II class), -// or a privileged Lent/Passiontide feria (III class, but still privileged -// over an equal-or-lower-class saint per RG 109(e)). +// refYearExplainsAbsence is a RANK-BLIND SAMPLING HEURISTIC, not a rubric +// evaluator: it does not know, and cannot know, the true class of the saint +// it is being asked about -- only whether the TEMPORAL day alone (no +// sanctoral data at all) on this one reference date looks privileged enough +// that a saint failing to win there is unsurprising. It reports true for: a +// Sunday or a named I/II-class feast, an Ember day, the late-Advent or +// Christmas-octave privilege (I or II class), or a Lent/Passiontide feria +// (III class, privileged per RG 109(e)). +// +// Two known imprecisions, recorded rather than silently accepted: // -// This is the discriminator between two different reasons a saint is never -// OBSERVED in any of the six reference years: +// - The Lent/Passiontide branch is privilege over an EQUAL-OR-LOWER-class +// candidate only -- RG 109(e) does not let a mere III-class feria beat a +// I- or II-class feast. Nothing in this codebase's actual data currently +// exercises that gap (every saint this heuristic has ever been asked +// about that is demoted throughout Lent is independently III class or +// lower, per the calendarium), but the function does not itself enforce +// it, so a future entry could reach it. +// - It is a proxy for "why was this saint never observed", not a citation. +// 6-31 December is excluded from ever trusting the id-derived rank +// below, REGARDLESS of what this heuristic would otherwise say, because +// RG 68(d)/(e) settles two specific cases (Thomas Becket, 29 December; +// Silvester, 31 December) directly: the calendarium's own row names +// each a bare "Commemoratio" with NO class of its own, even though the +// DAY they fall on is II class (a day within the Nativity Octave). A +// rank-blind heuristic reading the day's own class here would (and, +// before this exclusion, did) wrongly conclude "the day was strong +// enough to explain the demotion, so the id's rank is trustworthy" -- +// right about the day, wrong about what the rubric actually says about +// THESE two named commemorations specifically. // -// 1. Genuinely without an independent Mass in the 1960-reformed books -- -// reduced to an added commemoration on ANY day, including an ordinary, -// unprivileged one. Confirmed live: St Blaise (3 Feb, an ordinary -// Septuagesima-season feria, non-privileged), St Canute (19 Jan, an -// ordinary Time-after-Epiphany feria) and others are shown by -// missalemeum as mere commemorations even then -- this is real 1962 -// data, not a sampling artefact, and RankCommemoration is the correct, -// honest rank for them. -// 2. A real class-1..4 feast that merely never won in these six -// PARTICULAR reference years because its fixed date happens to fall, -// in every one of them, on a day already strong enough to beat any -// saint of its class -- the 15-entry, 6 March-5 April case this fix -// originally targeted (every one of those dates falls within Lent in -// all six reference years). Here the id's own embedded rank is -// trustworthy. +// The 6-31 December exclusion is also a warning about a structural hazard, +// not just a one-off fix: this function calls calendar.Compute, i.e. it +// reads the ENGINE's OWN computed temporal ranks to decide what DATA to +// generate. A change to temporal_ef.go's ranking (e.g. promoting 26-31 +// December from class-4 to class-2, RG 67/68, landed in this same lineage) +// can silently flip this function's verdict and rewrite generated data with +// no code change to this file at all. Any future temporal_ef.go rank change +// should re-check this function's own boundary cases, not just its own +// tests. // // harvestDate keeps a saint's commemoration id rank ONLY if every reference -// year in which it was seen was case 1 above (i.e. this function returned -// true every time) -- a single unprivileged-day counter-example is enough -// to fall back to RankCommemoration. +// year in which it was seen returned true here -- a single false (an +// unprivileged day, or the December exclusion) is enough to fall back to +// RankCommemoration, the safe default (see St Blaise, whose own +// commemoration id claims rank 4 and is still correctly overridden to +// RankCommemoration, proving the id's rank is a candidate, not a verdict -- +// see the call site's own comment). func refYearExplainsAbsence(date time.Time) bool { + if date.Month() == time.December && date.Day() >= 26 && date.Day() <= 31 { + // RG 68(d)/(e): "die 29 decembris, fit commemoratio S. Thomae + // Episcopi et Mart.; die 31 decembris, fit commemoratio S. + // Silvestri I Papae et Conf." -- both named as a bare + // "Commemoratio", no class. See this function's own doc comment. + return false + } sel := calendar.DefaultSelection() sel.Form = "old" day := calendar.Compute(date, sel, nil) @@ -422,7 +486,7 @@ func harvestDate(mmdd string) (*entry, []entry) { continue // a transferred feast's commemoration, not a genuine one for THIS date } slug := slugify(c.Title) - if slug == "" || knownSpuriousComm[mmdd+"/"+slug] { + if slug == "" { continue } if t, ok := commTrack[slug]; ok { @@ -431,14 +495,18 @@ func harvestDate(mmdd string) (*entry, []entry) { } continue // title/colour/id-rank already captured from the first sighting } - // The COMMEMORATION object's own id names THAT SAINT's true rank - // (unlike the DAY's own info.id, which names the rank of whatever + // The COMMEMORATION object's own id is a BETTER rank signal than + // the DAY's own info.id (which names the rank of whatever // propers are reused that day, not the commemorated saint's) -- - // idParts already extracts it; only the colour half used to be - // kept. Whether this rank is actually TRUSTED depends on - // `explained` across every year this slug is seen -- resolved - // after the year loop, see refYearExplainsAbsence's own doc - // comment. + // but "better" is not "always correct": St Blaise's own + // commemoration id is "sancti:02-03:4:r" (rank 4), and he is + // still, correctly, ruled RankCommemoration below, because he + // has no independent Mass at all in the 1960 books, not because + // his id's rank is wrong. The id's rank is a CANDIDATE value, + // trusted only when refYearExplainsAbsence's heuristic finds no + // counter-evidence across every reference year this slug is + // seen -- see that function's own doc comment for what the + // heuristic actually checks and its known limits. rank, col := idParts(c.ID) commTrack[slug] = &commTracker{ entry: entry{slug: slug, date: mmdd, colour: col, en: c.Title, rank: rank}, @@ -497,11 +565,34 @@ func harvestDate(mmdd string) (*entry, []entry) { } func main() { - // Existing Latin names to preserve (missalemeum has no Latin titles). - la := map[string]string{} + // preservedNames holds every "name." field already present in the + // existing file, keyed by slug then by the full field name -- EVERY + // language missalemeum does not itself supply (it has English titles + // only), not a hardcoded whitelist of one or two. A whitelist is + // exactly the bug this replaces: an earlier version of this generator + // preserved only name.la, and -- unnoticed, because the bootstrapped + // file has in fact never carried a name.la value at all, so that + // mechanism was silently inert from the start -- name.pl had no + // preservation mechanism whatsoever. A regeneration deleted all 322 + // Polish names outright (measured: name.pl 322 -> 0), reaching + // mobile.Day(date, "ef", version, "pl") -- a shipped dlectio entry + // point -- on the app's next build, with `naming.CelebrationName`'s own + // name[lang] -> name.en fallback silently substituting English and no + // error anywhere. Generalising to every "name.*" key except name.en + // (English is always freshly regenerated from missalemeum, the whole + // point of this tool) means a third, fourth, or Nth language added to + // the file later survives a regeneration without this function ever + // needing to change again. + preservedNames := map[string]map[string]string{} for slug, rc := range caldata.Tridentine().Cels { - if v := rc.Fields["name.la"]; v != "" { - la[slug] = v + for k, v := range rc.Fields { + if v == "" || !strings.HasPrefix(k, "name.") || k == "name.en" { + continue + } + if preservedNames[slug] == nil { + preservedNames[slug] = map[string]string{} + } + preservedNames[slug][k] = v } } @@ -580,9 +671,7 @@ func main() { es := make([]entry, 0, len(entries)) for _, e := range entries { - if l := la[e.slug]; l != "" { - e.la = l - } + e.otherNames = preservedNames[e.slug] es = append(es, e) } sort.Slice(es, func(i, j int) bool { @@ -599,7 +688,9 @@ func main() { b.WriteString("; by internal/calendar (temporalEF) and is NOT listed here.\n") b.WriteString("; Ranks use the 1960 Code of Rubrics: class-1..class-4.\n") b.WriteString("; Generated by scripts/gen-sanctoral-ef.go from missalemeum (Divinum Officium 1962\n") - b.WriteString("; data). Latin names are hand-curated where present. See NOTICE.\n\n") + b.WriteString("; data). name.en is always regenerated fresh from missalemeum; every other\n") + b.WriteString("; name. (missalemeum supplies English only) is preserved verbatim from\n") + b.WriteString("; whatever this file already carried before regeneration. See NOTICE.\n\n") b.WriteString("[layer]\nid = tridentine\nname = General Roman Calendar of 1962\ntype = universal\n") for _, e := range es { fmt.Fprintf(&b, "\n[%s]\ndate = %s\nrank = %s\ncolour = %s\n", e.slug, e.date, e.rank, e.colour) @@ -607,8 +698,13 @@ func main() { fmt.Fprintf(&b, "class = %s\n", e.class) } fmt.Fprintf(&b, "name.en = %s\n", e.en) - if e.la != "" { - fmt.Fprintf(&b, "name.la = %s\n", e.la) + otherKeys := make([]string, 0, len(e.otherNames)) + for k := range e.otherNames { + otherKeys = append(otherKeys, k) + } + sort.Strings(otherKeys) // deterministic output regardless of map iteration order + for _, k := range otherKeys { + fmt.Fprintf(&b, "%s = %s\n", k, e.otherNames[k]) } if e.first != "" { fmt.Fprintf(&b, "reading.first = %s\n", e.first) -- cgit v1.3