aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/ef/expected-divergences.sexp20
-rw-r--r--lib/rites/rite_ef/temporal_ef.ml28
-rw-r--r--test/golden/grid-2027.html2
-rw-r--r--test/golden/grid-2027.tex2
-rw-r--r--test/golden/grid-2027.typ2
-rw-r--r--test/golden/ordo-2027.adoc2
-rw-r--r--test/golden/ordo-2027.html4
-rw-r--r--test/golden/ordo-2027.md2
-rw-r--r--test/golden/ordo-2027.ms2
-rw-r--r--test/golden/ordo-2027.tex4
-rw-r--r--test/golden/ordo-2027.txt2
-rw-r--r--test/golden/ordo-2027.typ4
-rw-r--r--test/test_golden.ml32
-rw-r--r--test/test_lms_ordo.ml52
-rw-r--r--test/test_rubrics_ef.ml20
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 &middot; 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 &middot; John 16:23-30</span></td><td class="violet"><span class="dom">3</span>Rogation Monday<span class="sigla">Jas 1:22-27 &middot; John 16:23-30</span></td><td class="white"><span class="dom">4</span>St. Monica<span class="sigla">1 Tim 5:3-10 &middot; 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 &middot; 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 &middot; Mark 16:14-20</span></td><td class="red"><span class="dom">7</span>St. Stanislaus<span class="sigla">Wis 5:1-5 &middot; John 15:1-7</span></td><td class="white"><span class="dom">8</span>Our Lady&#39;s Saturday Office<span class="sigla">Ecclus 24:14-16 &middot; 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 &middot; John 16:23-30</span></td><td class="white"><span class="dom">3</span>Rogation Monday<span class="sigla">Jas 1:22-27 &middot; John 16:23-30</span></td><td class="white"><span class="dom">4</span>St. Monica<span class="sigla">1 Tim 5:3-10 &middot; 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 &middot; 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 &middot; Mark 16:14-20</span></td><td class="red"><span class="dom">7</span>St. Stanislaus<span class="sigla">Wis 5:1-5 &middot; John 15:1-7</span></td><td class="white"><span class="dom">8</span>Our Lady&#39;s Saturday Office<span class="sigla">Ecclus 24:14-16 &middot; 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 &middot; 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 &middot; Matt 25:14-23</span></td><td class="red"><span class="dom">11</span>Sts. Philip &amp; James<span class="sigla">Wis 5:1-5 &middot; John 14:1-13</span></td><td class="red"><span class="dom">12</span>Sts. Nereus, Achilleus, Domitilla, &amp; Pancras<span class="sigla">Wis 5:1-5 &middot; John 4:46-53</span></td><td class="white"><span class="dom">13</span>St. Robert Bellarmine<span class="sigla">Wis 7:7-14 &middot; 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 &middot; 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 &middot; 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 &middot; white &middot; Epistle Jas 1:22-27 &middot; 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 &middot; violet &middot; Epistle Jas 1:22-27 &middot; Gospel John 16:23-30</div>
+ <div class="meta">class-4 &middot; white &middot; Epistle Jas 1:22-27 &middot; Gospel John 16:23-30</div>
<div class="meta">Commemoration Sts. Alexander &amp; 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