From 6e62e499aed1c5a31a18bcf5e9eaa7f2b0c4ff2e Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 27 Aug 2026 00:37:45 +0200 Subject: fix(of): break the movable-BVM-memorial tie per a CDWDS Notification Mary, Mother of the Church (Easter+50) and the Immaculate Heart of Mary (Easter+69) are both movable obligatory memorials that can land on a FIXED obligatory memorial's own date -- e.g. 2011-06-13 and 2015-06-13, both against Anthony of Padua. Both candidates banded identically at Tabula III.10 (100, both universal Memoria_obligatoria), a tie band could not break, so Precedence.resolve's kernel-level alphabetical Slug.compare tie-break silently picked instead -- 892 days for Mater Ecclesiae and 1109 for the Immaculate Heart across 1583-9999, all one shape (measured against the pre-fix alphabetical order directly, zero unexplained). Searched the corpus rather than inventing a rule. colitur's two previously-checked primary sources really are silent: the 2018 decree (AAS 110, 437-438) never addresses universal-calendar coincidence, and Normae n. 14's third clause resolves only two AD-LIBITUM memorials colliding. A third source resolves it: the CDWDS's own "Notification on the Memorial of the Blessed Virgin Mary, Mother of the Church" (24 March 2018 -- same dicastery and signatories as the decree; published only on vatican.va, confirmed absent from the AAS 2018 combined index) states that when this memorial "coincides with another Memorial of a Saint or Blessed... the Memorial of the Blessed Virgin Mary is to prevail," and extends the identical reasoning to the Immaculate Heart of Mary by name. This is a rubric, not colitur's own reasoned choice. Implemented as a sub-rank of 95, strictly between Tabula entries 9 and 10 -- the same "fits between neighbours" technique this module already uses elsewhere -- scoped to the two named slugs rather than [subject = Bvm], since the Notification's own reasoning is specifically about a memorial's link to a movable solemnity of the Lord, not a blanket Marian precedence. Golden pin updated: test_rite_of.ml's 2011-06-13 tie now pins Mary, Mother of the Church as observed (was Anthony of Padua, labelled "known arbitrary"), with the header rewritten to state the outcome now rests on the Notification, not a coin-flip. The litcal oracle allow-list gains L10: litcal's own grade vocabulary has no representation for a 95 sub-rank (everything Memoria_obligatoria reads "Memorial"), a representational gap in litcal, not a computational disagreement -- the identity axis is untouched and needed no new entry. --- test/test_rite_of.ml | 65 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 27 deletions(-) (limited to 'test/test_rite_of.ml') diff --git a/test/test_rite_of.ml b/test/test_rite_of.ml index 42c9c98..1de3614 100644 --- a/test/test_rite_of.ml +++ b/test/test_rite_of.ml @@ -373,21 +373,32 @@ let test_holy_family_fallback_1583_now_correct () = worked example that amendment header itself names (Easter 24 April 2011, so Easter+50 = 13 June -- re-derived here, not trusted from the comment). - KNOWN ARBITRARY, not KNOWN WRONG: unlike the two tests above, there is no - rubric this contradicts. The 2018 decree (AAS 110, 437-438) is silent on - a universal-calendar coincidence with an existing obligatory memorial, and - Normae n. 14's own third clause resolves only the AD-LIBITUM/AD-LIBITUM - case ("Si eodem die plures inscribuntur in calendario memoriae ad - libitum") -- it does not reach two OBLIGATORY memorials. So colitur's - Slug.compare tie-break ("anthony-of-padua-priest-and-doctor" sorts before - "mary-mother-of-the-church") is not this project inventing a rule; it is - the kernel's own generic, rite-agnostic fallback, applied here for lack of - a rite-specific one. This test pins that CURRENT behaviour so a future - Calendar/kernel change, a slug rename, or a future overlay cannot flip - which of the two is observed with no test going red -- the same shape of - invisible-drift risk the EF side's RG 113/[band] fidelity work (`ef-rg16a`, - register ยง6.1) eliminated on that side. *) -let test_mater_ecclesiae_anthony_tie_2011_known_arbitrary () = + RESOLVED (W3, of-known-wrongs, 2026-08-26) ON A RUBRIC, NOT COLITUR'S OWN + JUDGEMENT -- this test used to pin the OPPOSITE outcome ("KNOWN + ARBITRARY", the kernel's generic alphabetical Slug.compare tie-break, + for lack of anything rite-specific). That framing is now WRONG, not + merely superseded: colitur's own two previously-checked primary sources + really are silent (the 2018 decree, AAS 110, 437-438, on universal- + calendar coincidence; Normae n. 14's third clause, which resolves only + the AD-LIBITUM/AD-LIBITUM case, "Si eodem die plures inscribuntur in + calendario memoriae ad libitum") -- but a THIRD primary source, found by + searching the corpus rather than invented, does resolve it: the CDWDS's + own "Notification on the Memorial of the Blessed Virgin Mary, Mother of + the Church" (24 March 2018, same dicastery and signatories as the decree; + published only on vatican.va, confirmed absent from the AAS 2018 + combined index) states plainly that when this memorial "coincides with + another Memorial of a Saint or Blessed... the Memorial of the Blessed + Virgin Mary is to prevail." See {!Rite_of.Precedence_of.movable_bvm_ + memorials}'s own comment for the full Latin, the official English, and + why the same rule also covers the Immaculate Heart of Mary (the + Notification names both, by the identical link-to-a-Lord's-solemnity + argument). {!Rite_of.Precedence_of.band} now gives both a sub-rank of + 95, strictly between Tabula entries 9 and 10, so this is no longer a + coin-flip the kernel settles for lack of a rite rule -- it is the rite + rule, cited. This test still pins CURRENT behaviour, for the identical + invisible-drift reason the original comment gave; what changed is which + behaviour is correct to pin. *) +let test_mater_ecclesiae_anthony_tie_2011_resolved () = let easter_2011 = Computus.gregorian_easter 2011 in Alcotest.(check string) "2011 Easter is really 24 April (the Easter+50 trigger)" "2011-04-24" (Date.to_iso8601 easter_2011); @@ -404,18 +415,18 @@ let test_mater_ecclesiae_anthony_tie_2011_known_arbitrary () = let days = Cal.year real_of_rite real_of_layer 2010 in let june13 = Array.to_list days |> List.find (fun d -> Date.compare d.LD.date tie_date = 0) in Alcotest.(check string) - "KNOWN ARBITRARY (no rubric decides this; see this test's own header): the kernel's generic \ - alphabetical tie-break observes Anthony of Padua, not Mary Mother of the Church" - "anthony-of-padua-priest-and-doctor" (slug_of june13.LD.observed); - let mater_ecclesiae_omitted = - List.exists (fun (c, _) -> slug_of c = "mary-mother-of-the-church") june13.LD.omitted + "RESOLVED (W3): the CDWDS's own 24 March 2018 Notification (see this test's own header) makes \ + Mary, Mother of the Church prevail, not Anthony of Padua" + "mary-mother-of-the-church" (slug_of june13.LD.observed); + let anthony_omitted = + List.exists (fun (c, _) -> slug_of c = "anthony-of-padua-priest-and-doctor") june13.LD.omitted in Alcotest.(check bool) - "and Mary, Mother of the Church is recorded in `omitted`, not silently dropped -- {!Colitur_kernel \ + "and Anthony of Padua is recorded in `omitted`, not silently dropped -- {!Colitur_kernel \ .Liturgical_day.t.omitted}'s own contract" - true mater_ecclesiae_omitted; - Alcotest.(check bool) "she carries no commemoration either (OF's own admit always returns [])" false - (List.exists (fun (c, _) -> slug_of c = "mary-mother-of-the-church") june13.LD.commemorations) + true anthony_omitted; + Alcotest.(check bool) "he carries no commemoration either (OF's own admit always returns [])" false + (List.exists (fun (c, _) -> slug_of c = "anthony-of-padua-priest-and-doctor") june13.LD.commemorations) let suite = ( "Rite_of (real data: assembled Rite.t end-to-end via Calendar/Validate)", @@ -434,6 +445,6 @@ let suite = Day is a Sunday (1583)" `Quick test_holy_family_fallback_1583_now_correct; Alcotest.test_case - "KNOWN ARBITRARY pinned: Mary Mother of the Church vs Anthony of Padua tie, 2011-06-13 \ - (Easter+50)" `Quick - test_mater_ecclesiae_anthony_tie_2011_known_arbitrary ] ) + "RESOLVED (W3): Mary Mother of the Church beats Anthony of Padua's tie, 2011-06-13 \ + (Easter+50), per the CDWDS's 24 March 2018 Notification" `Quick + test_mater_ecclesiae_anthony_tie_2011_resolved ] ) -- cgit v1.3