aboutsummaryrefslogtreecommitdiff
path: root/test/test_differential.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 15:07:44 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 15:07:44 +0200
commit35c11c7ccf95acfb35a7ec34edfa86d92da60e4a (patch)
tree63e2e0c8f9c6317f68a52961c7770f72c3ba79c0 /test/test_differential.ml
parent0eae32f67145065b0e4960650ae06c293fd9f272 (diff)
parentf3ac69d0a679200a48716be065a0fa2e70a2c6da (diff)
downloadcolitur-35c11c7ccf95acfb35a7ec34edfa86d92da60e4a.tar.gz
colitur-35c11c7ccf95acfb35a7ec34edfa86d92da60e4a.zip
merge: RG 33's third omission trigger
The last unbuilt clause in the EF module. A II/III-class vigil is omitted entirely when the feast it precedes fails to keep its own day -- 1 744 days across 1583-9999, three verified shapes, zero unexplained. Rule and vigil inventory independently confirmed by O'Connell 1964, outside the Divinum Officium -> missalemeum -> lectio lineage. The 10 affected days in 2005-2050 are allow-listed as C39; no external day-level witness exists, which the note states rather than glosses.
Diffstat (limited to 'test/test_differential.ml')
-rw-r--r--test/test_differential.ml23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index 8423888..8c1dd8d 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -1089,6 +1089,13 @@ let rg69_one_hop_slugs = [ "ef-christmas-1-saturday" ]
(* [layer_c_reason l c diffs] returns the [data/ef/expected-divergences.sexp]
[id] this row-pair's remaining (post Layer A/B) diff set belongs to, or
[None] if nothing here explains it (a genuine, uncovered failure). *)
+(* The three vigils RG 33's third trigger can actually reach on the shipped
+ universal calendar -- see C39 in [layer_c_reason]. Named here rather than
+ written inline so a future slug rename fails in one visible place. *)
+let rg33_vigil_slugs =
+ [ "vigil-of-st-lawrence"; "vigil-of-the-nativity-of-st-john-the-baptist";
+ "vigil-of-sts-peter-paul" ]
+
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
@@ -1135,6 +1142,22 @@ let layer_c_reason (l : row) (c : row) diffs =
colour-only Saturday still falls to C17 and cannot be absorbed here. *)
else if is_bvm_saturday_row c diffs then Some "C17"
else if diffs = [ Colour_f ] && List.mem c.slug audit_colour_corrected_slugs then Some "C18"
+ (* C39 -- RG 33's THIRD omission trigger, implemented 2026-08-21. lectio
+ omits a II/III-class vigil that itself falls on a Sunday (the rule's
+ SECOND trigger) but not one whose FEAST fails to keep its own day, so on
+ these days lectio still shows the vigil and colitur no longer does.
+
+ Gated on LECTIO's own slug being one of the three vigils this clause can
+ reach, and on colitur's NOT being a vigil -- identity on both sides, not
+ merely a diff-set shape, the same discipline C6 and C14 were given. The
+ three are exhaustive here: the Assumption's and the Ascension's vigils
+ can never qualify, because their I-class feasts always keep their own
+ day (measured over the whole 1583-9999 domain, 0 occurrences). *)
+ else if
+ List.mem l.slug rg33_vigil_slugs
+ && (not (List.mem c.slug rg33_vigil_slugs))
+ && subset diffs [ Slug_f; Rank; Colour_f; First_f; Gospel_f ]
+ then Some "C39"
(* 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