From 1252ffa57778331a67d75c2f69722b8ec1a7dbcc Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sun, 23 Aug 2026 23:01:56 +0200 Subject: 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 --- test/test_rubrics_ef.ml | 71 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) (limited to 'test/test_rubrics_ef.ml') 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 ] ) -- cgit v1.3