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.ml32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index 8c1dd8d..2f63df6 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -1096,6 +1096,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 +1188,8 @@ 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"
(* 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