aboutsummaryrefslogtreecommitdiff
path: root/test/test_rubrics_ef.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-23 23:01:56 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-23 23:01:56 +0200
commit1252ffa57778331a67d75c2f69722b8ec1a7dbcc (patch)
tree99040b4537f79296b9d105960b3decb944350161 /test/test_rubrics_ef.ml
parent8faf89f89bd6783a518b6fc0b48c6ee452ba2e94 (diff)
downloadcolitur-1252ffa57778331a67d75c2f69722b8ec1a7dbcc.tar.gz
colitur-1252ffa57778331a67d75c2f69722b8ec1a7dbcc.zip
feat(ef): RG 497, the Conversion of St Paul takes the Apostles preface
RG 497 ("in Missis festivis et votivis Apostolorum et Evangelistarum") carries no natalicium restriction, unlike RG 475(e)'s Creed clause -- preface_apostle_slugs already includes one non-natalicium sibling (In Commemoratione S. Pauli, 30 June) on this exact reasoning. conversion-of-st-paul (25 January) was left off pending a witness: the FIUV Ordo's own single window has 25 January impeded by a Sunday. Now witnessed four times, two independent publishers, four civil years: the Latin Mass Society Ordo's 2023-2024 and 2024-2025 editions both read "Pr of the Apostles" on their own unimpeded 25 January (2024, 2025); extraordinaryform.org's 2024-2025Ordo.pdf and 2026-2027Ordo.pdf independently agree on their own unimpeded years (2025, 2027, spot-checked, not wired in as a fixture). Every source's 2026 edition agrees 25 January is impeded that year and produces no data point at all. No source disagreed with the textual reading. Surveyed every other Apostle/Evangelist-named slug in data/ef/sanctoral.sexp before concluding the list needed exactly this one addition: the Dedication of the Basilicas of Sts Peter & Paul (18 November) is confirmed NOT an RG 497 trigger (all three LMS editions read "Pr of the Dedication of a Church", not "Apostles" -- it is about the buildings, not the Apostles in person); the Vigil of Sts Peter & Paul (28 June) is confirmed "Common Pr", corroborating the pre-existing "no vigil ever reaches this branch" comment. Blast radius, measured exhaustively (1583-9999, new permanent sweep in test_rubrics_ef.ml): 7217 domain years have 25 January unimpeded and observed; all 7217 now read Apostles, zero exceptions. Claude-Session: https://claude.ai/code/session_017ZBxCCRM2ojnBupp3SBxV9
Diffstat (limited to 'test/test_rubrics_ef.ml')
-rw-r--r--test/test_rubrics_ef.ml71
1 files changed, 70 insertions, 1 deletions
diff --git a/test/test_rubrics_ef.ml b/test/test_rubrics_ef.ml
index bb3bfed..77654c0 100644
--- a/test/test_rubrics_ef.ml
+++ b/test/test_rubrics_ef.ml
@@ -859,6 +859,22 @@ let test_preface_497_peter_paul () = check_preface "RG 497: Sts Peter & Paul" Pr
let test_preface_497_philip_james_inside_easter_window () =
check_preface "RG 497: Sts Philip & James, inside the Easter window, still [Apostles]" Pref.Apostles 2026 5 11
+(* ---- RG 497 also covers "conversion-of-st-paul" (25 January, Class3,
+ NOT his own natalicium -- {!creed_apostle_slugs} deliberately excludes
+ it from the CREED for exactly that reason, RG 475(e)'s own natalicium
+ restriction). RG 497 carries no such restriction, and unlike
+ {!test_fiuv_ordo.ml}'s own single window (where 25 January falls on a
+ Sunday, hence impeded), the Latin Mass Society Ordo's three editions
+ (test/test_lms_ordo.ml, Preface-witnesses task, 2026-08-23) each carry
+ an unimpeded 25 January in two of their three civil years, 2024 and
+ 2025, and BOTH independently read "Pr of the Apostles" -- 2024-01-25 is
+ the date pinned here, matching the FIRST of those two witnessed
+ years directly (day names elsewhere in this file default to 2026 for
+ uniformity with the FIUV Ordo's own window, but 2026-01-25 is itself
+ impeded by a Sunday, so it cannot witness this branch at all). ---- *)
+let test_preface_497_conversion_of_st_paul () =
+ check_preface "RG 497: the Conversion of St Paul, not his own natalicium, still [Apostles]" Pref.Apostles 2024 1 25
+
(* ---- RG 485(a)/(b): Epiphany itself and its own Baptism commemoration
(a), the wider 7-13 January window (b) -- Holy Family Sunday (11
January 2026) is the live witness that a temporal-origin Sunday inside
@@ -1073,6 +1089,53 @@ let test_exhaustive_preface_season_domain_sweep () =
passiontide_easter
end
+(* ---- BLAST RADIUS, Preface-witnesses task (2026-08-23): adding
+ "conversion-of-st-paul" to {!Rite_ef.Rubrics_ef.preface_apostle_slugs}
+ changes exactly one thing -- the preface on every year's own 25 January
+ WHEN [conversion-of-st-paul] is the day actually observed (impeded, most
+ often by a Sunday, in every other year). Measured directly rather than
+ estimated: every observed occurrence must now read [Apostles], never
+ anything else, and the domain total is printed so the SIZE of this
+ change is on the record, not only its correctness. *)
+let check_conversion_of_st_paul_for_year y (counts : (int * int) ref) =
+ let days = Cal.year ctx layer y in
+ let observed0, wrong0 = !counts in
+ let observed = ref observed0 and wrong = ref wrong0 in
+ Array.iter
+ (fun (d : (V.season, V.rank) LD.t) ->
+ if String.equal (Slug.to_string d.LD.observed.Cel.slug) "conversion-of-st-paul" then begin
+ incr observed;
+ if d.LD.preface <> Some Pref.Apostles then begin
+ incr wrong;
+ Alcotest.failf "%s: conversion-of-st-paul is observed but preface=%s, not Apostles"
+ (Date.to_iso8601 d.LD.date)
+ (match d.LD.preface with Some p -> Pref.to_string p | None -> "NONE")
+ end
+ end)
+ days;
+ counts := (!observed, !wrong)
+
+let test_conversion_of_st_paul_preface_sample () =
+ let counts = ref (0, 0) in
+ for y = 1583 to 1782 do
+ check_conversion_of_st_paul_for_year y counts
+ done;
+ let observed, wrong = !counts in
+ Alcotest.(check int) "zero wrong-preface days in the 200-year sample" 0 wrong;
+ Alcotest.(check bool) "the 200-year sample found real conversion-of-st-paul occurrences" true (observed > 100)
+
+let test_exhaustive_conversion_of_st_paul_preface_sweep () =
+ if Sys.getenv_opt colitur_exhaustive_sweep_env = None then Alcotest.skip ()
+ else begin
+ let counts = ref (0, 0) in
+ for y = 1583 to 9999 do
+ check_conversion_of_st_paul_for_year y counts
+ done;
+ let observed, wrong = !counts in
+ Printf.printf "conversion-of-st-paul preface blast radius 1583..9999: observed=%d wrong=%d\n%!" observed wrong;
+ Alcotest.(check int) "zero wrong-preface days anywhere in the domain" 0 wrong
+ end
+
(* ---- ITEM 1: RG 111(a), the sung-Mass commemoration cap
({!Colitur_kernel.Precedence.sung_mass_commemorations}) -- two real
calendar days, one of each shape, resolved through the identical
@@ -1208,6 +1271,8 @@ let suite =
Alcotest.test_case "RG 497: Sts Peter & Paul" `Quick test_preface_497_peter_paul;
Alcotest.test_case "RG 497: Sts Philip & James, inside the Easter window" `Quick
test_preface_497_philip_james_inside_easter_window;
+ Alcotest.test_case "RG 497: the Conversion of St Paul, not his own natalicium" `Quick
+ test_preface_497_conversion_of_st_paul;
Alcotest.test_case "RG 485(a): Epiphany Day" `Quick test_preface_485a_epiphany_day;
Alcotest.test_case "RG 485(a): the Commemoration of the Baptism of the Lord" `Quick
test_preface_485a_baptism_commemoration;
@@ -1240,4 +1305,8 @@ let suite =
`Quick test_preface_season_invariants_sample;
Alcotest.test_case
"preface domain sweep 1583..9999: window invariants, committed not sampled" `Slow
- test_exhaustive_preface_season_domain_sweep ] )
+ test_exhaustive_preface_season_domain_sweep;
+ Alcotest.test_case "conversion-of-st-paul preface blast radius (sample)" `Quick
+ test_conversion_of_st_paul_preface_sample;
+ Alcotest.test_case "conversion-of-st-paul preface blast radius 1583..9999, committed not sampled" `Slow
+ test_exhaustive_conversion_of_st_paul_preface_sweep ] )