diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-18 12:36:07 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-18 12:36:07 +0200 |
| commit | 12edb255c0a2559a59578fd6b5d7784ef04bc386 (patch) | |
| tree | dac3a618fe63e91f4cf9cae4e17b264f25b8a7dc /test | |
| parent | ca4287a6e99e14846f3560106156ef2b1c4b8cf2 (diff) | |
| parent | e07d0b1f49e1bb006b12a5e612453101d9e641a7 (diff) | |
| download | colitur-12edb255c0a2559a59578fd6b5d7784ef04bc386.tar.gz colitur-12edb255c0a2559a59578fd6b5d7784ef04bc386.zip | |
merge: sanctoral status audit and RG 113's first sentence
Two corrections argued from the Missal's own calendarium and rubrics, both
found by consulting primary sources the project already had but had not
fully read.
Diffstat (limited to 'test')
| -rw-r--r-- | test/test_differential.ml | 18 | ||||
| -rw-r--r-- | test/test_lectionary_ef.ml | 10 | ||||
| -rw-r--r-- | test/test_oracle.ml | 37 | ||||
| -rw-r--r-- | test/test_precedence_ef.ml | 28 | ||||
| -rw-r--r-- | test/test_sanctoral_ef.ml | 8 |
5 files changed, 99 insertions, 2 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml index 849bde4..25a690d 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -912,6 +912,19 @@ let good_friday_slug = "ef-passiontide-2-friday" Paschaltide and is correctly white already. *) let violet_vigil_slugs = [ "vigil-of-st-lawrence"; "vigil-of-the-assumption" ] +(* C38 (ef-sanctoral-status): `ubaldus` (16 May) and `didacus` (13 November) + were promoted from Commemoration_only to Feast on the Missal's own + universal calendarium, which ranks both "III classis" outright. lectio + inherits the Commemoration_only status from missalemeum, so where colitur + now observes the saint, lectio still observes the feria -- hence the slug, + rank and both citations differ together. Two exact shapes, not one: + 16 May falls in Paschaltide, whose ferial colour is ALREADY white, so no + colour difference arises there; 13 November is Time after Pentecost, green, + so the white confessor changes it. Both shapes are spelled out rather than + collapsed into a subset check, so a colour difference appearing on 16 May + (or vanishing on 13 November) would surface as unexplained. *) +let promoted_feast_slugs = [ "ubaldus"; "didacus" ] + (* C26 (task 8, fix round 2, coordinator review, Important): Passion week's own real Tuesday Mass (tools/bootstrap_lectionary.ml's own [passion_tuesday_entry] comment has the full Missal citation and both @@ -1294,6 +1307,11 @@ let layer_c_reason (l : row) (c : row) diffs = else if String.equal c.slug good_friday_slug && diffs = [ First_f; Gospel_f; Colour_f ] then Some "C36" else if List.mem c.slug violet_vigil_slugs && diffs = [ Colour_f ] then Some "C37" + else if + List.mem c.slug promoted_feast_slugs + && (diffs = [ Slug_f; Rank; First_f; Gospel_f ] + || diffs = [ Slug_f; Rank; First_f; Gospel_f; Colour_f ]) + then Some "C38" else if List.mem c.slug holy_week_slugs && diffs = [ First_f; Gospel_f ] then Some "C23" else if String.equal c.slug passion_tuesday_slug && diffs = [ First_f; Gospel_f ] then Some "C26" else if String.equal c.slug advent_ember_sat_slug && diffs = [ First_f; Gospel_f ] then Some "C27" diff --git a/test/test_lectionary_ef.ml b/test/test_lectionary_ef.ml index a5a0f6e..d56d187 100644 --- a/test/test_lectionary_ef.ml +++ b/test/test_lectionary_ef.ml @@ -442,11 +442,21 @@ let test_step4_assignment_table () = Alcotest.(check (list (pair string string))) "the Commons assignment table, exactly" [ ("benedict", "common-of-abbots"); + ("didacus", "common-of-a-confessor-not-a-bishop-2"); ("frances-rome", "common-of-non-virgins-2"); ("gregory-the-great", "common-of-supreme-pontiffs"); ("isidore-of-seville", "common-of-doctors"); ("patrick", "common-of-a-confessor-bishop-1"); + (* ef-sanctoral-status: ubaldus and didacus were promoted from + Commemoration_only to Feast on the Missal's own universal + calendarium, which ranks both "III classis" outright with no + commemoration rubric. Each takes its Mass from a Common with only + its own Oratio proper, per its own rubric at its own date, so + neither needed a proper authored -- only an assignment. ubaldus + shares patrick's Common exactly ("Missa Statuit, de Communi + Confessoris Pontificis I loco"). *) ("sts-felicitas-perpetua", "common-of-non-virgins-1"); + ("ubaldus", "common-of-a-confessor-bishop-1"); ("vincent-ferrer", "common-of-a-confessor-not-a-bishop-1") ] assigned diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 129c43b..7ee3848 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -1334,6 +1334,20 @@ let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ] fix seen from the lectio side, and register 6.20 on the shared lineage. Spans all three oracle windows. 2026-08-09 is absent because it is a Sunday that year and the vigil never occurs; checked with `date -d`. *) +(* M30 (ef-sanctoral-status) -- `ubaldus` (16 May) and `didacus` (13 Nov), + promoted from Commemoration_only to Feast on the Missal's own universal + calendarium ("III classis" outright, no commemoration rubric, and a Mass + entry of their own in the Proprium). missalemeum keeps them as + commemorations, so on these days colitur observes the SAINT where the + oracle observes the feria: rank, observed identity and both citations + differ together, and the commemoration colitur used to emit is gone. + Colour differs only on 13 November, where the ferial green gives way to + the confessor's white; 16 May is in Paschaltide, already white. The same + population as C38 in the lectio differential -- and, as there, the oracle + here is colitur's own discarded ancestor rather than an independent + witness (register 6.20). *) +let m30_dates = [ "2026-05-16"; "2026-11-13"; "2027-11-13" ] + let m29_dates = [ "2026-08-14"; "2027-08-09"; "2027-08-14"; "2035-08-09"; "2035-08-14"; "2038-08-09"; "2038-08-14" ] @@ -1493,6 +1507,11 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = && subset diffs [ Observed_identity_unresolved; First_mismatch; Gospel_mismatch ] then Some "M27" else if List.mem c.c_date m29_dates && subset diffs [ Colour_f ] then Some "M29" + else if List.mem c.c_date m30_dates + && subset diffs + [ Rank; Colour_f; Comm_presence; Comm_count; Observed_identity_mismatch; + Comm_identity_unresolved; First_mismatch; Gospel_mismatch ] + then Some "M30" else None (* ---------------------------------------------------------------------- *) @@ -1844,7 +1863,19 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs = nh = 0 || at 0 in let first_is s = match c.c_first with Some f -> contains f s | None -> false in - if contains title "Mass of the B. V. M." then Some "BVM-SATURDAY-MASS (M26 shape 1)" + (* ef-sanctoral-status: `didacus`, promoted to Feast on the Missal's own + calendarium. 13 November 2038 is a SATURDAY, so before the promotion the + day kept RG 78's votive Office of the BVM (nothing else occupied it) and + after it the III-class feast does. Classified here explicitly, ahead of + every other branch, because without it the day falls through to the + BVM-Saturday branch and is labelled as the very office the promotion + REMOVED -- a label that would read as "still a BVM Saturday" and hide the + real cause. Same population as M30 in the 2026-2027 window and C38 in the + lectio differential. 16 May 2038 is a Sunday, so `ubaldus` is impeded and + never reaches this window at all. *) + if c.c_date = "2038-11-13" then + Some "PROMOTED-FEAST-RG-CALENDARIUM (M30, colitur; see C38)" + else if contains title "Mass of the B. V. M." then Some "BVM-SATURDAY-MASS (M26 shape 1)" else if first_is "Col 1:12-20" then Some "CHRIST-THE-KING-WEEK (M26 shape 2b)" else if diffs = [ Colour_f ] && List.mem c.c_observed_slug m21_2038_slugs then Some "COLOUR (M21)" else if first_is "Judith" then Some "JUDITH (M28, register 6.6)" @@ -2069,6 +2100,10 @@ let test_2038_class_counts () = Paschaltide. 2 of 2 possible -- neither 9 nor 14 August 2038 is a Sunday, so both vigils are actually observed that year. *) ("VIGIL-COLOUR-RG128 (M29, colitur; see C37)", 2); + (* ef-sanctoral-status: 13 November 2038 is a Saturday, so the + promoted `didacus` displaces RG 78's BVM Office there. 1 of 2 + possible: 16 May 2038 is a Sunday and `ubaldus` is impeded. *) + ("PROMOTED-FEAST-RG-CALENDARIUM (M30, colitur; see C38)", 1); ("COMM-NAME-FORM (same entity, different English name)", 2); ("COMM-ONLY-TIE-BREAK (RG-under-determined convention -- register 6.16)", 1); ("JOSEPH-ANNUNCIATION-TRANSFER-ORDER (C14's own collision)", 2); diff --git a/test/test_precedence_ef.ml b/test/test_precedence_ef.ml index 790dab6..3f3e070 100644 --- a/test/test_precedence_ef.ml +++ b/test/test_precedence_ef.ml @@ -1170,12 +1170,40 @@ let unrelated_comm_synth = contest; it adds Paul regardless. *) let lent_feria_synth = (cand ~origin:P.Temporal ~rank:V.Class3 "ef-lent-2-monday-synth", P.Privileged, 180) +(* RG 113 sentence ONE (docs/research/rules-register.md §6.26): + "Commemoratio de Tempore fit primo loco." The commemoration OF THE SEASON + is made in the first place; the second sentence's table order governs the + OTHERS. Every other candidate in this table is [origin = P.Temporal] by + [cand]'s own default, so the rule is an identity on them and no existing + row's expectation moves; these two candidates exist to make a MIXED-origin + row possible, which is the only shape that can witness it. + + This file's [admit_cases] is the ONLY place in the whole suite that + asserts commemoration ORDER -- the differential never compares + commemorations, the oracle sorts both sides into a multiset, and + test_golden.ml's own [describe] deliberately sorts its comms field. So a + row here is the only thing standing between this rule and a silent + regression. *) +let sanctoral_hi = + { (cand ~rank:V.Class2 "ef-sanctoral-hi") with P.origin = P.Sanctoral } + +let seasonal_lo = cand ~rank:V.Class3 "ef-seasonal-lo" + let admit_cases = [ (* RG 111 (§4): "I class: none save one privileged." *) ( "I-class day, only an ordinary commemoration due -> none admitted", observed_class1, observed_class1, [ po ordinary_hi P.Ordinary ], [] ); + (* RG 113 s1: the de Tempore commemoration leads, even though the + sanctoral one outranks it on RG 91's table (Class2 beats Class3) and + would therefore come first under sentence TWO alone. Both slots of a + III-class day are filled, so this row tests ORDER, not selection. *) + ( "III-class day, seasonal + sanctoral both admitted -> the SEASONAL one \ + first (RG 113 s1), despite the sanctoral one's higher table position", + observed_class3, observed_class3, + [ po sanctoral_hi P.Ordinary; po seasonal_lo P.Ordinary ], + [ "ef-seasonal-lo"; "ef-sanctoral-hi" ] ); ( "I-class day, ordinary + privileged both due -> only the privileged \ one, regardless of the ordinary one's higher dignity", observed_class1, observed_class1, diff --git a/test/test_sanctoral_ef.ml b/test/test_sanctoral_ef.ml index ebf96dc..5c46edf 100644 --- a/test/test_sanctoral_ef.ml +++ b/test/test_sanctoral_ef.ml @@ -47,7 +47,13 @@ let test_load_and_counts () = let commemoration_only = List.filter (fun e -> e.L.cel.Cel.status = Cel.Commemoration_only) l.L.entries in - Alcotest.(check int) "104 Commemoration_only" 104 (List.length commemoration_only); + (* 102, not 104: ef-sanctoral-status promoted `ubaldus` (16 May) and + `didacus` (13 November) to Feast. Both are ranked "III classis" outright + in the Missal's own universal calendarium, with no commemoration rubric, + and both have their own Mass entry in the Proprium taking its readings + from a Common. They were the ONLY two defects found by auditing all 290 + fixed-date entries against that calendarium -- see the register. *) + Alcotest.(check int) "102 Commemoration_only" 102 (List.length commemoration_only); let class1 = List.filter (fun e -> e.L.cel.Cel.rank = V.Class1) l.L.entries in Alcotest.(check int) "12 Class1" 12 (List.length class1); let temporal_subjects = List.filter (fun e -> e.L.cel.Cel.subject = Sub.Temporal) l.L.entries in |
