aboutsummaryrefslogtreecommitdiff
path: root/test/test_differential.ml
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_differential.ml')
-rw-r--r--test/test_differential.ml50
1 files changed, 50 insertions, 0 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index 8c1dd8d..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
@@ -1096,6 +1107,36 @@ let rg33_vigil_slugs =
[ "vigil-of-st-lawrence"; "vigil-of-the-nativity-of-st-john-the-baptist";
"vigil-of-sts-peter-paul" ]
+(* C40 -- the calendarium's own bissextile (leap-year) footnote (February,
+ docs/research/LT.txt:5011-5014; see rite_ef/temporal_ef.ml's
+ [bissextile_fixed_key] for the full citation and mechanism), implemented
+ 2026-08-22. lectio builds no such shift at all (confirmed directly
+ against the fixture: Matthias sits at 24 February and Gabriel of Our Lady
+ of Sorrows at 27 February in EVERY leap year the 2005-2050 fixture
+ covers, 11 of them), so every leap year now diverges on the two shifted
+ civil days: colitur vacates 24/27 February (Matthias/Gabriel move away)
+ and occupies 25/28 February instead, while lectio keeps the pre-shift
+ assignment on both.
+
+ Four shapes, one mechanism -- OLD position vacated (colitur no longer
+ matches lectio's still-there Matthias/Gabriel) and NEW position occupied
+ (colitur now shows a saint lectio's own unmoved date does not) -- each
+ checked by NAME on both sides, the same identity discipline C39 and
+ C6/C14 already apply, not merely a diff-set shape: a coincidental
+ same-shape diff on an unrelated 24/25/27/28 February slug would not match
+ any of the four literal-slug conjuncts below. *)
+let is_bissextile_shift_row (l : row) (c : row) ~month ~day =
+ month = 2
+ && Date.is_leap (year_of_date c.date)
+ && ((day = 24 && String.equal l.slug "matthias" && not (String.equal c.slug "matthias"))
+ || (day = 25 && String.equal c.slug "matthias" && not (String.equal l.slug "matthias"))
+ || (day = 27
+ && String.equal l.slug "gabriel-of-our-lady-of-sorrows"
+ && not (String.equal c.slug "gabriel-of-our-lady-of-sorrows"))
+ || (day = 28
+ && String.equal c.slug "gabriel-of-our-lady-of-sorrows"
+ && not (String.equal l.slug "gabriel-of-our-lady-of-sorrows")))
+
let layer_c_reason (l : row) (c : row) diffs =
let m = month_of_date l.date and d = day_of_date l.date in
if diffs = [] then None
@@ -1158,6 +1199,15 @@ let layer_c_reason (l : row) (c : row) diffs =
&& (not (List.mem c.slug rg33_vigil_slugs))
&& subset diffs [ Slug_f; Rank; Colour_f; First_f; Gospel_f ]
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