diff options
| -rw-r--r-- | data/ef/expected-divergences.sexp | 20 | ||||
| -rw-r--r-- | lib/rites/rite_ef/temporal_ef.ml | 28 | ||||
| -rw-r--r-- | test/golden/grid-2027.html | 2 | ||||
| -rw-r--r-- | test/golden/grid-2027.tex | 2 | ||||
| -rw-r--r-- | test/golden/grid-2027.typ | 2 | ||||
| -rw-r--r-- | test/golden/ordo-2027.adoc | 2 | ||||
| -rw-r--r-- | test/golden/ordo-2027.html | 4 | ||||
| -rw-r--r-- | test/golden/ordo-2027.md | 2 | ||||
| -rw-r--r-- | test/golden/ordo-2027.ms | 2 | ||||
| -rw-r--r-- | test/golden/ordo-2027.tex | 4 | ||||
| -rw-r--r-- | test/golden/ordo-2027.txt | 2 | ||||
| -rw-r--r-- | test/golden/ordo-2027.typ | 4 | ||||
| -rw-r--r-- | test/test_golden.ml | 32 | ||||
| -rw-r--r-- | test/test_lms_ordo.ml | 52 | ||||
| -rw-r--r-- | test/test_rubrics_ef.ml | 20 |
15 files changed, 135 insertions, 43 deletions
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 632854c..f98409b 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -131,13 +131,19 @@ Diff shapes: most rows carry [Slug_f; Rank; Colour_f; First_f; Gospel_f] (the te BLAST RADIUS, MEASURED, full 1583-9999 domain (not merely this fixture's 2005-2050 window): 6 983 liturgical days change, zero unclassified, across all 2 041 leap years in the domain -- see data/ef/expected-divergences-lms.sexp's own now-closed L3 entry for the full figures (this entry's own 21-row 2005-2050 population is the expected subset of that domain-wide count landing inside the fixture's own window: 11 leap years x up to 2 new rows each, minus the three already-explained overlaps above).") (expected_rows 21)) - ; C8 -- CLOSED, REMOVED (2026-08-18): 0 of 16801 rows, was 26. lectio builds - ; Rogation Monday and Tuesday now (RG 87, Easter+36/+37, violet under - ; RG 128(d)). The Wednesday is NOT built there and deliberately so: Easter+38 - ; is the Ascension's Vigil, which wins the day, and the rubric asks for a - ; commemoration -- a channel lectio's one-office-per-day temporal function - ; does not have. That is the same reason this entry never covered the - ; Wednesday either. Citation preserved in the register. + ((id C8) + (citation "RG 119 (Caput XVIII, \"De Colore Paramentorum\"): white is used \"in Officio et Missa de Tempore ... a Missa Vigiliae paschalis usque ad Missam vigiliae Pentecostes exclusive\" -- the de-Tempore Office and Mass are white from the Paschal Vigil Mass until the Pentecost Vigil Mass exclusive, and Rogation Monday/Tuesday (Easter+36/+37) sit inside that window. RG 128's own exhaustive four-case list for violet (Advent I-Christmas Eve; Septuagesima-Paschal Vigil; the September Ember ferias; vigils of II/III class OUTSIDE Paschaltide) never names Rogation days. RG 88 (\"de Litaniis minoribus nihil fit in Officio, sed tantum in Missa\"): the violet belongs to the Rogation MASS/procession, a distinct votive text this engine does not model, not to the day's own Office. Fixed in Rite_ef.Temporal_ef.temporal's Rogation branch, celebrant-rubrics-phase1 Bug 1, 2026-08-22 -- see that branch's own citation and data/ef/expected-divergences-lms.sexp's now-closed L6 entry, which is what surfaced it (LMS Ordo 2023-2024, 2024-05-06, \"FERIA IV Cl W\").") + (verdict colitur) + (note "REOPENED (2026-08-22, celebrant-rubrics-phase1, Bug 1 fix). Previously CLOSED, REMOVED (2026-08-18): 0 of 16801 rows, was 26, with this note, PRESERVED VERBATIM because it contains a misattribution now corrected rather than silently dropped: \"lectio builds Rogation Monday and Tuesday now (RG 87, Easter+36/+37, violet under RG 128(d)). The Wednesday is NOT built there and deliberately so: Easter+38 is the Ascension's Vigil, which wins the day, and the rubric asks for a commemoration -- a channel lectio's one-office-per-day temporal function does not have. That is the same reason this entry never covered the Wednesday either. Citation preserved in the register.\" + +THE MISATTRIBUTION: \"violet under RG 128(d)\" is wrong. RG 128(d) governs vigils of II/III class OUTSIDE Paschaltide; Rogation Monday/Tuesday are neither vigils nor outside Paschaltide. Checked against docs/research/rules-register.md (gitignored, local) while researching Bug 1: no claim of an RG 128(d) basis for Rogation colour exists there -- the misattribution was confined to this file's own closure note. It traces to Rite_ef.Temporal_ef.temporal's own Rogation branch, which hardcoded [Colour.Violet] with NO citation at all before this fix; whoever wrote this entry's closure note in 2026-08-18 apparently backfilled a plausible-looking but wrong citation for behaviour that was never actually cited in the code it described. + +WHY THIS REOPENS RATHER THAN STAYS CLOSED: the entry closed in 2026-08-18 because lectio, independently, ALSO computes these two days violet -- not because either engine's violet was ever verified against the Missal. Both engines shared the same uncited assumption, so the comparator saw agreement and the entry went to zero. Bug 1 corrected COLITUR's side to white (RG 119); lectio's own violet is unchanged (a sibling project, out of this repo, not modified here). The comparator now disagrees again, on the same 26 rows, for the OPPOSITE reason: previously colitur was wrong and lectio was wrong the same way; now colitur is right and lectio still carries the old, uncited assumption forward -- consistent with CLAUDE.md's own \"colitur vs missalemeum\" base-rate note for a different lineage, applied here to lectio directly: a fresh divergence is not presumptively colitur's fault once colitur has just been corrected FROM the shared error. + +MEASURED (test_differential.ml's own [classify], 2005-2050 fixture, DEBUGC8 probe run and reverted): exactly 26 rows, all with diffs=[Colour_f] alone -- season and slug already agree (lectio's own [easter]/colitur's [paschaltide] season labels are Layer A vocabulary synonyms, not a diff), and on every row lectio=violet, colitur=white. Dates: 2005-05-03, 2006-05-22/23, 2007-05-14, 2011-05-30, 2012-05-14, 2013-05-06, 2016-05-03, 2017-05-22/23, 2018-05-08, 2022-05-23/24, 2024-05-06, 2027-05-03, 2028-05-22/23, 2029-05-08, 2032-05-03, 2033-05-23/24, 2040-05-08, 2044-05-23/24, 2047-05-21, 2049-05-24. Fewer than the 2-per-year x 23-year x ~2 ceiling because a competing sanctoral feast impedes the Rogation office outright in some years on one or both of the two days (unchanged by this fix, gated on colitur's own [rogation-monday]/[rogation-tuesday] slug in [layer_c_reason] the same as before). The Wednesday remains absent from this entry for the same reason the pre-2026-08-18 and post-2026-08-18 notes both already gave: Easter+38 is the Ascension Vigil (RG 91 entry 21), which outranks the Rogation Wednesday commemoration outright on colitur's side, and lectio has no Rogation-Wednesday concept at all to compare against regardless. + +Gated on [(String.equal c.slug \"ef-rogation-monday\" || String.equal c.slug \"ef-rogation-tuesday\") && subset diffs [ Season; Slug_f; Colour_f ]] in [layer_c_reason] -- unchanged code, present since before this entry's 2026-08-18 closure and never removed; only the sexp record was removed when the count hit zero, per this file's own \"closed = 0 rows, not code deleted\" convention.") + (expected_rows 26)) ; C14 -- CLOSED, REMOVED (2026-08-18): 0 of 16801 rows, was 3. lectio has ; adopted RG 96(a)/97/98. Its transferIfImpededEF resolved each impeded ; I-class feast independently, so in 2008, 2035 and 2046 St Joseph and the diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml index 1c916f4..fe08b2e 100644 --- a/lib/rites/rite_ef/temporal_ef.ml +++ b/lib/rites/rite_ef/temporal_ef.ml @@ -823,12 +823,36 @@ let temporal d = "ef-rogation-monday"/"-tuesday" are colitur-only keys and a lectionary gap for Plan 4 (CORRECTED, final fix wave, item 7 -- the lectionary bootstrap is Plan 4, not Plan 3), like the Ember - and Nativity-vigil keys above. *) + and Nativity-vigil keys above. + + COLOUR (L6, data/ef/expected-divergences-lms.sexp, CLOSED by this + fix): this branch used to hardcode [Colour.Violet] with no + citation at all. RG 119 (Caput XVIII, "De Colore Paramentorum"): + white is used "in Officio et Missa de Tempore ... a Missa Vigiliae + paschalis usque ad Missam vigiliae Pentecostes exclusive" -- the + de-Tempore Office AND Mass are white from the Paschal Vigil Mass + until the Pentecost Vigil Mass exclusive, and days 36/37 (Rogation + Monday/Tuesday) sit squarely inside that window. RG 128's own + exhaustive four-case list for violet (Advent I-Christmas Eve; + Septuagesima-Paschal Vigil; the September Ember ferias; vigils of + II/III class OUTSIDE Paschaltide) names Rogation days nowhere, and + its vigil clause is inapplicable twice over -- these are not + vigils, and they ARE inside Paschaltide. RG 88 ("de Litaniis + minoribus nihil fit in Officio, sed tantum in Missa") is why: the + violet belongs to the ROGATION MASS/procession alone, a distinct + votive text this engine does not model as a separate Mass (the + same per-action colour nuance temporal_ef.ml's own RG 126/RG 128 + Good-Friday-Communion citations already flag as unmodelled + elsewhere) -- the day's own OFFICE, which is what [colour] here + expresses, stays [season_colour s] like any other Paschaltide + feria. Witnessed directly: LMS 2023-2024, 2024-05-06 (Rogation + Monday), "FERIA IV Cl W" (white), "Mass of 5th Sunday after + Easter". *) let rogation = days_between easter d in if rogation = 36 || rogation = 37 then build ~season:s ~slug:(if rogation = 36 then "ef-rogation-monday" else "ef-rogation-tuesday") - ~colour:Colour.Violet ~rank:(ferial_rank d s) ~week:(week d) () + ~colour:(season_colour s) ~rank:(ferial_rank d s) ~week:(week d) () else match ember d with | Some (slug, rank, colour) -> build ~season:s ~slug ~colour ~rank ~week:(week d) () diff --git a/test/golden/grid-2027.html b/test/golden/grid-2027.html index daa6ba5..6741ad7 100644 --- a/test/golden/grid-2027.html +++ b/test/golden/grid-2027.html @@ -131,7 +131,7 @@ <td class="pad"></td><td class="pad"></td><td class="pad"></td><td class="pad"></td><td class="pad"></td><td class="pad"></td><td class="white"><span class="dom">1</span>St. Joseph the Workman<span class="sigla">Col 3:14-15, 17, 23-24 · Matt 13:54-58</span></td> </tr> <tr> - <td class="white"><span class="dom">2</span>5th Sunday after Easter<span class="sigla">Jas 1:22-27 · John 16:23-30</span></td><td class="violet"><span class="dom">3</span>Rogation Monday<span class="sigla">Jas 1:22-27 · John 16:23-30</span></td><td class="white"><span class="dom">4</span>St. Monica<span class="sigla">1 Tim 5:3-10 · Luke 7:11-16</span></td><td class="white"><span class="dom">5</span>Vigil of the Ascension<span class="sigla">Eph 4:7-13 · John 17:1-11</span></td><td class="white"><span class="dom">6</span>The Ascension of Our Lord<span class="sigla">Acts 1:1-11 · Mark 16:14-20</span></td><td class="red"><span class="dom">7</span>St. Stanislaus<span class="sigla">Wis 5:1-5 · John 15:1-7</span></td><td class="white"><span class="dom">8</span>Our Lady's Saturday Office<span class="sigla">Ecclus 24:14-16 · John 19:25-27</span></td> + <td class="white"><span class="dom">2</span>5th Sunday after Easter<span class="sigla">Jas 1:22-27 · John 16:23-30</span></td><td class="white"><span class="dom">3</span>Rogation Monday<span class="sigla">Jas 1:22-27 · John 16:23-30</span></td><td class="white"><span class="dom">4</span>St. Monica<span class="sigla">1 Tim 5:3-10 · Luke 7:11-16</span></td><td class="white"><span class="dom">5</span>Vigil of the Ascension<span class="sigla">Eph 4:7-13 · John 17:1-11</span></td><td class="white"><span class="dom">6</span>The Ascension of Our Lord<span class="sigla">Acts 1:1-11 · Mark 16:14-20</span></td><td class="red"><span class="dom">7</span>St. Stanislaus<span class="sigla">Wis 5:1-5 · John 15:1-7</span></td><td class="white"><span class="dom">8</span>Our Lady's Saturday Office<span class="sigla">Ecclus 24:14-16 · John 19:25-27</span></td> </tr> <tr> <td class="white"><span class="dom">9</span>Sunday after the Ascension<span class="sigla">1 Pet 4:7-11 · John 15:26-27; 16:1-4</span></td><td class="white"><span class="dom">10</span>St. Antoninus<span class="sigla">Ecclus 44:16-27; 45:3-20 · Matt 25:14-23</span></td><td class="red"><span class="dom">11</span>Sts. Philip & James<span class="sigla">Wis 5:1-5 · John 14:1-13</span></td><td class="red"><span class="dom">12</span>Sts. Nereus, Achilleus, Domitilla, & Pancras<span class="sigla">Wis 5:1-5 · John 4:46-53</span></td><td class="white"><span class="dom">13</span>St. Robert Bellarmine<span class="sigla">Wis 7:7-14 · Matt 5:13-19</span></td><td class="white"><span class="dom">14</span>Friday of the 7th Week of Eastertide<span class="sigla">1 Pet 4:7-11 · John 15:26-27; 16:1-4</span></td><td class="red"><span class="dom">15</span>Vigil of Pentecost<span class="sigla">Acts 19:1-8 · John 14:15-21</span></td> diff --git a/test/golden/grid-2027.tex b/test/golden/grid-2027.tex index 674b9c4..d81bdb4 100644 --- a/test/golden/grid-2027.tex +++ b/test/golden/grid-2027.tex @@ -151,7 +151,7 @@ \begin{tabular}{|*{7}{p{\cellw}|}}\hline \textbf{ Sunday } & \textbf{ Monday } & \textbf{ Tuesday } & \textbf{ Wednesday } & \textbf{ Thursday } & \textbf{ Friday } & \textbf{ Saturday } \\ \hline & & & & & & \cellcolor{cwhite}\daycell{ 1 }{ St. Joseph the Workman }{ 1st Class }{ Col 3:14-15, 17, 23-24\ \textperiodcentered\ Matt 13:54-58 } \\ \hline -\cellcolor{cwhite}\daycell{ 2 }{ 5th Sunday after Easter }{ 2nd Class }{ Jas 1:22-27\ \textperiodcentered\ John 16:23-30 } & \cellcolor{cviolet}\daycell{ 3 }{ Rogation Monday }{ 4th Class }{ Jas 1:22-27\ \textperiodcentered\ John 16:23-30 } & \cellcolor{cwhite}\daycell{ 4 }{ St. Monica }{ 3rd Class }{ 1 Tim 5:3-10\ \textperiodcentered\ Luke 7:11-16 } & \cellcolor{cwhite}\daycell{ 5 }{ Vigil of the Ascension }{ 2nd Class }{ Eph 4:7-13\ \textperiodcentered\ John 17:1-11 } & \cellcolor{cwhite}\daycell{ 6 }{ The Ascension of Our Lord }{ 1st Class }{ Acts 1:1-11\ \textperiodcentered\ Mark 16:14-20 } & \cellcolor{cred}\daycell{ 7 }{ St. Stanislaus }{ 3rd Class }{ Wis 5:1-5\ \textperiodcentered\ John 15:1-7 } & \cellcolor{cwhite}\daycell{ 8 }{ Our Lady's Saturday Office }{ 4th Class }{ Ecclus 24:14-16\ \textperiodcentered\ John 19:25-27 } \\ \hline +\cellcolor{cwhite}\daycell{ 2 }{ 5th Sunday after Easter }{ 2nd Class }{ Jas 1:22-27\ \textperiodcentered\ John 16:23-30 } & \cellcolor{cwhite}\daycell{ 3 }{ Rogation Monday }{ 4th Class }{ Jas 1:22-27\ \textperiodcentered\ John 16:23-30 } & \cellcolor{cwhite}\daycell{ 4 }{ St. Monica }{ 3rd Class }{ 1 Tim 5:3-10\ \textperiodcentered\ Luke 7:11-16 } & \cellcolor{cwhite}\daycell{ 5 }{ Vigil of the Ascension }{ 2nd Class }{ Eph 4:7-13\ \textperiodcentered\ John 17:1-11 } & \cellcolor{cwhite}\daycell{ 6 }{ The Ascension of Our Lord }{ 1st Class }{ Acts 1:1-11\ \textperiodcentered\ Mark 16:14-20 } & \cellcolor{cred}\daycell{ 7 }{ St. Stanislaus }{ 3rd Class }{ Wis 5:1-5\ \textperiodcentered\ John 15:1-7 } & \cellcolor{cwhite}\daycell{ 8 }{ Our Lady's Saturday Office }{ 4th Class }{ Ecclus 24:14-16\ \textperiodcentered\ John 19:25-27 } \\ \hline \cellcolor{cwhite}\daycell{ 9 }{ Sunday after the Ascension }{ 2nd Class }{ 1 Pet 4:7-11\ \textperiodcentered\ John 15:26-27; 16:1-4 } & \cellcolor{cwhite}\daycell{ 10 }{ St. Antoninus }{ 3rd Class }{ Ecclus 44:16-27; 45:3-20\ \textperiodcentered\ Matt 25:14-23 } & \cellcolor{cred}\daycell{ 11 }{ Sts. Philip \& James }{ 2nd Class }{ Wis 5:1-5\ \textperiodcentered\ John 14:1-13 } & \cellcolor{cred}\daycell{ 12 }{ Sts. Nereus, Achilleus, Domitilla, \& Pancras }{ 3rd Class }{ Wis 5:1-5\ \textperiodcentered\ John 4:46-53 } & \cellcolor{cwhite}\daycell{ 13 }{ St. Robert Bellarmine }{ 3rd Class }{ Wis 7:7-14\ \textperiodcentered\ Matt 5:13-19 } & \cellcolor{cwhite}\daycell{ 14 }{ Friday of the 7th Week of Eastertide }{ 4th Class }{ 1 Pet 4:7-11\ \textperiodcentered\ John 15:26-27; 16:1-4 } & \cellcolor{cred}\daycell{ 15 }{ Vigil of Pentecost }{ 1st Class }{ Acts 19:1-8\ \textperiodcentered\ John 14:15-21 } \\ \hline \cellcolor{cred}\daycell{ 16 }{ Pentecost Sunday (Whitsunday) }{ 1st Class }{ Acts 2:1-11\ \textperiodcentered\ John 14:23-31 } & \cellcolor{cred}\daycell{ 17 }{ Monday of Pentecost Week }{ 1st Class }{ Acts 10:34, 42-48\ \textperiodcentered\ John 3:16-21 } & \cellcolor{cred}\daycell{ 18 }{ Tuesday of Pentecost Week }{ 1st Class }{ Acts 8:14-17\ \textperiodcentered\ John 10:1-10 } & \cellcolor{cred}\daycell{ 19 }{ Pentecost Ember Wednesday }{ 1st Class }{ Acts 5:12-16\ \textperiodcentered\ John 6:44-52 } & \cellcolor{cred}\daycell{ 20 }{ Thursday of Pentecost Week }{ 1st Class }{ Acts 8:5-8\ \textperiodcentered\ Luke 9:1-6 } & \cellcolor{cred}\daycell{ 21 }{ Pentecost Ember Friday }{ 1st Class }{ Joel 2:23-24; 2:26-27\ \textperiodcentered\ Luke 5:17-26 } & \cellcolor{cred}\daycell{ 22 }{ Pentecost Ember Saturday }{ 1st Class }{ Rom 5:1-5\ \textperiodcentered\ Luke 4:38-44 } \\ \hline \cellcolor{cwhite}\daycell{ 23 }{ Trinity Sunday }{ 1st Class }{ Rom 11:33-36\ \textperiodcentered\ Matt 28:18-20 } & \cellcolor{cgreen}\daycell{ 24 }{ Monday of the 1st Week of the Time after Pentecost }{ 4th Class }{ 1 John 4:8-21\ \textperiodcentered\ Luke 6:36-42 } & \cellcolor{cwhite}\daycell{ 25 }{ St. Gregory VII }{ 3rd Class }{ 1 Pet 5:1-4; 5:10-11\ \textperiodcentered\ Matt 16:13-19 } & \cellcolor{cwhite}\daycell{ 26 }{ St. Philip Neri }{ 3rd Class }{ Wis 7:7-14\ \textperiodcentered\ Luke 12:35-40 } & \cellcolor{cwhite}\daycell{ 27 }{ Corpus Christi }{ 1st Class }{ 1 Cor 11:23-29\ \textperiodcentered\ John 6:56-59 } & \cellcolor{cwhite}\daycell{ 28 }{ St. Augustine of Canterbury }{ 3rd Class }{ 1 Thess 2:2-9\ \textperiodcentered\ Luke 10:1-9 } & \cellcolor{cwhite}\daycell{ 29 }{ St. Mary Magdalene de Pazzi }{ 3rd Class }{ 2 Cor 10:17-18; 11:1-2\ \textperiodcentered\ Matt 25:1-13 } \\ \hline diff --git a/test/golden/grid-2027.typ b/test/golden/grid-2027.typ index 800edf9..b9e1d0e 100644 --- a/test/golden/grid-2027.typ +++ b/test/golden/grid-2027.typ @@ -2056,7 +2056,7 @@ - table.cell(fill: cgrid.at("violet"))[ + table.cell(fill: cgrid.at("white"))[ #block(height: cellh - 2 * cellinset, clip: true)[ #set par(leading: 0.3em) #text(weight: "bold")[3] #text(size: 6.5pt)[Rogation Monday] diff --git a/test/golden/ordo-2027.adoc b/test/golden/ordo-2027.adoc index 39e5ae4..d5660a0 100644 --- a/test/golden/ordo-2027.adoc +++ b/test/golden/ordo-2027.adoc @@ -879,7 +879,7 @@ Epistle Jas 1:22-27 Gospel John 16:23-30 *3* Rogation Monday + -class-4 · violet + +class-4 · white + Epistle Jas 1:22-27 Gospel John 16:23-30 + Commemoration Sts. Alexander & Companions diff --git a/test/golden/ordo-2027.html b/test/golden/ordo-2027.html index 8513909..1b621e4 100644 --- a/test/golden/ordo-2027.html +++ b/test/golden/ordo-2027.html @@ -672,9 +672,9 @@ <div class="meta">class-2 · white · Epistle Jas 1:22-27 · Gospel John 16:23-30</div> </div> -<div class="day violet"> +<div class="day white"> <span class="dom">3</span>Rogation Monday - <div class="meta">class-4 · violet · Epistle Jas 1:22-27 · Gospel John 16:23-30</div> + <div class="meta">class-4 · white · Epistle Jas 1:22-27 · Gospel John 16:23-30</div> <div class="meta">Commemoration Sts. Alexander & Companions</div> </div> <div class="day white"> diff --git a/test/golden/ordo-2027.md b/test/golden/ordo-2027.md index 3d96240..d4acf1d 100644 --- a/test/golden/ordo-2027.md +++ b/test/golden/ordo-2027.md @@ -789,7 +789,7 @@ **3** Rogation Monday -`class-4` · violet · Epistle Jas 1:22-27 · Gospel John 16:23-30 +`class-4` · white · Epistle Jas 1:22-27 · Gospel John 16:23-30 - Commemoration Sts. Alexander & Companions diff --git a/test/golden/ordo-2027.ms b/test/golden/ordo-2027.ms index e029a76..7bc8c89 100644 --- a/test/golden/ordo-2027.ms +++ b/test/golden/ordo-2027.ms @@ -1354,7 +1354,7 @@ May .IP "3" 4 \fBRogation Monday\fR .br -\s74th Class \(bu Violet\s9 +\s74th Class \(bu White\s9 .br \s7Epistle Jas 1:22-27\s9 .br diff --git a/test/golden/ordo-2027.tex b/test/golden/ordo-2027.tex index 0db4121..e8ec59f 100644 --- a/test/golden/ordo-2027.tex +++ b/test/golden/ordo-2027.tex @@ -1548,9 +1548,9 @@ \begin{tcolorbox}[colback=white,colframe=black!35,boxrule=0.3pt,sharp corners,boxsep=0mm,left=1.6mm,right=1.6mm,top=0.4mm,bottom=0.4mm,before skip=0.3mm,after skip=0mm] -\fontsize{9}{9}\selectfont\bfseries 3 \fontsize{7}{9}\selectfont\mdseries\;Monday\hfill\swatch{licolviolet}\\ +\fontsize{9}{9}\selectfont\bfseries 3 \fontsize{7}{9}\selectfont\mdseries\;Monday\hfill\swatch{licolwhite}\\ \fontsize{9}{9.7}\selectfont\bfseries Rogation Monday\\ -\fontsize{6.5}{7.4}\selectfont\mdseries 4th Class \textperiodcentered\ Violet \quad Epistle\ Jas 1:22-27 \quad Gospel\ John 16:23-30 \\ +\fontsize{6.5}{7.4}\selectfont\mdseries 4th Class \textperiodcentered\ White \quad Epistle\ Jas 1:22-27 \quad Gospel\ John 16:23-30 \\ \fontsize{6.5}{7.4}\selectfont\mdseries Commemoration\ Sts. Alexander \& Companions \end{tcolorbox} diff --git a/test/golden/ordo-2027.txt b/test/golden/ordo-2027.txt index 0af67b3..e0073ec 100644 --- a/test/golden/ordo-2027.txt +++ b/test/golden/ordo-2027.txt @@ -728,7 +728,7 @@ May 2027 Gospel John 16:23-30 3 Rogation Monday - class-4 · violet + class-4 · white Epistle Jas 1:22-27 Gospel John 16:23-30 Commemoration Sts. Alexander & Companions diff --git a/test/golden/ordo-2027.typ b/test/golden/ordo-2027.typ index 0d87f04..ce5e0ca 100644 --- a/test/golden/ordo-2027.typ +++ b/test/golden/ordo-2027.typ @@ -1480,9 +1480,9 @@ #block(width: 100%, above: 0.4mm, below: 0mm, breakable: false, stroke: 0.4pt + luma(160), inset: (x: 1.6mm, y: 0.4mm))[ #set par(leading: 0.36em) - #text(weight: "bold")[3] #h(2mm) #text(size: 7pt)[Monday] #h(1fr) #swatch("violet") \ + #text(weight: "bold")[3] #h(2mm) #text(size: 7pt)[Monday] #h(1fr) #swatch("white") \ #text(weight: "bold")[Rogation Monday] \ - #text(size: 6.5pt)[4th Class #sym.dot.c Violet #h(2mm) Epistle Jas 1:22\-27 #h(2mm) Gospel John 16:23\-30] \ + #text(size: 6.5pt)[4th Class #sym.dot.c White #h(2mm) Epistle Jas 1:22\-27 #h(2mm) Gospel John 16:23\-30] \ #text(size: 6.5pt)[Commemoration Sts. Alexander & Companions] ] diff --git a/test/test_golden.ml b/test/test_golden.ml index d680720..3a6f3f5 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -1315,6 +1315,34 @@ let test_rogation_wednesday_yields_to_a_feast_2026 () = "2026-05-13 wednesday season=paschaltide week=6 slug=ef-ascension-vigil rank=class-2 colour=white \ subject=temporal name_la=- comms=[robert-bellarmine:ordinary] in=- out=[]" +(* ---- Rogation Monday/Tuesday colour, RG 119/128/88 (celebrant-rubrics- + phase1 Bug 1 fix, 2026-08-22; data/ef/expected-divergences-lms.sexp's + now-closed L6, data/ef/expected-divergences.sexp's reopened C8) ---- + + {!Rite_ef.Temporal_ef.temporal}'s Rogation Monday/Tuesday branch used to + hardcode [Colour.Violet] with no citation. RG 119 assigns white to the + de-Tempore Office and Mass from the Paschal Vigil to the Pentecost Vigil + exclusive -- Easter+36/+37 sit inside that window -- and RG 128's own + exhaustive four-case violet list never names Rogation days; RG 88 ("de + Litaniis minoribus nihil fit in Officio") is why -- the violet belongs + to the Rogation MASS/procession alone, not the day's own Office. Fixed + to [season_colour s], the same call every other Paschaltide feria makes. + + 2028 pins BOTH days at once (unlike the LMS witness, which only reaches + one day per fixture window): neither is impeded by a competing + sanctoral feast that year, so both are observed outright, both white. + Verified directly against `date -d`: Easter 2028-04-16, so 22/23 May are + Easter+36/+37. *) +let test_rogation_monday_white_2028 () = + check ~msg:"2028: Rogation Monday is white (RG 119), not violet" 2028 5 22 + "2028-05-22 monday season=paschaltide week=6 slug=ef-rogation-monday rank=class-4 colour=white \ + subject=temporal name_la=- comms=[] in=- out=[]" + +let test_rogation_tuesday_white_2028 () = + check ~msg:"2028: Rogation Tuesday is white (RG 119), not violet" 2028 5 23 + "2028-05-23 tuesday season=paschaltide week=6 slug=ef-rogation-tuesday rank=class-4 colour=white \ + subject=temporal name_la=- comms=[] in=- out=[]" + (* ---- The bissextile (leap-year) calendarium footnote, bissextile-shift task, 2026-08-22 ---- @@ -1572,6 +1600,10 @@ let suite = test_rogation_wednesday_admitted_2024; Alcotest.test_case "RG87/113: Rogation Wednesday yields to an impeded feast (2026)" `Quick test_rogation_wednesday_yields_to_a_feast_2026; + Alcotest.test_case "RG119/128: Rogation Monday is white, not violet (2028)" `Quick + test_rogation_monday_white_2028; + Alcotest.test_case "RG119/128: Rogation Tuesday is white, not violet (2028)" `Quick + test_rogation_tuesday_white_2028; Alcotest.test_case "bissextile footnote: Matthias moves 24->25 February (leap, 2044)" `Quick test_bissextile_matthias_leap_2044; Alcotest.test_case "bissextile footnote: Matthias unaffected (common, 2025)" `Quick diff --git a/test/test_lms_ordo.ml b/test/test_lms_ordo.ml index 00fb32c..ed1c871 100644 --- a/test/test_lms_ordo.ml +++ b/test/test_lms_ordo.ml @@ -582,17 +582,25 @@ let make_suite ~label ~fixture_path ~fixture_sha256 ~window_first ~window_last ~ | Some { MF.said = None; _ } -> "NONE (said, unexpectedly outside Votive)" | None -> "NONE") in - (* Two REAL, STRUCTURAL shapes found running this comparison (see - data/ef/expected-divergences-lms.sexp's own L5/L6 for the full - citations) -- neither is a fixed date list, both a property of the - day itself, because both recur every year the underlying condition - holds, not on a fixed calendar date the way L4 above does. Matched - by PREDICATE, not by date, for the same reason L2's own note gives - for why it is prose-only rather than wired through the shared - [expected_rows] mechanism: the count varies window to window (L5: - 6/5/6; L6: 1/0/0), so a single static count cannot check it, and - [make_suite] threads the per-window expected totals directly - (~expected_gloria_l5/~expected_gloria_l6 below) instead. *) + (* L5 is the one REAL, STRUCTURAL shape still open (see + data/ef/expected-divergences-lms.sexp's own L5 for the full + citation) -- not a fixed date list, a property of the day itself, + because it recurs every year the underlying condition holds, not on a + fixed calendar date the way L4 above does. Matched by PREDICATE, not + by date, for the same reason L2's own note gives for why it is + prose-only rather than wired through the shared [expected_rows] + mechanism: the count varies window to window (L5: 6/5/6), so a single + static count cannot check it, and [make_suite] threads the per-window + expected total directly (~expected_gloria_l5 below) instead. + + L6 is CLOSED (celebrant-rubrics-phase1, Bug 1 fix, this task): + {!Rite_ef.Temporal_ef.temporal}'s Rogation Monday/Tuesday branch no + longer hardcodes [Colour.Violet] -- see temporal_ef.ml's own citation + on that branch and data/ef/expected-divergences-lms.sexp's L6 entry + for the fix and its measured blast radius. [is_l6_rogation_colour] and + ~expected_gloria_l6 are kept, at 0 in every window, as the regression + net the same way L3's own bissextile fix keeps a predicate whose count + is now provably zero rather than deleting it. *) let is_l5_lenten_commemoration (o : ordo_row) (c : colitur_row) = (* NOT a Gloria defect (CORRECTED, l5-f3-readjudication task, 2026-08-22 -- data/ef/expected-divergences-lms.sexp's own L5 has @@ -613,15 +621,17 @@ let make_suite ~label ~fixture_path ~fixture_sha256 ~window_first ~window_last ~ (not c.c_gloria) && Option.value o.gloria ~default:false && c.c_has_commemoration && c.c_rank = V.Class3 in let is_l6_rogation_colour (o : ordo_row) (c : colitur_row) = - (* Root-caused to a DIFFERENT, pre-existing bug this comparison merely - surfaced -- {!Rite_ef.Temporal_ef.temporal}'s own Rogation Monday/ - Tuesday branch hardcodes [Colour.Violet] with no RG citation at - all, but the Ordo shows this exact date "FERIA IV Cl W" (white, - matching Paschaltide's own [season_colour] and RG88's "nihil fit in - Officio" -- the Office, hence its colour, is unchanged by the - Rogation, only the Mass TEXT is proper) -- so [gloria]'s own 432(b) - violet guard wrongly fires. NOT a Gloria defect and NOT fixed here - (out of this task's own scope; see the task report). *) + (* CLOSED (celebrant-rubrics-phase1, Bug 1 fix). Was root-caused to a + DIFFERENT, pre-existing bug this comparison merely surfaced -- + {!Rite_ef.Temporal_ef.temporal}'s own Rogation Monday/Tuesday branch + used to hardcode [Colour.Violet] with no RG citation at all, where + the Ordo shows this exact date "FERIA IV Cl W" (white, matching + Paschaltide's own [season_colour] and RG88's "nihil fit in Officio" + -- the Office, hence its colour, is unchanged by the Rogation, only + the Mass TEXT is proper) -- so [gloria]'s own 432(b) violet guard + wrongly fired. Now fixed at the source (temporal_ef.ml); this + predicate and its own ~expected_gloria_l6 count (0 in every window) + are kept as the regression net, not deleted. *) (not c.c_gloria) && Option.value o.gloria ~default:false && (contains_substring c.c_slug ~needle:"rogation-monday" || contains_substring c.c_slug ~needle:"rogation-tuesday") in @@ -788,7 +798,7 @@ let suite_2023_2024 = I-class Sunday that admits him not even as a commemoration (RG16(a)), so his own Mass is not said anywhere in this window any more. *) ~expected_bvm_votive:12 ~expected_proper:181 ~expected_common:2 ~expected_preceding_sunday:61 - ~expected_ascension_week:1 ~expected_gloria_l5:5 ~expected_gloria_l6:1 + ~expected_ascension_week:1 ~expected_gloria_l5:5 ~expected_gloria_l6:0 let suite_2024_2025 = make_suite ~label:"lms-ordo-2024-2025" ~fixture_path:"fixtures/lms-ordo-2024-2025.sexp" diff --git a/test/test_rubrics_ef.ml b/test/test_rubrics_ef.ml index 71f180d..6679702 100644 --- a/test/test_rubrics_ef.ml +++ b/test/test_rubrics_ef.ml @@ -598,6 +598,24 @@ let test_431a_mirrors_te_deum_true () = let test_432a_mirrors_te_deum_false () = check_gloria "432(a): mirrors [te_deum]=false (an ordinary Advent feria)" 2025 12 1 false +(* ---- The Rogation Monday/Tuesday cascade (celebrant-rubrics-phase1 Bug 1 + fix, 2026-08-22): {!Rite_ef.Temporal_ef.temporal} used to hardcode + [Colour.Violet] on these two days with no citation, which silenced + [gloria] via 432(b) even though 237(e)'s own Paschaltide-feria branch + already said [te_deum]=true underneath. Fixed to [season_colour] (RG + 119: white from the Paschal Vigil to the Pentecost Vigil exclusive; RG + 128's own violet list never names Rogation days; RG 88 -- the violet + belongs to the Rogation MASS, not the Office this field describes). + 2028-05-22/23: neither day is impeded that year (test_golden.ml's own + [test_rogation_{monday,tuesday}_white_2028] pins the colour side of the + same fix), so both resolve to white and both now say the Gloria, MIRROR + OF [te_deum] via 431(a) once 432(b)'s violet guard no longer fires -- + MATCHING the LMS Ordo witness (2023-2024, 2024-05-06, "FERIA IV Cl W + ... Gl"). Reverting temporal_ef.ml's fix alone (mutation-checked while + building this task) turns both [false], the pre-fix answer. *) +let test_rogation_monday_gloria_2028 () = check_gloria "Rogation Monday: white -> Gloria said (2028)" 2028 5 22 true +let test_rogation_tuesday_gloria_2028 () = check_gloria "Rogation Tuesday: white -> Gloria said (2028)" 2028 5 23 true + (* ---- Domain-wide sanity, task requirement 5: "every violet day must be false (RG 432 b), and every Requiem must be false (432 d)". Two invariants, checked over every day {!Cal.year} resolves -- [Cal.year], @@ -794,6 +812,8 @@ let suite = Alcotest.test_case "432(d): All Souls' Day (transferred)" `Quick test_432d_all_souls; Alcotest.test_case "431(a): mirrors [te_deum]=true" `Quick test_431a_mirrors_te_deum_true; Alcotest.test_case "432(a): mirrors [te_deum]=false" `Quick test_432a_mirrors_te_deum_false; + Alcotest.test_case "Rogation Monday: white -> Gloria said (2028)" `Quick test_rogation_monday_gloria_2028; + Alcotest.test_case "Rogation Tuesday: white -> Gloria said (2028)" `Quick test_rogation_tuesday_gloria_2028; Alcotest.test_case "domain sanity: every violet day has [gloria]=false (sample)" `Quick test_domain_violet_implies_no_gloria_sample; Alcotest.test_case "domain sanity: every Requiem day has [gloria]=false (sample)" `Quick |
