aboutsummaryrefslogtreecommitdiff
path: root/internal/calendar/temporal_ef_test.go
Commit message (Collapse)AuthorAgeFilesLines
* feat(ef): the Most Holy Name of Jesus, and the ferias of 2-5 JanuaryLukasz Kasprzak2026-08-181-0/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | 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-0/+26
| | | | | | | | | | | | | | | | | | | | | | 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.
* feat(ef): Rogation Monday and Tuesday (RG 87)Lukasz Kasprzak2026-08-181-0/+34
| | | | | | | | | | | | | | | | | | | | | | | | RG 87: "Litaniae minores seu Rogationes, per se, assignantur feriis II, III et IV ante festum Ascensionis Domini." Easter+36 and +37 are that Monday and Tuesday. RG 128(d) gives them violet -- "for the procession and Mass of the Greater and Lesser Litanies" -- a penitential note inside white Paschaltide. lectio computed no Rogation days at all and showed a plain paschaltide feria. The WEDNESDAY is deliberately not built, and the test asserts its absence. Easter+38 is by construction the Vigil of the Ascension, II class, which wins the day outright; what the rubric asks for there is a COMMEMORATION, and this function returns one office per day. colitur reaches it through a movable-date entry in its sanctoral overlay. Extending the Rogation branch to +38 to "complete" the rubric would silently displace the Vigil, so the test pins the Vigil rather than leaving the omission to a comment. Rank is left as the feria's: these are IV-class days and any III-class saint displaces them, which is what makes the office rare. In 2026 all three are impeded and none appears; 2027 has the Monday unimpeded, and lectio and colitur are byte-identical across 2-5 May that year. One oracle allow-list entry: missalemeum builds no Rogation days either and shows a white feria, so it is the outlier here rather than lectio.
* feat(ef): the votive Office of Our Lady on Saturday (RG 78)Lukasz Kasprzak2026-08-181-0/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RG 78, Caput IX "De sancta Maria in sabbato": "In sabbatis, in quibus occurrit Officium de feria IV classis, fit de sancta Maria in sabbato." A Saturday whose office would otherwise be a IV-class feria keeps Our Lady's office instead, and it is white -- RG 431(e) classes that Mass as a "Missa votiva IV classis ... de B. Maria Virg.", RG 121(a) gives a votive Mass the colour of the feast-type it answers to, and RG 120(b) makes feasts of the BVM white. Smaller than it sounds, because the protasis is already computed. "A IV-class feria" is exactly what rank still being RankClass4 means at that point: every branch above has promoted Advent, Lent, Passiontide, the Ember days, the privileged ferias and the Christmas octave out of it. The SLUG IS DELIBERATELY UNCHANGED. colitur, which has had this office since its v0.3.0, does the same: a bespoke slug would recur many times a year and break the one-slug-per-liturgical-year invariant, and the readings are selected by the Mass formulary rather than by the slug. Only the colour moves. It is also the temporal office only -- a sanctoral feast that outranks the Saturday still wins and brings its own colour, exactly as before. Result: lectio and colitur now agree on the colour of EVERY DAY of 2026. Zero mismatches, where this class alone was nine days that year and 439 rows across 2005-2050 -- the largest single divergence class between the two engines. Pinned in both directions, because the tempting wrong fix is to whiten every Saturday: Lent and Advent Saturdays are III-class violet ferias and must stay violet, and Holy Saturday must too. Mutation-tested -- dropping the IV-class guard reddens the test on the Lenten Saturday, not on the per-annum ones.
* fix(ef): weeks after Epiphany count from the first Sunday, not from EpiphanyLukasz Kasprzak2026-08-181-1/+53
| | | | | | | | | | | | | | | | | | | | | | efWeek anchored the Time-after-Epiphany week number at 6 January, which put every week of the season one too high -- 14 January 2026 came out as week 2 when the first Sunday after Epiphany was 11 January and the week running from it is the first. The error persisted from Epiphany until Septuagesima cut the season short, so it was wrong for most of January and February every year. The Sunday is the anchor because it carries the Mass the week is named for, "Dominica I post Epiphaniam", and its ferias follow it. Epiphany itself is a feast inside Christmas Time (RG 72), not the head of a numbered week -- which is the same distinction the Christmas Time boundary fix just made, showing up again one function along. Week numbers now match colitur day for day through the season. The test pins the ordinary years AND the edge that a naive fix gets wrong: when Epiphany itself falls on a Sunday, "the first Sunday AFTER Epiphany" is the following week, so the helper starts its search on 7 January rather than the 6th. It finds such a year in 2005..2050 rather than hardcoding one. Mutation-tested: restoring the 6 January anchor reddens it.
* fix(ef): Christmas Time runs to 13 January (RG 72)Lukasz Kasprzak2026-08-181-0/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | RG 72: "Tempus natalicium decurrit a I Vesperis Nativitatis Domini usque ad diem 13 ianuarii INCLUSIVE." 6-13 January is the Epiphany section OF Christmas Time, not the start of Time after Epiphany. RG 119(a) backs the same boundary from the colour side, white "usque ad expletum tempus Epiphaniae". lectio ended Christmas Time on 5 January, so eight days a year came out green that should be white, and Epiphany itself reported the wrong season. NOT a one-line boundary change, which is why an earlier attempt was reverted rather than shipped. efSeason both named the slugs and reported the season, so moving the boundary renamed every slug in the window -- ef-time-after-epiphany-* became ef-christmas-* -- and orphaned the ef-time-after-epiphany-sunday-1 lectionary key. The two are now separate axes: efSlugSeason names slugs and numbers weeks; unchanged behaviour efSeason the liturgical season, which the colour follows; RG 72's The split is not a new idea in this file. The resumed-Sundays branch already does exactly this and says so -- "Season stays time-after-pentecost (calendrical); the Epiphany slug only routes the readings" -- it simply had no name, so the one place that needed it could not reuse it. Result, checked against colitur across all 365 days of 2026: SEASON now agrees on every single day, where it previously differed on eight. Colour differences drop to nine, every one a Saturday and every one the BVM Saturday Office (RG 78, colitur C17) which lectio does not build. Slugs and week numbers are byte-identical to before. The oracle's season axis now consults the allow-list and excludes excused days from its threshold. Neither was true before, because no cited divergence had ever BEEN a season difference -- the January window showed up as a colour one, since the wrong season produced the wrong colour too. With the season right, what is left is a season difference against missalemeum, and an axis whose threshold is a t.Fatalf would have failed regardless of any allow-list. TestTemporalEFChristmastideBoundary pins the boundary AND the split, mutation- tested both ways: reverting the boundary reddens it, and re-merging the two seasons so the slug is built from the liturgical one reddens it differently, naming the orphaned lectionary key.
* fix(ef): Good Friday is black (RG 128(b) + RG 132)Lukasz Kasprzak2026-08-181-3/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | This file's own comment called RG 132's black "a separate, unmodelled gap". It is modelled now. RG 128(b)'s exception list carries Good Friday in the same sentence as Holy Thursday's -- "Actione liturgica feria VI in Passione et Morte Domini usque ad Communionem exclusive" excepts the day from Passiontide's violet -- and RG 132 assigns black to it. Adopted from colitur, which closed the same gap against the Missal in its v0.4.0. The rubric is per-action and this model carries one colour per day, so black is the day's principal colour, the same acknowledged limit the Palm Sunday blessing already has. missalemeum's own colour set for the day is "bv", black first, so the oracle test accepts this without a new allow-list entry. Found by cross-checking clectio's output against colitur date by date, NOT by the patch tool that produced the earlier eight corrections. That tool compares colitur's sanctoral data against this repo's calendar ini, so a temporal day -- computed in code on both sides, in neither file -- is structurally invisible to it. Its docstring now says so. TestTemporalEFHolyThursdayColour asserted Good Friday was violet "(unchanged)", encoding the gap; renamed to TestTemporalEFTriduumColours and updated. A test asserting the absence of a feature passes for exactly as long as the feature is absent, which is not the same as being correct. Holy Saturday is still pinned violet in the other direction, so a careless "the whole Triduum is black" change fails there.
* temporal_ef: Sunday ranks, Rose Sundays, Holy Thursday whiteLukasz Kasprzak2026-08-121-0/+92
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* feat(calendar): EF (1962) temporal cycle temporalEF + EF seasonsLukasz Kasprzak2026-07-271-0/+40
8 EF seasons by date boundary (Septuagesima, Passiontide, Time after Epiphany/ Pentecost + shared); major feasts of the Lord; Christ the King = last Sun of October. ParseRank accepts EF ranks.