summaryrefslogtreecommitdiff
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
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
-rw-r--r--lib/rites/rite_ef/rubrics_ef.ml65
-rw-r--r--lib/rites/rite_ef/rubrics_ef.mli8
-rw-r--r--test/test_rubrics_ef.ml71
3 files changed, 132 insertions, 12 deletions
diff --git a/lib/rites/rite_ef/rubrics_ef.ml b/lib/rites/rite_ef/rubrics_ef.ml
index eea92a9..ce2cfcc 100644
--- a/lib/rites/rite_ef/rubrics_ef.ml
+++ b/lib/rites/rite_ef/rubrics_ef.ml
@@ -884,14 +884,63 @@ let preface_st_joseph_slugs = [ "joseph-spouse-of-the-bl-virgin-mary"; "joseph-t
"conversion-of-st-paul" (25 January, Class3, the SAME "not a
natalicium" shape {!creed_apostle_slugs}'s own citation excludes it
- for) is a plausible SECOND candidate by the identical RG 497 reasoning
- -- deliberately NOT added: it is UNWITNESSED (25 January falls on a
- Sunday, hence impeded, in the one fixture year this engine's Ordo
- evidence covers, {!test_fiuv_ordo.ml}'s own window), and "a wrong
- citation is worse than a missing one" ({!Precedence_ef.marian_slugs}'s
- own citation, the precedent this follows). Left for a future fixture
- year to confirm or refute. *)
-let preface_apostle_slugs = "in-commemoratione-sancti-pauli-apostoli" :: creed_apostle_slugs
+ for) is a SECOND member, by the identical RG 497 reasoning --
+ NOW WITNESSED (Preface-witnesses task, 2026-08-23): unlike
+ {!test_fiuv_ordo.ml}'s own single-year window (where 25 January falls
+ on a Sunday, hence impeded), the Latin Mass Society Ordo's own THREE
+ editions (test/test_lms_ordo.ml) each carry an UNIMPEDED 25 January --
+ two of them fall outside a Sunday (2024, 2025) and both read "Pr of
+ the Apostles" for the Conversion of St Paul, confirmed directly
+ against two INDEPENDENT civil years, not merely two printings of the
+ same one (the third, 2026, is impeded by a Sunday exactly like FIUV's
+ own witness year -- the same date, the same reason, an entirely
+ different underlying calendar fact confirmed twice over, not a
+ coincidence). Added on this evidence.
+
+ A FOURTH and FIFTH informal confirmation, from a SECOND, independent
+ publisher (extraordinaryform.org's own three annual PDFs,
+ docs/research/ordo/2024-2025Ordo.pdf / 2025-2026Ordo.pdf /
+ 2026-2027Ordo.pdf -- characterised, not wired in as an automated layer;
+ see the Preface-witnesses task's own report for why): its own per-day
+ PREFACE table column reads "Apostles" for the Conversion of St Paul on
+ BOTH of its own unimpeded years, 2025-01-25 and 2027-01-25 (its middle
+ edition's 2026-01-25 is impeded by a Sunday, the identical fact the
+ other two sources already independently establish) -- a spot check,
+ not a fixture, but a real cross-publisher agreement on the exact
+ question this list answers.
+
+ SURVEYED, not merely patched: every other Apostle/Evangelist-named
+ slug in data/ef/sanctoral.sexp was checked against this same
+ three-edition LMS witness before deciding this list needed exactly
+ one addition, not more:
+ - "dedication-of-the-basilicas-of-sts-peter-paul" (18 November,
+ Class3) is Peter and Paul's own BASILICAS, not the Apostles
+ themselves -- confirmed NOT an RG 497 trigger in all three LMS
+ editions, identical across all three ("Pr of the Dedication of a
+ Church or Common Pr"), corroborating {!preface_bvm_slugs}'s own
+ "Dedication of a Church" finding rather than RG 497: this feast's
+ own subject is the building, governed by the SAME non-RG-482
+ "extra" preface every other church dedication uses (RG 91 entry
+ 27's own header has the fuller account of this Ordo's option-list
+ shape).
+ - "vigil-of-sts-peter-paul" (28 June) reads "Common Pr" in the LMS
+ Ordo (2024-2025 edition, checked directly) -- confirming, not
+ merely assuming, this branch's own long-standing "no [is_vigil]
+ guard needed, no entry here is ever a vigil slug" comment below:
+ a vigil is not a "festum... votiva" either, the identical RG 21/35
+ taxonomy {!preface_bvm_slugs}'s own [is_vigil] guard already
+ states for the BVM branch above.
+ - No other Peter/Paul/John/Andrew/James/Philip/Bartholomew/Thomas/
+ Matthew/Jude/Simon/Matthias/Mark/Luke/Barnabas-named slug in the
+ shipped data names an Apostle or Evangelist at all (checked by
+ grepping every slug in data/ef/sanctoral.sexp against those ten
+ names): the rest are unrelated same-named saints (e.g. "mark-i", a
+ Pope, {!creed_apostle_slugs}'s own citation; "sts-john-paul", two
+ Roman martyrs unrelated to the Evangelist and the Apostle) or
+ genuinely unreachable RG 110 companions ("peter"/"paul",
+ [Commemoration_only], {!creed_apostle_slugs}'s own citation). *)
+let preface_apostle_slugs =
+ "in-commemoratione-sancti-pauli-apostoli" :: "conversion-of-st-paul" :: creed_apostle_slugs
(* RG 495's own [beatae Mariae Virginis] population is also WIDER than
{!Precedence_ef.marian_slugs}: that list was built for a DIFFERENT
diff --git a/lib/rites/rite_ef/rubrics_ef.mli b/lib/rites/rite_ef/rubrics_ef.mli
index befbf72..c005aaf 100644
--- a/lib/rites/rite_ef/rubrics_ef.mli
+++ b/lib/rites/rite_ef/rubrics_ef.mli
@@ -80,9 +80,11 @@ val preface_holy_cross_slugs : string list
val preface_st_joseph_slugs : string list
(** RG 497's own [Apostolorum et Evangelistarum] population -- WIDER than
- {!creed_apostle_slugs} (no natalicium restriction); see the .ml's own
- citation for the FIUV Ordo evidence and what was deliberately left
- off, unwitnessed. *)
+ {!creed_apostle_slugs} (no natalicium restriction); includes
+ "conversion-of-st-paul" (Preface-witnesses task, 2026-08-23, four
+ independent unimpeded-year confirmations across two publishers -- see
+ the .ml's own citation for the full evidence and the survey of every
+ other Apostle/Evangelist-named slug that was checked and NOT added. *)
val preface_apostle_slugs : string list
(** RG 495's own [beatae Mariae Virginis] population -- WIDER than
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 ] )