aboutsummaryrefslogtreecommitdiff
path: root/internal/caldata/tridentine-lectionary.ini
Commit message (Collapse)AuthorAgeFilesLines
* feat(ef): the Most Holy Name of Jesus, and the ferias of 2-5 JanuaryLukasz Kasprzak2026-08-181-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | RG 17(a): "festum Ss.mi Nominis Iesu, celebrandum dominica quae occurrit a die 2 ad 5 ianuarii, secus die 2 ianuarii." The Most Holy Name is kept on the Sunday falling 2-5 January and, when no Sunday falls in that window, on 2 January instead. lectio built neither shape, so the day was an ordinary Sunday within the octave and read Gal 4:1-7. The FALLBACK matters more than it looks. The window is four days wide, so in about three years in seven no Sunday lands in it -- in those years there was no Holy Name office at all, a missing II-class feast rather than a misnamed one. The test pins both shapes, checks the fallback does NOT also fire in a year where the Sunday carries the feast, and asserts across 2005-2050 that every year gets it exactly once by one shape or the other. Separately, the ferial days of that window get their own Mass. The Missal's rubric at the feast says it directly: "Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii" -- the Circumcision's Mass, Titus 2:11-15 / Luke 2:21. They had been falling through to the Sunday within the octave. Ferial only, and the exclusions are the interesting part: the Sunday carries the Holy Name and its own Mass, and an unoccupied Saturday carries Our Lady's office and hers. 3 January 2026 is such a Saturday and correctly reads Titus 3:4-7, not 2:11-15 -- which works because the BVM check runs first. All four days of 2-5 January 2026 now match colitur.
* fix(ef): Passion week and Holy Week are two weeks, not oneLukasz Kasprzak2026-08-181-18/+62
| | | | | | | | | | | | | | | | | | | | | | efWeek had no Passiontide case, so both weeks fell through to 0 and every day of Holy Week took the slug of its Passion-week namesake: ef-passiontide-0- monday served both Passion Monday and Holy Monday. The two weeks therefore shared one set of readings and Holy Week could not have its own -- Good Friday was reading Passion Friday's Mass. Numbered from Passion Sunday now, so the weeks are 1 and 2 and the slugs distinguish them. The six ef-passiontide-0-* sections are replaced by colitur's twelve rather than renamed, and the reason is worth recording: they were not simply Passion week's Masses. The Tuesday section carried HOLY Tuesday's (Jer 11:18-20 with the Passion according to Mark), which was Passion Tuesday's only by the same collision -- colitur documents that specific mix-up and its own correction of it. Renaming 0 to 1 would have kept the wrong Mass on Passion Tuesday while looking like a clean migration. All twelve are colitur's, verified there against both photographic scans. All six days of Holy Week now match colitur, and so does Passion Tuesday.
* fix(ef): twelve days were serving the preceding Sunday's MassLukasz Kasprzak2026-08-181-0/+62
| | | | | | | | | | | | | | | | | | | | | | Corpus Christi, the Sacred Heart, and the ferias of the first week after Epiphany and the first week after Pentecost had no lectionary entry, so each fell through the walk-back and read the Mass of the Sunday before it. Corpus Christi -- a I-class feast with one of the best-known formularies in the Missal -- was reading Trinity Sunday's. RG 299 is why the first weeks need naming where the others do not: "Item propriam Missam habent omnes feriae..." -- those ferias have proper Masses, and the walk-back that serves the rest of the year correctly is wrong for them. Citations are colitur's, verified there against both photographic scans. They were added rather than derived: a comparison of the two lectionaries found the 110 shared slugs agree on EVERY citation, so the divergence was entirely entries lectio lacked, not entries it had wrong. Twelve of the 43 colitur has and lectio lacked. The other 31 name days lectio calls something else, so adding them verbatim would be dead data; those need the slug question answered first and are deliberately not touched here.
* docs(caldata): the EF data is no longer purely generated -- say soLukasz Kasprzak2026-08-181-0/+15
| | | | | | | | | | | | | | | | | | | Both ini headers described this data as generated from missalemeum, and the generator described its own output as the file. Neither is true since the eight corrections landed, and the gap is not cosmetic: missalemeum does not carry any of them, so running scripts/gen-sanctoral-ef.go would silently revert all four calendar fields, with nothing to notice it. The two ini headers and the generator's own doc comment now each carry the list of hand-corrected fields, the rubric behind each, and the warning that a regeneration reverts them. Deliberately repeated in both places rather than cross-referenced from one: either can rot, and repeating the list means the other still shows it. Also records what the six allow-listed oracle days actually mean now. The oracle is not wrong to flag them -- missalemeum is simply the party that disagrees with the Missal, which is a different situation from the one that test was written for.
* fix(ef): adopt eight corrections from colitur, with their citationsLukasz Kasprzak2026-08-181-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | lectio's EF data has been the upstream for colitur, whose data was bootstrapped from this ini. colitur has since validated that data against the 1962 Missal itself, and these eight fields are where the two now disagree and the Missal decides against us. Each carries the rubric. Calendar. St Ubaldus (16 May) and St Didacus (13 November) become III-class feasts rather than commemorations: the Missal's own universal calendarium ranks both "III classis" outright with no commemoration rubric, and each has its own Mass entry in the Proprium taking its readings from a Common with only its Oratio proper -- which a bare commemoration never has. Found by auditing all 290 of colitur's fixed-date entries against that calendarium; these two were the only status defects in the file. The Vigil of the Assumption becomes violet from white and the Vigil of St Lawrence violet from red: RG 128 gives violet to vigils of II and III class outside Paschaltide, and its sole exception is the Ascension's vigil, inside Paschaltide, which is white and is untouched here. Lectionary. Both Ember Saturdays carried the wrong saint's Mass entirely -- St Thomas the Apostle's under ef-advent-ember-sat and St Matthew's under ef-september-ember-sat, in both cases because 21 December and 21 September fall on a Saturday in the same six years and a bootstrap generalised one year's coincidence into a template value. Two oracle allow-list entries, both placed ahead of the BVM-Saturday entry deliberately. When 16 May or 13 November falls on a Saturday, that entry's predicate also matches and would absorb the divergence under a reason no longer true of it -- it says both engines agree the day is unimpeded, and the point here is that the day IS impeded. The vigil entry excludes Sundays for the mirror reason: RG 33 omits a vigil falling on one, and without the guard 2026-08-09 is stolen from the RG 33 entry that actually explains it. Six days of the 730-day oracle window are affected. Readings are untouched by that test, so the two lectionary corrections cost it nothing.
* caldata: the Lenten Ember days were serving Lent I Sunday's MassLukasz Kasprzak2026-08-171-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Three lectionary sections were keyed ef-lent-1-{wednesday,friday,saturday} while temporal_ef.go's efEmberSlug computes ef-lent-ember-{wed,fri,sat}. The lookup in caldata.Readings takes the observed slug and has no alias table, so it missed the entries entirely and fell through to the preceding-Sunday fallback. Every Lenten Ember day since the data was added has served Lent I Sunday's Mass -- three days a year, in a season that prints a proper Mass daily. The values were already right; only the keys were wrong, and they were stale rather than mistaken: they predate Lent being added to efEmberSlug, and scripts/genlect.go keys off day.Observed.Slug, so re-running it would already write the correct names. Advent and September were never affected -- both already use the -ember- form. Renamed, and verified the whole file: every one of the 119 section names is now a slug the calendar actually computes, checked by sweeping 2005-2050. Those three were the only dead keys. Added TestEFLectionaryKeysAreReachableSlugs to make the class detectable rather than just this instance. Mutation-tested: reverting the three keys fails it, naming all three. Found by differencing against colitur, the sibling OCaml engine, while giving it a lectionary of its own. Worth recording how nearly it escaped: colitur inherited the same wrong keys from this file during its bootstrap, so both engines produced the same wrong Mass and the differential between them was silent. It only surfaced when colitur's data was checked against the Missal itself. Two implementations agreeing is not evidence when one was seeded from the other.
* fix(EF): resumed Sundays after Pentecost use the Epiphany MassesLukasz Kasprzak2026-07-281-14/+2
| | | | | | | | | | | In early-Easter years there are more than 24 Sundays after Pentecost. Per the 1960 Rubrics the surplus Sundays resume the Sundays after Epiphany that Septuagesima cut short (highest-numbered first) and the last Sunday keeps the 24th (Last) Mass. temporalEF now routes those Sundays to the resumed Epiphany slug for readings while keeping the calendrical time-after-pentecost season; the mis-harvested tail entries (post-Pentecost sundays 24-28) are corrected to the true 24th Mass and the surplus removed. Validated: 88/88 tail/resumed Sunday gospels match missalemeum 2025-2050; EF oracle green.
* fix(EF): fill reading gaps (major feasts, feria-repeat-through-feast, sundays)Lukasz Kasprzak2026-07-281-0/+20
| | | | | | | | | | | | | | | | EF readings had ~1.8% of days with no readings (major feasts falling back to the wrong Sunday, feria-repeats broken when the preceding Sunday was a feast). Now 0 gaps over 9496 days (2025-2050); reading correctness spot-checks match missalemeum except the resumed-Epiphany-Sunday edge (next commit). - calendar.TemporalSlug: the green-season weekday-repeats-the-Sunday rule uses the Sunday's TEMPORAL slug, so a Monday still finds its Sunday Mass when that Sunday was displaced by a feast (e.g. the Purification on Feb 2). - Add the missing EF temporal Masses (from missalemeum): the Nativity Day Mass (Heb 1:1-12 / John 1:1-14), Epiphany (Isa 60:1-6 / Matt 2:1-12), the Octave Day of Christmas (Titus 2:11-15 / Luke 2:21), the 6th Sunday after Epiphany (1 Thess 1:2-10 / Matt 13:31-35), and the last Sunday after Pentecost (Col 1:9-14 / Matt 24:15-35).
* feat: complete OF+EF calendar coverage (movable feasts, vigils, ember days, ↵Lukasz Kasprzak2026-07-281-133/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | transfers) Ordinary Form: - Add the movable Marian memorials that have no fixed date: Mary, Mother of the Church (Monday after Pentecost) and the Immaculate Heart (Saturday after the Sacred Heart), computed in computeOF. - General Norms 60: two coinciding obligatory memorials both become optional and the ferial is observed -- except Mary, Mother of the Church, which keeps precedence per its 2018 decree. Extraordinary Form: - Capture fixed-date vigils in the sanctoral harvest (Christmas, the Nativity of St John the Baptist, Sts Peter & Paul, St Lawrence, the Assumption, All Saints, the Immaculate Conception) -- previously filtered out. - temporalEF: the movable vigils of the Ascension (I class eve) and Pentecost (Whitsun Eve), and the September/Advent Ember days (II class violet ferias). - transferIfImpededEF: the Annunciation transfers past Holy Week/the Easter octave to the Monday after Low Sunday; All Souls moves to Nov 3 when Nov 2 is a Sunday. - genlect harvests proper Masses for the new Ember/vigil days. Adds TestEFCoverage + TestOFMovableMemorials. Bumps to 0.39.0. Verified per-day: OF 0 real errors vs calapi (2026-2028, 100% correct-observed); EF 0 real errors vs missalemeum (2025-2027), residual = deep-tail vigil-occurrence and St Joseph Passiontide-transfer edges (~1-2 days/yr, documented).
* feat(ef): complete offline EF readings — proper ferias, deuterocanon, ↵Lukasz Kasprzak2026-07-271-1/+353
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Latin fallback Finish the Extraordinary Form (1962) offline Mass readings so every day of the year resolves in both English and Polish. Temporal engine (temporal_ef.go): - Unique ferial slugs "ef-<season>-<week>-<weekday>" so penitential-season weekdays (Lent, Advent, Passiontide, Easter octave) can key their own proper Masses; green-season ferias have no entry and fall back to the preceding Sunday (the 1962 rule). - Special "ef-lent-after-ashes-<weekday>" case for the days between Ash Wednesday and Lent I, which have their own propers. Lectionary (tridentine-lectionary.ini, 55 -> 143 entries) via genlect.go: - Generator now fetches proper-season weekdays and stores a feria only when its Mass differs from the preceding Sunday's. - cleanCite() normalises two missalemeum data glitches: a stray comma between book and chapter ("4 Kings, 5:1" -> "4 Kings 5:1") and a period-as-separator ("John 20. 19-31" -> "John 20:19-31"), both guarded so legitimate multi-chapter citations are untouched. Citations & corpora: - books.ini: Douay abbreviations in the [en] dialect (Ex, Ezech, Jonas, and 3/4 Kings -> canonical 1/2 Kings), so the EF Lenten epistles resolve while the display keeps modern sigla. - drb.tsv: +205 rows backfilling the deuterocanonical Daniel 13-14 (Susanna, Bel) and Esther 11-16 (Greek additions) from get.bible douayrheims, which the base corpus omitted; scripts/gen-deutero.py documents the fetch. Rendering (liturgy.go): - readingLine() falls back to the Latin Vulgate (complete) when the vernacular corpus lacks a passage, with a clear note. Covers the Polish Wujek deuterocanon gap (no clean public-domain source exists) and any future vernacular gap; faithful to the EF as a Latin rite. Result: 730/730 days resolve for both EN (native) and PL (native + Latin fallback for 3 deuterocanon days). Version 0.32.0 -> 0.33.0.
* feat: EF temporal Sunday lectionary (offline Sunday Mass readings)Lukasz Kasprzak2026-07-271-0/+222
Unique temporal-day slugs (season-sunday-week); scripts/genlect.go generates tridentine-lectionary.ini from missalemeum keyed by slug (55 entries: the Sundays of the whole EF year). caldata.TemporalReadings(form,slug) lookup; --liturgy resolves proper-of-feast else the temporal cycle and renders the text. bible.ParseRef strips abbreviation dots (1 Cor. -> 1 Cor). 52/53 Sundays fully resolve offline.