aboutsummaryrefslogtreecommitdiff
path: root/test/test_rubrics_ef.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:15:56 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 20:15:56 +0200
commitcd3e03bf3e5b040786838fc3c5639d7c29e9b3b8 (patch)
treee73a7d87dfe7edae72428865c26d6ab851242e17 /test/test_rubrics_ef.ml
parente5e304c4004089ea75ea472ebd56414197a4190f (diff)
downloadcolitur-cd3e03bf3e5b040786838fc3c5639d7c29e9b3b8.tar.gz
colitur-cd3e03bf3e5b040786838fc3c5639d7c29e9b3b8.zip
fix(ef): Rogation Monday/Tuesday are white, not violet (RG 119)
Temporal_ef.temporal's Rogation Monday/Tuesday branch hardcoded Colour.Violet with no citation (data/ef/expected-divergences-lms.sexp's L6, surfaced by the LMS Ordo). RG 119 assigns white to the de-Tempore Office and Mass from the Paschal Vigil Mass to the Pentecost Vigil Mass exclusive; Easter+36/+37 sit inside that window. RG 128's own exhaustive four-case violet list never names Rogation days, and its vigil clause (d) is doubly inapplicable: these are not vigils, and they are inside Paschaltide, not outside it. RG 88 explains the violet actually seen in print sources: "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. Witnessed directly: LMS Ordo 2023-2024, 2024-05-06, "FERIA IV Cl W" with "Gl", the Office and Mass printed separately from the optional violet votive Mass of the Rogations. Cascade verified, not assumed: RG 432(b) omits the Gloria on every violet Mass, so the wrong colour was also silencing the Gloria on these two weekdays even though RG 237(e) (Breviary, ordinary Paschaltide ferias say Te Deum) already made it true underneath. White removes the 432(b) block, and the Gloria now follows Te Deum via 431(a), matching the Ordo's own "Gl" -- confirmed with dedicated golden pins in both test_golden.ml (colour) and test_rubrics_ef.ml (the Gloria flip), 2028-05-22/23 (neither day impeded that year). Closed L6 in data/ef/expected-divergences-lms.sexp. Reopened C8 in data/ef/expected-divergences.sexp (26 of 16801 rows, 2005-2050): lectio independently computes these two days violet too, so the two engines used to agree by sharing the same uncited assumption; colitur's colour is now correct and lectio's is not, so the comparator disagrees again, for the opposite reason. While reopening C8, found and corrected a genuine misattribution in its own prior closure note, which claimed lectio's violet was "RG 128(d)" -- 128(d) governs vigils outside Paschaltide and has nothing to do with Rogation days. Checked docs/research/rules-register.md for the same claim: not present there, but a related conflation was found and corrected at its O'Connell section 4(d) note, which had used a Rogation MASS/procession citation to "confirm" the day's own OFFICE colour. Blast radius measured in-process across the full 1583-9999 domain (throwaway probe, not committed): 4722 days total (2368 Rogation Mondays + 2354 Rogation Tuesdays actually observed outright, i.e. not impeded by a stronger sanctoral feast that year), all Violet->White, all with the Gloria flipping false->true alongside, zero anomalies. Mutation-tested: reverting the branch to Colour.Violet reddens 16 tests across Rubrics_ef, the lectio differential, the LMS Ordo suite and both golden pin files; restored and reconfirmed green (680 tests).
Diffstat (limited to 'test/test_rubrics_ef.ml')
-rw-r--r--test/test_rubrics_ef.ml20
1 files changed, 20 insertions, 0 deletions
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