summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:55:18 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:55:18 +0200
commit9c96e0afc19925b651e0dfee3bc9182dee72acf0 (patch)
tree5f1fe05d495ddea61f585311f3dbca8bb1062cd8 /test
parentcd3e03bf3e5b040786838fc3c5639d7c29e9b3b8 (diff)
downloadcolitur-9c96e0afc19925b651e0dfee3bc9182dee72acf0.tar.gz
colitur-9c96e0afc19925b651e0dfee3bc9182dee72acf0.zip
fix(ef): ferias after the Ascension repeat its own Mass, not a Sunday's
Ascension has no octave under the 1960 rubrics -- confirmed structurally: the Proprium de Tempore's own table of contents runs straight from "In Ascensione Domini" to "Dominica post Ascensionem" with no per-feria headings in between. Step 3 of the reading chain therefore fell through to Preceding_sunday on every unoccupied weekday in that stretch, walking each one back to the 5th or 6th Sunday after Easter's own citation. The Missal's own Proprium de Tempore carries an explicit marginal rubric immediately after the Ascension's Mass propers, before "Dominica post Ascensionem" begins: "Diebus a feria VI post Ascensionem usque ad feriam VI ante vigiliam Pentecostes inclusive, dicitur Missa de festo Ascensionis, cum Gloria et praefatione de Ascensione, sine Credo et Communicantes proprio" -- every feria without its own proper, from the Friday after the Ascension through the Friday before the Vigil of Pentecost, repeats the Ascension's own Mass. RG 490(b) corroborates independently: it assigns the Ascension preface "tamquam de Tempore" across that identical window, which only makes sense if the Mass actually repeated there is the Ascension's, not a numbered Sunday's (whose own Mass would carry no need for a preface override at all). Witnessed directly, not only inferred from the rubric: the LMS Ordo prints "Mass of the Ascension" literally on every affected day across all three of its fixture windows, in BOTH the tail of Ascension's own week and the following week -- ruling out the alternative reading (that the second week instead resumes "Dominica post Ascensionem"'s own Mass, which a first pass over the FIUV Ordo's own week-labelled titles could suggest at a glance; its own [praef] field for the same two dates independently reads "Ascensionis", resolving the apparent conflict). Implemented as data, not logic, matching this codebase's own established precedent for the identical RG 299 shape (the week after Trinity Sunday, data/ef/lectionary.sexp's [trinity_week_entries]): six new hand-authored entries, [ascension_week_entries] in tools/bootstrap_lectionary.ml, regenerated against a git-pinned copy of lectio's own source ini (SHA-256 verified unchanged) so the regeneration carries no unrelated drift. The window's two Saturdays are deliberately excluded -- RG 78's votive Office of Our Lady on Saturday always wins an otherwise-unoccupied Class4 Saturday first, before step 2 (this fix's own entry point) is ever reached, so an entry for either slug would be dead data. Blast radius measured in-process across the full 1583-9999 domain (throwaway probe, not committed): 16 350 days total across the six slugs, every one resolved via step 2 (Own_slug), zero anomalies, and the window's two Saturdays confirmed to contribute zero hits via this cause across the whole domain, corroborating the RG78-interception reasoning by direct sweep. Closed L2 in data/ef/expected-divergences-lms.sexp. New cited entries: C41 in data/ef/expected-divergences.sexp (95 of 16801 rows, 2005-2050 -- lectio has no equivalent rubric and still walks these ferias back); M31 in data/ef/expected-divergences-missalemeum.sexp (3 rows in the 2026-2027 window, plus the same shape independently reconfirmed in the 2035 and 2038 live-capture windows) -- missalemeum, Divinum Officium's lineage, still gives the same wrong answer colitur itself used to give, which is why these rows used to agree with M18's shape and now escape it (M18 373 -> 370, the same mechanism M23-M27 established when the citation axis was first built). Golden pin: 2031-05-23, the exact date the bug report was filed against. Mutation-tested: reverting data/ef/lectionary.sexp alone (a git-diff capture/restore, not a source-code revert, since the fix is data) reddens 19 tests across the differential, both oracle fixtures, all three LMS Ordo windows, the golden pin, the lectionary unit test and every Render golden template; restored and reconfirmed green (681 tests; 683 under COLITUR_EXHAUSTIVE_SWEEP=1, ~175s).
Diffstat (limited to 'test')
-rw-r--r--test/golden/grid-2027.html2
-rw-r--r--test/golden/grid-2027.ms2
-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.html2
-rw-r--r--test/golden/ordo-2027.md2
-rw-r--r--test/golden/ordo-2027.ms4
-rw-r--r--test/golden/ordo-2027.tex2
-rw-r--r--test/golden/ordo-2027.txt4
-rw-r--r--test/golden/ordo-2027.typ2
-rw-r--r--test/test_differential.ml18
-rw-r--r--test/test_golden.ml29
-rw-r--r--test/test_lectionary.ml38
-rw-r--r--test/test_lms_ordo.ml91
-rw-r--r--test/test_oracle.ml47
16 files changed, 225 insertions, 24 deletions
diff --git a/test/golden/grid-2027.html b/test/golden/grid-2027.html
index 6741ad7..92a73ec 100644
--- a/test/golden/grid-2027.html
+++ b/test/golden/grid-2027.html
@@ -134,7 +134,7 @@
<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>
+ <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">Acts 1:1-11 &middot; Mark 16:14-20</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>
</tr>
<tr>
<td class="red"><span class="dom">16</span>Pentecost Sunday (Whitsunday)<span class="sigla">Acts 2:1-11 &middot; John 14:23-31</span></td><td class="red"><span class="dom">17</span>Monday of Pentecost Week<span class="sigla">Acts 10:34, 42-48 &middot; John 3:16-21</span></td><td class="red"><span class="dom">18</span>Tuesday of Pentecost Week<span class="sigla">Acts 8:14-17 &middot; John 10:1-10</span></td><td class="red"><span class="dom">19</span>Pentecost Ember Wednesday<span class="sigla">Acts 5:12-16 &middot; John 6:44-52</span></td><td class="red"><span class="dom">20</span>Thursday of Pentecost Week<span class="sigla">Acts 8:5-8 &middot; Luke 9:1-6</span></td><td class="red"><span class="dom">21</span>Pentecost Ember Friday<span class="sigla">Joel 2:23-24; 2:26-27 &middot; Luke 5:17-26</span></td><td class="red"><span class="dom">22</span>Pentecost Ember Saturday<span class="sigla">Rom 5:1-5 &middot; Luke 4:38-44</span></td>
diff --git a/test/golden/grid-2027.ms b/test/golden/grid-2027.ms
index 4f71416..3432d8f 100644
--- a/test/golden/grid-2027.ms
+++ b/test/golden/grid-2027.ms
@@ -767,7 +767,7 @@ T} T{
T} T{
\fB14\fP \s-2Friday of the 7th Week of Eastertide\s+2
.br
-\s-21 Pet 4:7-11 \(bu John 15:26-27; 16:1-4\s+2
+\s-2Acts 1:1-11 \(bu Mark 16:14-20\s+2
T} T{
\fB15\fP \s-2Vigil of Pentecost\s+2
.br
diff --git a/test/golden/grid-2027.tex b/test/golden/grid-2027.tex
index d81bdb4..1585bda 100644
--- a/test/golden/grid-2027.tex
+++ b/test/golden/grid-2027.tex
@@ -152,7 +152,7 @@
\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{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{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 }{ Acts 1:1-11\ \textperiodcentered\ Mark 16:14-20 } & \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
\cellcolor{cgreen}\daycell{ 30 }{ 2nd Sunday after Pentecost }{ 2nd Class }{ 1 John 3:13-18\ \textperiodcentered\ Luke 14:16-24 } & \cellcolor{cwhite}\daycell{ 31 }{ Queenship of the Blessed Virgin Mary }{ 2nd Class }{ Ecclus 24:5; 14:7; 14:9-11; 24:30-31\ \textperiodcentered\ Luke 1:26-33 } & & & & & \\ \hline
diff --git a/test/golden/grid-2027.typ b/test/golden/grid-2027.typ
index b9e1d0e..cc4d440 100644
--- a/test/golden/grid-2027.typ
+++ b/test/golden/grid-2027.typ
@@ -2207,7 +2207,7 @@
#text(weight: "bold")[14] #text(size: 6.5pt)[Friday of the 7th Week of Eastertide]
#v(1fr)
#text(size: 6pt)[4th Class] \
- #text(size: 6pt)[1 Pet 4:7\-11 #sym.dot.c John 15:26\-27; 16:1\-4]
+ #text(size: 6pt)[Acts 1:1\-11 #sym.dot.c Mark 16:14\-20]
]
],
diff --git a/test/golden/ordo-2027.adoc b/test/golden/ordo-2027.adoc
index d5660a0..93a233d 100644
--- a/test/golden/ordo-2027.adoc
+++ b/test/golden/ordo-2027.adoc
@@ -952,7 +952,7 @@ Epistle Wis 7:7-14 Gospel Matt 5:13-19
*14* Friday of the 7th Week of Eastertide +
class-4 · white +
-Epistle 1 Pet 4:7-11 Gospel John 15:26-27; 16:1-4
+Epistle Acts 1:1-11 Gospel Mark 16:14-20
+
Commemoration St. Boniface
diff --git a/test/golden/ordo-2027.html b/test/golden/ordo-2027.html
index 1b621e4..2a3f5e1 100644
--- a/test/golden/ordo-2027.html
+++ b/test/golden/ordo-2027.html
@@ -730,7 +730,7 @@
</div>
<div class="day white">
<span class="dom">14</span>Friday of the 7th Week of Eastertide
- <div class="meta">class-4 &middot; white &middot; Epistle 1 Pet 4:7-11 &middot; Gospel John 15:26-27; 16:1-4</div>
+ <div class="meta">class-4 &middot; white &middot; Epistle Acts 1:1-11 &middot; Gospel Mark 16:14-20</div>
<div class="meta">Commemoration St. Boniface</div>
</div>
<div class="day red">
diff --git a/test/golden/ordo-2027.md b/test/golden/ordo-2027.md
index d4acf1d..c90b65e 100644
--- a/test/golden/ordo-2027.md
+++ b/test/golden/ordo-2027.md
@@ -853,7 +853,7 @@
**14** Friday of the 7th Week of Eastertide
-`class-4` · white · Epistle 1 Pet 4:7-11 · Gospel John 15:26-27; 16:1-4
+`class-4` · white · Epistle Acts 1:1-11 · Gospel Mark 16:14-20
- Commemoration St. Boniface
diff --git a/test/golden/ordo-2027.ms b/test/golden/ordo-2027.ms
index 7bc8c89..c9e6f5e 100644
--- a/test/golden/ordo-2027.ms
+++ b/test/golden/ordo-2027.ms
@@ -1464,9 +1464,9 @@ May
.br
\s74th Class \(bu White\s9
.br
-\s7Epistle 1 Pet 4:7-11\s9
+\s7Epistle Acts 1:1-11\s9
.br
-\s7Gospel John 15:26-27; 16:1-4\s9
+\s7Gospel Mark 16:14-20\s9
.br
\s7Commemoration St. Boniface\s9
.sp 0.25v
diff --git a/test/golden/ordo-2027.tex b/test/golden/ordo-2027.tex
index e8ec59f..0debd17 100644
--- a/test/golden/ordo-2027.tex
+++ b/test/golden/ordo-2027.tex
@@ -1648,7 +1648,7 @@
\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 14 \fontsize{7}{9}\selectfont\mdseries\;Friday\hfill\swatch{licolwhite}\\
\fontsize{9}{9.7}\selectfont\bfseries Friday of the 7th Week of Eastertide\\
-\fontsize{6.5}{7.4}\selectfont\mdseries 4th Class \textperiodcentered\ White \quad Epistle\ 1 Pet 4:7-11 \quad Gospel\ John 15:26-27; 16:1-4 \\
+\fontsize{6.5}{7.4}\selectfont\mdseries 4th Class \textperiodcentered\ White \quad Epistle\ Acts 1:1-11 \quad Gospel\ Mark 16:14-20 \\
\fontsize{6.5}{7.4}\selectfont\mdseries Commemoration\ St. Boniface
\end{tcolorbox}
diff --git a/test/golden/ordo-2027.txt b/test/golden/ordo-2027.txt
index e0073ec..b2c68a3 100644
--- a/test/golden/ordo-2027.txt
+++ b/test/golden/ordo-2027.txt
@@ -790,8 +790,8 @@ May 2027
14 Friday of the 7th Week of Eastertide
class-4 · white
- Epistle 1 Pet 4:7-11
- Gospel John 15:26-27; 16:1-4
+ Epistle Acts 1:1-11
+ Gospel Mark 16:14-20
Commemoration St. Boniface
15 Vigil of Pentecost
diff --git a/test/golden/ordo-2027.typ b/test/golden/ordo-2027.typ
index ce5e0ca..23afb88 100644
--- a/test/golden/ordo-2027.typ
+++ b/test/golden/ordo-2027.typ
@@ -1589,7 +1589,7 @@
#set par(leading: 0.36em)
#text(weight: "bold")[14] #h(2mm) #text(size: 7pt)[Friday] #h(1fr) #swatch("white") \
#text(weight: "bold")[Friday of the 7th Week of Eastertide] \
- #text(size: 6.5pt)[4th Class #sym.dot.c White #h(2mm) Epistle 1 Pet 4:7\-11 #h(2mm) Gospel John 15:26\-27; 16:1\-4] \
+ #text(size: 6.5pt)[4th Class #sym.dot.c White #h(2mm) Epistle Acts 1:1\-11 #h(2mm) Gospel Mark 16:14\-20] \
#text(size: 6.5pt)[Commemoration St. Boniface]
]
diff --git a/test/test_differential.ml b/test/test_differential.ml
index 2f63df6..222328b 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -550,6 +550,17 @@ let jan_6_13_slug slug =
let nativity_octave_day_slugs =
[ "ef-nativity-octave-day-5"; "ef-nativity-octave-day-6"; "ef-nativity-octave-day-7" ]
+(* C41 (celebrant-rubrics-phase1, Bug 2, 2026-08-22): the six ferias
+ between the Ascension and the Friday before the Vigil of Pentecost that
+ repeat the Ascension's own Mass (data/ef/lectionary.sexp's own
+ [ascension_week_entries], bootstrap_lectionary.ml). The window's two
+ Saturdays are excluded here too, for the identical reason they carry no
+ lectionary entry: RG 78's votive Office of Our Lady wins first. *)
+let ascension_week_slugs =
+ [ "ef-easter-6-friday"; "ef-easter-7-monday"; "ef-easter-7-tuesday"; "ef-easter-7-wednesday";
+ "ef-easter-7-thursday"; "ef-easter-7-friday"
+ ]
+
(* C18 (ef-sanctoral-audit, 2026-08-14): the closed set of colitur
[status = Feast] sanctoral slugs whose bootstrapped [colour] was
corrected against RG 124 (data/ef/adjustments.sexp's own audit-block
@@ -1190,6 +1201,13 @@ let layer_c_reason (l : row) (c : row) diffs =
then Some "C39"
else if is_bissextile_shift_row l c ~month:m ~day:d && subset diffs [ Slug_f; Rank; Colour_f; First_f; Gospel_f ]
then Some "C40"
+ (* C41 -- the Ascension-repeat rubric (see [ascension_week_slugs]'s own
+ citation above). SAME slug both sides ([Slug_f] never diffs here: the
+ six slugs already exist in lectio's own EF walkback, only their
+ resolved TEXT differs), rank/season/colour agree (both an ordinary
+ Class4 Paschaltide feria), and only the citation itself changes. *)
+ else if List.mem c.slug ascension_week_slugs && subset diffs [ First_f; Gospel_f ]
+ then Some "C41"
(* C25 -- CLOSED, BVM Saturday Mass (2026-08-17), predicate removed: 0 rows.
Its days are unoccupied IV-class Saturdays, so they carry RG 78's office
and now RG 309(a)'s Mass for it, which answers before step 3's walkback
diff --git a/test/test_golden.ml b/test/test_golden.ml
index 3a6f3f5..c916a54 100644
--- a/test/test_golden.ml
+++ b/test/test_golden.ml
@@ -1281,6 +1281,33 @@ let test_readings_displaced_sunday_feria_known_divergent () =
2026 10 26
"2026-10-26 slug=ef-time-after-pentecost-22-monday first=Col 1:12-20. gospel=John 18:33-37"
+(* ---- The Ascension-repeat rubric (celebrant-rubrics-phase1 Bug 2 fix,
+ 2026-08-22) ----
+
+ The Missale Romanum's own Proprium de Tempore carries an explicit
+ marginal rubric immediately after the Ascension's own Mass propers
+ (scan1.txt:20749-20754, both scans corroborate): "Diebus a feria VI post
+ Ascensionem usque ad feriam VI ante vigiliam Pentecostes inclusive,
+ dicitur Missa de festo Ascensionis" -- every feria without its own
+ proper, from the Friday after the Ascension through the Friday before
+ the Vigil of Pentecost, repeats the Ascension's own Mass (Acts 1:1-11 /
+ Mark 16:14-20), not the preceding Sunday's. Witnessed directly: the LMS
+ Ordo prints "Mass of the Ascension" literally on every affected day of
+ this shape across all three of its own fixture windows
+ (data/ef/expected-divergences-lms.sexp's own now-closed L2).
+
+ 2031-05-23 is the exact day the bug report this task fixed was filed
+ against: the day after Ascension Thursday (2031-05-22, Easter+39), an
+ unoccupied Friday that step 3 used to walk back to
+ "ef-easter-sunday-6" -- the 5th Sunday after Easter, the wrong answer
+ -- instead of resolving at step 2 through the new
+ data/ef/lectionary.sexp entry. WHEN THIS PIN'S OWN VALUE WOULD REVERT TO
+ "Iac 1:22-27"/"Ioann 16:23-30" the fix has regressed; update it
+ deliberately then, never to make the suite pass again without checking
+ why. *)
+let test_readings_ascension_week_repeat () =
+ check_readings ~msg:"the day after Ascension repeats the Ascension's own Mass, not the 5th Sunday after Easter's"
+ 2031 5 23 "2031-05-23 slug=ef-easter-6-friday first=Acts 1:1-11 gospel=Mark 16:14-20"
(* ---- Rogation Wednesday (RG 87/88/89), movable-date-specs task ----
@@ -1596,6 +1623,8 @@ let suite =
Alcotest.test_case
"readings: displaced-Sunday feria pins M26 shape 2(b)'s KNOWN-WRONG walkback (2026-10-26)" `Quick
test_readings_displaced_sunday_feria_known_divergent;
+ Alcotest.test_case "readings: the Ascension-repeat rubric, the reported bug's own date (2031-05-23)" `Quick
+ test_readings_ascension_week_repeat;
Alcotest.test_case "RG87: Rogation Wednesday admitted (2024)" `Quick
test_rogation_wednesday_admitted_2024;
Alcotest.test_case "RG87/113: Rogation Wednesday yields to an impeded feast (2026)" `Quick
diff --git a/test/test_lectionary.ml b/test/test_lectionary.ml
index 7dbb253..59c739d 100644
--- a/test/test_lectionary.ml
+++ b/test/test_lectionary.ml
@@ -115,8 +115,14 @@ let test_ef_data_file_loads () =
([epiphanytide_opening_entries], +15); TWO hand-authored
directly from the Missal, two major movable feasts with
previously no entry at all ([movable_feast_entries], +2).
- 116 + 1 + 6 + 1 + 2 + 3 + 2 + 15 + 2 = 148. *)
- Alcotest.(check int) "entry count" 153
+ 116 + 1 + 6 + 1 + 2 + 3 + 2 + 15 + 2 = 148.
+ celebrant-rubrics-phase1, Bug 2 (2026-08-22): SIX hand-authored
+ directly from the Missal's own marginal Ascension-repeat rubric
+ ([ascension_week_entries], +6, 153 -> 159) -- see that
+ function's own comment in bootstrap_lectionary.ml for the
+ citation and why the window's two Saturdays are deliberately
+ excluded. *)
+ Alcotest.(check int) "entry count" 159
(List.length (Lectionary.entries l));
(match Lectionary.find l (slug "ef-lent-1-monday") with
| Some [ a; b ] ->
@@ -179,6 +185,34 @@ let test_ef_data_file_loads () =
scans). *)
check_entry "ef-corpus-christi" "1 Cor 11:23-29" "John 6:56-59";
check_entry "ef-sacred-heart" "Eph 3:8-12, 14-19" "John 19:31-37";
+ (* celebrant-rubrics-phase1, Bug 2: the Missal's own marginal rubric
+ after the Ascension's own Mass propers ("Diebus a feria VI post
+ Ascensionem usque ad feriam VI ante vigiliam Pentecostes
+ inclusive, dicitur Missa de festo Ascensionis") repeats the
+ Ascension's own citation on the ferias that would otherwise walk
+ back to the wrong Sunday. Two families pinned (the tail of
+ Ascension's own week; the following week), not merely one, the
+ same "more than one weekday" discipline this file already uses
+ for the Lent Ember pins above. *)
+ check_entry "ef-easter-6-friday" "Acts 1:1-11" "Mark 16:14-20";
+ check_entry "ef-easter-7-monday" "Acts 1:1-11" "Mark 16:14-20";
+ check_entry "ef-easter-7-friday" "Acts 1:1-11" "Mark 16:14-20";
+ (* [ef-easter-6-saturday] keeps its own PRE-EXISTING entry, unchanged
+ by this task -- RG 78's votive Office of Our Lady always wins an
+ otherwise-unoccupied Class4 Saturday first ([readings]' own step
+ ordering runs that branch before step 2 is ever reached), so this
+ table's own value for that slug is dead data on shipped data, but
+ it was already there before this task and touching it is out of
+ scope. [ef-easter-7-saturday] must stay ABSENT instead: that civil
+ day is the Vigil of Pentecost, a NAMED day with its own slug and
+ Mass (temporal_ef.ml's own [named]), so the generic
+ [ef-<season>-<week>-<weekday>] ferial slug this table's new
+ entries key off never gets produced there at all -- an entry
+ would be unreachable data [assert_reachable] would have refused
+ to emit, checked here too as a direct regression net. *)
+ (match Lectionary.find l (slug "ef-easter-7-saturday") with
+ | None -> ()
+ | Some _ -> Alcotest.fail "ef-easter-7-saturday: must stay absent -- the Vigil of Pentecost, named, never a ferial slug");
check_entry "ef-nativity-vigil" "Rom 1:1-6" "Matt 1:18-21";
check_entry "ef-pentecost-ember-wed" "Acts 5:12-16" "John 6:44-52.";
check_entry "ef-pentecost-ember-fri" "Joel 2:23-24; 26-27" "Luke 5:17-26";
diff --git a/test/test_lms_ordo.ml b/test/test_lms_ordo.ml
index ed1c871..32ecfbc 100644
--- a/test/test_lms_ordo.ml
+++ b/test/test_lms_ordo.ml
@@ -333,7 +333,8 @@ let expected_named_sunday_override slug ~year =
else None
(* See Task 6's own [ascension_week_override] citation (test_lms_ordo.ml
- history, expected-divergences-lms.sexp L2): STRUCTURAL, not a fixture
+ history, data/ef/expected-divergences-lms.sexp's own now-CLOSED L2,
+ celebrant-rubrics-phase1 Bug 2, 2026-08-22): STRUCTURAL, not a fixture
artefact -- the Ascension is a fixed Easter+39, so every feria whose own
[Preceding_sunday] fallback would otherwise resolve to a week-6/7 Sunday
falls, in SOME years, between Ascension Thursday and the following
@@ -341,11 +342,39 @@ let expected_named_sunday_override slug ~year =
the finding: it is specifically the days AFTER Ascension (not merely
"any week-6/7 Preceding_sunday day") that get this treatment -- see
[expected_preceding_sunday_override]'s own citation for the Rogation
- Monday counter-example that exposed the difference. [is_ascension_week]
+ Monday counter-example that exposed the difference. [is_after_ascension]
below is the corrected predicate: the day's own DATE compared against
- {!Computus.ascension} for its own year, not [n]. *)
+ {!Computus.ascension} for its own year, not [n].
+
+ FIXED (celebrant-rubrics-phase1, Bug 2): data/ef/lectionary.sexp's new
+ [ascension_week_entries] now answers these six ferial slugs directly at
+ step 2 (Own_slug), so [check_formulary_overrides]'s own [Preceding_sunday]
+ branch below never reaches them any more -- moved to a dedicated
+ [Own_slug] branch in that same function, which still asserts the Ordo's
+ override reads exactly [ascension_week_override], now as a genuine
+ confirmation that colitur's OWN citation matches (previously this
+ predicate only served to EXCLUDE the population from the general
+ Preceding_sunday mapping, because colitur had no correct answer to
+ compare). This constant and [is_after_ascension] itself are still load-
+ bearing for that confirmation -- kept, not deleted, the same "the
+ regression net survives its own fix" discipline
+ data/ef/expected-divergences-lms.sexp's own L6 note states for
+ [is_l6_rogation_colour]. *)
let ascension_week_override = "Mass of the Ascension"
+(* The exact six slugs data/ef/lectionary.sexp's own [ascension_week_entries]
+ (tools/bootstrap_lectionary.ml) now answers at step 2 -- gated on SLUG
+ IDENTITY, not merely [is_after_ascension date], because that date range
+ also covers "Dominica post Ascensionem" and the Vigil of Pentecost, both
+ genuinely [Own_slug] and both carrying their OWN, different citation, not
+ the Ascension's (caught live: an earlier, date-only version of this gate
+ wrongly flagged both as missing an Ordo override before this list was
+ added). *)
+let ascension_week_slugs =
+ [ "ef-easter-6-friday"; "ef-easter-7-monday"; "ef-easter-7-tuesday"; "ef-easter-7-wednesday";
+ "ef-easter-7-thursday"; "ef-easter-7-friday"
+ ]
+
(* Bounded ABOVE by Pentecost, not merely "later than Ascension" -- a bare
lower bound is wrong for any date past Ascension in the SAME civil year
(every date from June to December satisfies "> Ascension", which a
@@ -431,7 +460,34 @@ let check_formulary_overrides ordo colitur =
:: !bad
| None ->
bad := Printf.sprintf "%s: unmapped (colitur resumed %S) and Ordo shows no override" o.date slug :: !bad))
- | Some { MF.via = MF.Votive; _ } | Some { MF.via = MF.Own_slug; _ } | None -> ())
+ | Some { MF.via = MF.Own_slug; said } -> (
+ (* celebrant-rubrics-phase1, Bug 2 fix: the six Ascension-week
+ ferias moved from [Preceding_sunday] (the branch above, which
+ used to special-case them via [is_after_ascension]) to
+ [Own_slug] -- data/ef/lectionary.sexp's own
+ [ascension_week_entries] now answers at step 2, before step 3
+ is ever reached. Checked HERE, not merely left to fall through
+ silently the way every OTHER [Own_slug] day already does
+ (RG 299's ordinary case, a real proper Mass, needs no Ordo
+ cross-check because nothing about it is adjudicated): this is
+ the one [Own_slug] population this suite has an OUTSIDE
+ witness for, and losing that check when the fix landed would
+ have been a silent regression net, not merely dead code -- the
+ Ordo's own override text must still read "Mass of the
+ Ascension" on exactly these days. *)
+ let slug = match said with Some s -> Colitur_kernel.Slug.to_string s | None -> "" in
+ if List.mem slug ascension_week_slugs then
+ match o.formulary_override with
+ | Some got when String.equal got ascension_week_override -> incr ascension_week
+ | Some got ->
+ bad :=
+ Printf.sprintf "%s: colitur resolved %S via Own_slug (after Ascension), Ordo shows %S, not %S"
+ o.date slug got ascension_week_override
+ :: !bad
+ | None ->
+ bad := Printf.sprintf "%s: colitur resolved %S via Own_slug (after Ascension), Ordo shows no override"
+ o.date slug :: !bad)
+ | Some { MF.via = MF.Votive; _ } | None -> ())
pairs;
{ fc_bad = List.rev !bad; fc_proper = !proper; fc_common = !common; fc_preceding_sunday = !preceding_sunday;
fc_ascension_week = !ascension_week }
@@ -733,7 +789,7 @@ let make_suite ~label ~fixture_path ~fixture_sha256 ~window_first ~window_last ~
Alcotest.(check int) (Printf.sprintf "%d Preceding_sunday days in the window" expected_preceding_sunday)
expected_preceding_sunday r.fc_preceding_sunday;
Alcotest.(check int)
- (Printf.sprintf "%d Preceding_sunday days fall in the Ascension-week exclusion, no more, no fewer"
+ (Printf.sprintf "%d Ascension-week days resolve via Own_slug and match the Ordo's own override, no more, no fewer"
expected_ascension_week)
expected_ascension_week r.fc_ascension_week
in
@@ -797,19 +853,38 @@ let suite_2023_2024 =
Own_slug is excluded). Matthias himself moves to 25 February, an
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_preceding_sunday 61 -> 60 (celebrant-rubrics-phase1, Bug 2
+ fix, 2026-08-22): the window's own single Ascension-week day
+ (2024-05-06 was BEFORE Ascension that year and never counted here in
+ the first place -- see [ascension_week_override]'s own citation; the
+ real Ascension-week day this window carries is elsewhere in May)
+ now resolves via Own_slug (step 2, data/ef/lectionary.sexp's new
+ [ascension_week_entries]), not Preceding_sunday -- it leaves this
+ bucket's population the same way a Proper day already does, while
+ expected_ascension_week itself is UNCHANGED (1): the same day is
+ still counted, just via check_formulary_overrides' own new
+ Own_slug branch instead of its Preceding_sunday one. *)
+ ~expected_bvm_votive:12 ~expected_proper:181 ~expected_common:2 ~expected_preceding_sunday:60
~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"
~fixture_sha256:"da817b75c5bf40ed3be1d5f6890b199705e02ce4d42111253ab8547bccabc3f7" ~window_first:"2024-11-27"
~window_last:"2025-12-31" ~year_lo:2023 ~year_hi:2026 ~allow_list_path ~expected_rows:400
- ~expected_bvm_votive:14 ~expected_proper:179 ~expected_common:2 ~expected_preceding_sunday:66
+ (* expected_preceding_sunday 66 -> 63 (celebrant-rubrics-phase1, Bug 2
+ fix): this window's own three Ascension-week days move from
+ Preceding_sunday to Own_slug, the same reasoning as the 2023-2024
+ window's own note above; expected_ascension_week stays 3. *)
+ ~expected_bvm_votive:14 ~expected_proper:179 ~expected_common:2 ~expected_preceding_sunday:63
~expected_ascension_week:3 ~expected_gloria_l5:5 ~expected_gloria_l6:0
let suite_2025_2026 =
make_suite ~label:"lms-ordo-2025-2026" ~fixture_path:"fixtures/lms-ordo-2025-2026.sexp"
~fixture_sha256:"8839a61e0c7d1e6c8326114f4f45a5c183551287a88f4ed01127154add6ae5a5" ~window_first:"2025-11-28"
~window_last:"2026-12-31" ~year_lo:2024 ~year_hi:2027 ~allow_list_path ~expected_rows:399
- ~expected_bvm_votive:13 ~expected_proper:174 ~expected_common:2 ~expected_preceding_sunday:68
+ (* expected_preceding_sunday 68 -> 66 (celebrant-rubrics-phase1, Bug 2
+ fix): this window's own two Ascension-week days move from
+ Preceding_sunday to Own_slug, the same reasoning as the 2023-2024
+ window's own note above; expected_ascension_week stays 2. *)
+ ~expected_bvm_votive:13 ~expected_proper:174 ~expected_common:2 ~expected_preceding_sunday:66
~expected_ascension_week:2 ~expected_gloria_l5:6 ~expected_gloria_l6:0
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index f1d1a89..01938e1 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -1381,6 +1381,33 @@ let m26_dates =
citation fields are not, discovered by this task). *)
let m27_dates = [ "2026-12-25"; "2027-12-25" ]
+(* M31 (celebrant-rubrics-phase1, Bug 2, 2026-08-22) -- the six ferias
+ between the Ascension and the Friday before the Vigil of Pentecost that
+ repeat the Ascension's own Mass by an explicit marginal rubric in the
+ Proprium de Tempore (data/ef/lectionary.sexp's own [ascension_week_
+ entries], full citation there and in this file's sibling
+ data/ef/expected-divergences.sexp's own C41). Only three of the six
+ civil dates this window's own [c_date] range can reach are actually
+ unoccupied in 2026-2027: 2026-05-21, 2026-05-22 and 2027-05-14 (the
+ other three fall to a real sanctoral feast both engines already agree
+ on). missalemeum -- Divinum Officium's own lineage, the SAME lineage
+ lectio inherited this defect from before colitur's own bootstrap --
+ still walks these ferias back to the preceding Sunday's Mass, the
+ pre-fix answer colitur itself used to give; [Observed_identity_
+ unresolved] fires alongside because none of the three is a SANCTORAL-
+ origin day (the mapping this whole file's own header describes cannot
+ name a TEMPORAL office's title either way, unrelated to this cause). *)
+let m31_dates = [ "2026-05-21"; "2026-05-22"; "2027-05-14" ]
+
+(* The exact six slugs data/ef/lectionary.sexp's own [ascension_week_entries]
+ answers -- reused by [classify_2038]/[classify_2035] below, which key on
+ slug identity rather than a date list (those two live windows are not
+ scoped the way the 2026-2027 fixture is). *)
+let ascension_week_slugs =
+ [ "ef-easter-6-friday"; "ef-easter-7-monday"; "ef-easter-7-tuesday"; "ef-easter-7-wednesday";
+ "ef-easter-7-thursday"; "ef-easter-7-friday"
+ ]
+
(* The oracle's own row went unused when M2 -- its one reader, via
[o.o_title] -- was closed/removed (see the comment above [m1_dates]), and
was kept as a named, typed parameter rather than dropped from the
@@ -1512,6 +1539,8 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
[ Rank; Colour_f; Comm_presence; Comm_count; Observed_identity_mismatch;
Comm_identity_unresolved; First_mismatch; Gospel_mismatch ]
then Some "M30"
+ else if List.mem c.c_date m31_dates && subset diffs [ Observed_identity_unresolved; First_mismatch; Gospel_mismatch ]
+ then Some "M31"
else None
(* ---------------------------------------------------------------------- *)
@@ -1992,6 +2021,16 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs =
List.mem c.c_date [ "2035-08-09"; "2035-08-14"; "2038-08-09"; "2038-08-14" ]
&& diffs = [ Colour_f ]
then Some "VIGIL-COLOUR-RG128 (M29, colitur; see C37)"
+ (* The Ascension-repeat rubric (celebrant-rubrics-phase1, Bug 2; see M31
+ in this file's own 2026-2027 [layer_m_reason] and C41 in
+ data/ef/expected-divergences.sexp for the full citation). 2038 carries
+ three unoccupied instances the 2026-2027 window did not (2038-06-07/
+ 08/09, all week-7 weekdays); 2035 carries one (2035-05-08). Gated on
+ colitur's own slug rather than on the date list this window's sibling
+ windows use, the same style [m21_2038_slugs] already establishes for
+ a live-window slug-keyed class. *)
+ else if List.mem c.c_observed_slug ascension_week_slugs && diffs = [ First_mismatch; Gospel_mismatch ] then
+ Some "ASCENSION-WEEK-REPEAT (M31, colitur; register, Bug 2)"
else None
(* COMMEMORATIONS join the live-window comparison (2026-08-18).
@@ -2129,7 +2168,13 @@ let test_2038_class_counts () =
("MISSAL-TWO-PART-CITATION (register 6.9)", 1);
("COMM-IDENTITY-UNRESOLVED (temporal-origin, no English name -- M15's limit)", 2);
("PERPETUA-COMMON (register 6.8)", 1);
- ("PETER-COMPANION-ABSENT-UPSTREAM (M19)", 1)
+ ("PETER-COMPANION-ABSENT-UPSTREAM (M19)", 1);
+ (* celebrant-rubrics-phase1, Bug 2: 2038-06-07/08/09 (the Monday,
+ Tuesday and Wednesday of the week after the Sunday after the
+ Ascension) are unoccupied that year, all three landing on the
+ Ascension-repeat rubric -- see M31 (2026-2027 window) and C41
+ (data/ef/expected-divergences.sexp) for the full citation. *)
+ ("ASCENSION-WEEK-REPEAT (M31, colitur; register, Bug 2)", 3)
]
|> List.sort compare
in