diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-18 11:43:13 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-18 11:43:13 +0200 |
| commit | 9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e (patch) | |
| tree | 3b3d4140d0b3feb005a1bf36b52458b662944e3c | |
| parent | cb07b035170eb22e0cff30be6449c74af897cda1 (diff) | |
| parent | 0281a846ac7c22d22990a6664a37205930a94b7d (diff) | |
| download | colitur-9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e.tar.gz colitur-9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e.zip | |
merge: EF rubrical corrections from O'Connell and a published 1962 Ordo
Three colour fixes, each argued from the Missal and each invisible to every
validation layer that shares colitur's own data lineage.
| -rw-r--r-- | data/ef/expected-divergences-missalemeum.sexp | 5 | ||||
| -rw-r--r-- | data/ef/expected-divergences.sexp | 18 | ||||
| -rw-r--r-- | data/ef/sanctoral.sexp | 4 | ||||
| -rw-r--r-- | lib/rites/rite_ef/temporal_ef.ml | 23 | ||||
| -rw-r--r-- | test/test_differential.ml | 22 | ||||
| -rw-r--r-- | test/test_golden.ml | 35 | ||||
| -rw-r--r-- | test/test_oracle.ml | 31 |
7 files changed, 132 insertions, 6 deletions
diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index 593edf9..84b4f25 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -298,3 +298,8 @@ CORRECTED, fix round 1 (coordinator review): the remaining 352 were previously d (verdict colitur) (note "Task 9 (branch ef-lectionary, layer-4 oracle): 25 December, both years. colitur: Heb 1:1-12/John 1:1-14 (\"Missa in die\"); missalemeum's own entry[0]: Titus 2:11-15/Luke 2:1-14 (\"Missa in nocte\"). Both are real, correct, Missal-verifiable citations for 25 December -- this is not a rubric dispute or a data gap either engine is wrong about, a comparator/fixture-extraction artefact (which of several equally-real Masses a multi-Mass day's own JSON array entry[0] happens to be). NOT fixed by changing the extractor's own array-index convention: that convention is deliberate and already verified, in the extraction script's own header, for every OTHER field this fixture reads on a multi-Mass day (rank/colours/tempora/commemorations/displaced, confirmed IDENTICAL across a day's own multiple Masses on all 4 such days, Christmas and All Souls, both years) -- only the CITATION fields are not identical across a day's own Masses, discovered by this task, and changing the index for citations alone while keeping it for everything else would be a second, undeclared convention, not a fix. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 2.") (expected_rows 2)) + ((id M29) + (citation "RG 128, transcribed in docs/research/rules-register.md 3b: violet for vigils of II and III class outside Paschaltide. The Vigil of St Lawrence (9 August, III class) and the Vigil of the Assumption (14 August, II class) both qualify. missalemeum keeps red and white respectively. Corroborated against O'Connell, The Celebration of Mass, 4th ed. (1964, revised to the Codex Rubricarum 1960 and the 1962 Missal), section 4(c), whose footnote 169 names the sole exception -- the Ascension's vigil, inside Eastertide, white -- which colitur already emitted correctly") + (verdict colitur) + (note "ef-oconnell-rubrics branch. Unlike every other entry in this file, the oracle here is not an independent witness against colitur: it is colitur's own discarded ancestor. colitur was bootstrapped from lectio, lectio's ini is generated from missalemeum, and missalemeum uses Divinum Officium's data files, so all three carried the same two wrong colours and no layer sharing that lineage could see it (CLAUDE.md's own lineage note, register 6.20). The defect surfaced only against the Missal's own RG 128 -- transcribed in the register since 2026-08-11 and disagreeing with the shipped data all along -- plus O'Connell and a published 1962 Ordo. Same fix as C37 in the lectio differential, seen from the oracle side. 3 rows in this window: 2026-08-14, 2027-08-09, 2027-08-14. 2026-08-09 is absent because it is a Sunday that year and the vigil never occurs, checked with date -d. Gated on the exact dates and Colour_f alone, so any other divergence on these days would still surface unexplained.") + (expected_rows 3)) diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 9d268fb..a863604 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -172,7 +172,18 @@ CORRECTED, task 8 fix round 1 (coordinator review, Minor): this note previously CORRECTED, fix round 2 (coordinator review, Critical): the first-round fix hand-authored only FOUR of Holy Week's six days (Monday, Tuesday, Thursday, Saturday), reasoning that Wednesday and Good Friday have no unambiguous Epistle and leaving both entirely ABSENT under a separate entry, C24 (now retired). That was worse than the bug it replaced: an absent key does not mean \"no reading\" to Lectionary_ef.readings, it means step 3 silently resumes the preceding SUNDAY -- so Good Friday, which has no Mass at all, was emitting Palm Sunday's own Epistle and Passion narrative, every year. Fixed at the source: the GOSPEL is always unambiguous on both days (one labelled Passion narrative each) and is always authored; the FIRST slot is filled too, using the SAME \"last lesson before the Gospel\" convention already load-bearing elsewhere in data/ef/lectionary.sexp (the Lenten Ember Wednesday entry, itself an identical two-peer-lesson shape, already ships its own second lesson) -- not a fresh editorial invention for this entry. Neither lesson on either day is labelled \"Epistola\" the way Holy Saturday's genuinely is, so this remains a stated convention, not a textual fact, but a consistently-applied one. C24 is retired, not re-adjudicated: its own two-day population now has a real citation and folds into this entry, which covers all SIX days of Holy Week uniformly. lectio, still conflating Holy Week with Passion week on all six days, keeps showing Passion week's own reused citation regardless -- a genuine, permanent, structural divergence, not a data gap on either side that could close. Gated on the literal 6-slug list and `diffs = [ First_f; Gospel_f ]` exactly (identity already agrees on all six -- season/slug/rank/colour were never the problem). NOT simply 46 x 6 = 276: Holy TUESDAY's own hand-authored citation is BYTE-IDENTICAL to lectio's own value (both draw on the identical Missal Mass -- C26 below has the account of why lectio's own ini carries Holy Tuesday's data under a Passion-week key), so all 46 of ITS rows match outright and never reach this entry. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 230 (276 - 46).") - (expected_rows 230)) + (expected_rows 184)) + ; C36 -- Good Friday's colour, split out of C23 (ef-oconnell-rubrics branch). + ; C23's own note says "identity already agrees on all six -- season/slug/rank/ + ; colour were never the problem". That is no longer true of ONE of its six + ; days, so the row moves rather than C23's gate being loosened for all six. + ; 184 + 46 = 230, C23's own former count, no residue -- both numbers derived + ; from the comparator's own output, not hand-counted. + ((id C36) + (citation "RG 128(b), primary text, already transcribed in docs/research/rules-register.md §3b and verified 2026-08-12 (Task 16): Passiontide's violet runs from Septuagesima to the Easter Vigil EXCEPTIS, among others, 'Actione liturgica feria VI in Passione et Morte Domini usque ad Communionem exclusive' -- the Good Friday liturgical action up to Communion exclusive is NOT violet. RG 132 assigns black to it. The register recorded this as an acknowledged gap ('Not currently emitted by Rite_ef.Temporal_ef') rather than a disputed reading; this entry closes it. Corroborated by two witnesses outside the Divinum Officium lineage that colitur, lectio and missalemeum all share: O'Connell, The Celebration of Mass, 4th ed. (1964, revised throughout to the Codex Rubricarum 1960 and the 1962 Missal, imprimatur Nov 1963), section 5 -- 'Black, symbolising mourning, is used on Good Friday (violet for the Communion rite) and for requiem Masses' -- and a published 1962 Ordo, register §6.21. Even missalemeum's own colour SET for this day is 'bv', black first") + (verdict colitur) + (note "ef-oconnell-rubrics branch. Good Friday's own 46 rows used to sit inside C23 with diffs = [First_f; Gospel_f]; they now carry [First_f; Gospel_f; Colour_f] and are gated on that exact triple, so C23's own exact-pair gate is unchanged and still means what its note says for its remaining four days. The citation divergence is C23's cause and unchanged (lectio conflates Holy Week with Passion week and has no Holy Week propers at all); the colour divergence is this branch's own fix, and lectio cannot follow it -- lectio has no Good Friday office distinct from Passion Friday's to colour in the first place, so this is a permanent structural divergence, not a data gap that could close on either side. Per-ACTION residue, stated not hidden: the rubric is 'usque ad Communionem exclusive', so violet returns for the Communion rite; the day/colour model emits ONE colour and black is the day's principal one. That is the SAME already-acknowledged modelling limit RG 126's Palm Sunday blessing carries, not a new one this entry introduces. 46 = one per year over the fixture's 2005-2050 span, no year excepted: Good Friday is I class and can never be impeded, unlike C26/C27/C28 whose populations lose years to competing feasts. Derived from the OCaml comparator's own output, not hand-counted.") + (expected_rows 46)) ; C25 -- CLOSED, BVM Saturday Mass (2026-08-17), REMOVED not re-adjudicated: ; 0 of 16801 rows. It covered `ef-christmas-1-saturday`, a Holy-Name-week ; Saturday with no proper of its own, which resumed the preceding Sunday's @@ -236,3 +247,8 @@ CORRECTED, fix round 1 (coordinator review, Important 1): this note previously d (verdict colitur) (note "The ferias of the week after Trinity Sunday. Trinity is the temporal identity of its own Sunday, so a plain walkback to \"the preceding Sunday's Mass\" lands on Trinity's -- which is what colitur did until this fix and what lectio still does. But RG 299's rule carries an explicit exception, and this week is the clearest instance of it in the year: the Missal prints a NAMED formula for the week immediately after Trinity, precisely BECAUSE the feast has taken the Sunday's own Mass. colitur now resolves these ferias at step 2 from that formula and never reaches step 3's walkback at all. This is test_oracle.ml's own M26 shape 2(a), fixed rather than allow-listed there. Note what this does NOT cover: M26 shape 2(b), the ferias of Christ the King's week, where no proper Mass is assigned (checked directly -- no rubric precedes that Mass heading, scan1.txt:39163ff) and RG 299's DEFAULT therefore governs, making the preceding Sunday's Mass genuinely Christ the King's own. Gated on the literal 5-slug list, requiring the citation difference to be present, and admitting a colour difference only alongside it -- nine of these days are also unoccupied IV-class Saturdays carrying C17's own BVM-Office colour divergence, and a colour-only Saturday must still fall to C17 rather than be absorbed here. No Thursday in the list: Corpus Christi is Easter+60, which IS this week's Thursday every year, so the slug never exists -- the bootstrap's own reachability guard refuses to emit it. Derived from the comparator's own failure output, not hand-counted: 69.") (expected_rows 69)) + ((id C37) + (citation "RG 128, transcribed in docs/research/rules-register.md 3b: violet is used for Advent, Septuagesima to the Easter Vigil (with named exceptions), the September Ember days, and VIGILS OF II AND III CLASS OUTSIDE PASCHALTIDE. The Vigil of St Lawrence (9 August, III class) and the Vigil of the Assumption (14 August, II class) are both outside Paschaltide and are therefore both violet. colitur carried Red and White respectively, bootstrapped from lectio. Corroborated by O'Connell, The Celebration of Mass, 4th ed. (1964, revised throughout to the Codex Rubricarum 1960 and the 1962 Missal), section 4(c) -- violet 'on vigils of II and III class outside Eastertide' -- whose footnote 169 names the SOLE exception: 'the only vigil of II class within Eastertide is that of the Ascension and its colour is white', which colitur already emitted correctly and which is deliberately NOT in this entry's slug list") + (verdict colitur) + (note "ef-oconnell-rubrics branch. The sharpest demonstration in the project of the lineage problem recorded in CLAUDE.md and register 6.20: lectio, missalemeum and colitur all carried the same two wrong colours, because colitur was bootstrapped from lectio, lectio's ini is generated from missalemeum, and missalemeum uses Divinum Officium's data files. Three sources agreeing is one source counted three times. The defect became visible only against witnesses outside that tree -- the Missal's own RG 128 (already transcribed in the register since 2026-08-11, and disagreeing with the shipped data all along), O'Connell, and a published 1962 Ordo. The Ordo is what first flagged the Assumption vigil; O'Connell is what found St Lawrence's, which the Ordo could not give because that source omits the vigil entirely. Gated on the two literal slugs and diffs = [Colour_f] exactly, so a future identity or rank divergence on either day would NOT be absorbed here. 77, not 92: over the fixture's 2005-2050 span each vigil has 46 possible occurrences, and 15 are impeded outright (the vigil yields when its own date falls on a Sunday), so those rows never reach this entry -- both engines agree on the Sunday. Derived from the OCaml comparator's own output, not hand-counted.") + (expected_rows 77)) diff --git a/data/ef/sanctoral.sexp b/data/ef/sanctoral.sexp index dd22754..dca4a9b 100644 --- a/data/ef/sanctoral.sexp +++ b/data/ef/sanctoral.sexp @@ -3173,7 +3173,7 @@ (names ((en "Vigil of St. Lawrence") (pl "Wigilia \197\155w. Wawrzy\197\132ca, M\196\153czennika"))) - (rank Class3) (status Feast) (colour Red) (subject Saint) + (rank Class3) (status Feast) (colour Violet) (subject Saint) (citations (((part First) (reference "Ecclus 51:1-8, 12")) ((part Gospel) (reference "Matt 16:24-27")))) @@ -3196,7 +3196,7 @@ (names ((en "Vigil of the Assumption") (pl "Wigilia Wniebowzi\196\153cia N. M. P."))) - (rank Class2) (status Feast) (colour White) (subject Saint) + (rank Class2) (status Feast) (colour Violet) (subject Saint) (citations (((part First) (reference "Sir 24:23-31")) ((part Gospel) (reference "Luke 11:27-28")))) diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml index fa78cbe..c16732b 100644 --- a/lib/rites/rite_ef/temporal_ef.ml +++ b/lib/rites/rite_ef/temporal_ef.ml @@ -1054,6 +1054,29 @@ let temporal d = Thursday's is white ALONE -- confirming this specific day, and only this one, needs the exception coded. *) else if days_between easter d = -3 then Colour.White + (* RG 128(b)'s THIRD named exception, the same primary + sentence quoted above: "...Actione liturgica feria VI + in Passione et Morte Domini usque ad Communionem + exclusive; ..." -- violet does NOT run through the Good + Friday liturgical action, and RG 132 assigns black + there. Recorded in register §3b as an acknowledged gap + since Task 16 (the comment above says so in as many + words) and closed here on two independent 1962-scoped + witnesses, neither in the Divinum Officium lineage: + O'Connell, *The Celebration of Mass* 4th ed. (1964), + revised to the Codex Rubricarum (1960) and the 1962 + Missal, §5 -- "Black, symbolising mourning, is used on + Good Friday (violet for the Communion rite)" -- and a + published 1962 Ordo (register §6.21, §6.22). + Like Palm Sunday's palms this rubric is per-ACTION + ("usque ad Communionem exclusive") and the day/colour + model emits ONE colour; black is the day's principal + one -- the same judgement missalemeum's own colour SET + makes by ordering Good Friday "bv", black first. The + residual per-action nuance (violet from Communion) is + the SAME already-acknowledged modelling gap RG 126's + palms carry, not a new one. *) + else if days_between easter d = -2 then Colour.Black else season_colour s in (* [triduum_names]'s own citation above: identity only, diff --git a/test/test_differential.ml b/test/test_differential.ml index c9173d6..849bde4 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -893,6 +893,25 @@ let holy_week_slugs = [ "ef-passiontide-2-monday"; "ef-passiontide-2-tuesday"; "ef-passiontide-2-wednesday"; "ef-passiontide-2-thursday"; "ef-passiontide-2-friday"; "ef-passiontide-2-saturday" ] +(* C36 (ef-oconnell-rubrics): Good Friday alone, split out of C23's own + six-slug population because its diff SET grew a third member. RG 128(b) + excepts "Actione liturgica feria VI in Passione et Morte Domini usque ad + Communionem exclusive" from Passiontide's violet and RG 132 assigns black + there -- recorded in register §3b as an acknowledged gap since Task 16 and + closed on this branch. lectio, which has no Holy Week propers at all (C23's + own note), keeps showing Passion week's violet, so colour now differs on + this ONE of C23's six days in addition to the two citation fields. *) +let good_friday_slug = "ef-passiontide-2-friday" + +(* C37 (ef-oconnell-rubrics): RG 128 gives violet to "II/III-class vigils + outside Paschaltide". These two carried Red and White respectively -- + inherited from lectio, which inherited them from missalemeum, which is + generated from Divinum Officium. All three agree with each other and + disagree with the Missal, so no layer sharing that lineage could see it. + The Ascension's vigil is NOT here: it is the one II-class vigil INSIDE + Paschaltide and is correctly white already. *) +let violet_vigil_slugs = [ "vigil-of-st-lawrence"; "vigil-of-the-assumption" ] + (* 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 @@ -1272,6 +1291,9 @@ let layer_c_reason (l : row) (c : row) diffs = and now RG 309(a)'s Mass for it, which answers before step 3's walkback is reached. They still differ from lectio, but for C17's cause, and are filed there. See data/ef/expected-divergences.sexp's own closure note. *) + 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 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_golden.ml b/test/test_golden.ml index a073c52..33ca362 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -329,7 +329,7 @@ let test_annunciation_transfer_inside_holy_week_2016 () = actually reaches a live case" for exactly this reason. *) check ~msg:"2016-03-25 Good Friday: Triduum outranks the Annunciation (RG91 entry 2 > 11), no commemoration" 2016 3 25 - "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=lord \ + "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=black subject=lord \ name_la=Feria VI in Passione et Morte Domini comms=[] in=- out=[annunciation-of-the-blessed-virgin-mary->2016-04-04]"; (* The general RG 96 walk from 26 March would still be inside the Triduum, the Easter octave (all I class, entry 2/10) -- carrying the feast PAST @@ -524,7 +524,7 @@ let test_holy_thursday_is_white_2026 () = name_la=Feria V in Cena Domini comms=[] in=- out=[]"; check ~msg:"2026-04-03 Good Friday: back to violet (RG128) -- Thursday's white is a one-day exception" 2026 4 3 - "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=lord \ + "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=black subject=lord \ name_la=Feria VI in Passione et Morte Domini comms=[] in=- out=[]" (* ------------------------------------------------------------------ *) @@ -1315,9 +1315,38 @@ let test_rogation_wednesday_yields_to_a_feast_2026 () = "2026-05-13 wednesday season=paschaltide week=6 slug=ef-ascension-vigil rank=class-2 colour=white \ subject=temporal name_la=- comms=[robert-bellarmine:ordinary] in=- out=[]" +(* RG 128, transcribed in docs/research/rules-register.md §3b: violet is used + for "II/III-class vigils outside Paschaltide". Two of colitur's five vigils + disagreed with that rule until the ef-oconnell-rubrics branch -- the + Assumption's (II class, 14 August) was White and St Lawrence's (III class, + 9 August) was Red. Both are outside Paschaltide, so both are violet. + + O'Connell, The Celebration of Mass 4th ed. (1964), section 4(c) states the + same rule and its footnote 169 names the sole exception -- "the only vigil + of II class within Eastertide is that of the Ascension and its colour is + white" -- which colitur already emits correctly (ef-ascension-vigil, white, + pinned by the two Rogation Wednesday cases just above). + + Pinned in years where each vigil is actually OBSERVED rather than impeded: + 9 August 2025 is a Saturday and 14 August 2025 a Thursday, both checked + with `date -d`. In 2026, 9 August is a Sunday and the vigil never appears. *) +let test_vigil_of_st_lawrence_is_violet_2025 () = + check ~msg:"RG 128: III-class vigil outside Paschaltide is violet, not red" 2025 8 9 + "2025-08-09 saturday season=time-after-pentecost week=8 slug=vigil-of-st-lawrence \ + rank=class-3 colour=violet subject=saint name_la=- comms=[romanus:ordinary] in=- out=[]" + +let test_vigil_of_the_assumption_is_violet_2025 () = + check ~msg:"RG 128: II-class vigil outside Paschaltide is violet, not white" 2025 8 14 + "2025-08-14 thursday season=time-after-pentecost week=9 slug=vigil-of-the-assumption \ + rank=class-2 colour=violet subject=saint name_la=- comms=[eusebius-confessor:ordinary] in=- out=[]" + let suite = ( "golden pins (known-tricky years)", - [ Alcotest.test_case "Easter extreme: 1598 earliest (22 Mar, Gauss-verified)" `Quick + [ Alcotest.test_case "RG128: St Lawrence's vigil is violet (2025)" `Quick + test_vigil_of_st_lawrence_is_violet_2025; + Alcotest.test_case "RG128: the Assumption's vigil is violet (2025)" `Quick + test_vigil_of_the_assumption_is_violet_2025; + Alcotest.test_case "Easter extreme: 1598 earliest (22 Mar, Gauss-verified)" `Quick test_easter_extreme_1598; Alcotest.test_case "Easter extreme: 1666 latest (25 Apr, Gauss-verified)" `Quick test_easter_extreme_1666; diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 5177716..129c43b 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -1323,6 +1323,21 @@ let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ] to distinguish this population from a genuinely new, unrelated citation bug on some other Time-after-Pentecost feria): the SAME discipline this file's own header names for every other entry here. *) +(* M29 (ef-oconnell-rubrics) -- RG 128: violet for "vigils of II and III + class outside Paschaltide". The Vigil of St Lawrence (9 August, III class) + and the Vigil of the Assumption (14 August, II class) both qualify; + missalemeum keeps red and white respectively, as lectio and colitur also + did before this branch, because all three descend from Divinum Officium's + data files. This is the one divergence class in the file where the oracle + is not an independent witness against colitur at all -- it is colitur's own + discarded ancestor. See data/ef/expected-divergences.sexp's C37, the same + 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`. *) +let m29_dates = + [ "2026-08-14"; "2027-08-09"; "2027-08-14"; "2035-08-09"; "2035-08-14"; "2038-08-09"; + "2038-08-14" ] + let m26_dates = [ "2026-01-03"; "2026-01-10"; "2026-02-14"; "2026-06-02"; "2026-06-03"; "2026-06-20"; "2026-06-27"; "2026-07-04"; @@ -1477,6 +1492,7 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs = List.mem c.c_date m27_dates && 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 None (* ---------------------------------------------------------------------- *) @@ -1919,6 +1935,17 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs = Some "IMPEDED-SUNDAY-COMM (M8's rule, RG 109(a)/111(a))" else if List.mem Comm_identity_unresolved diffs then Some "COMM-IDENTITY-UNRESOLVED (temporal-origin, no English name -- M15's limit)" + (* RG 128 -- the two vigils of II/III class outside Paschaltide whose + colour this branch (ef-oconnell-rubrics) corrected from the values + inherited via lectio from missalemeum's own Divinum Officium data. + Same population as M29 in the 2026-2027 window and C37 in the lectio + differential; named here in this window's own vocabulary. Gated on the + exact date and colour alone, so any other divergence on these days + would still surface. *) + else if + List.mem c.c_date [ "2035-08-09"; "2035-08-14"; "2038-08-09"; "2038-08-14" ] + && diffs = [ Colour_f ] + then Some "VIGIL-COLOUR-RG128 (M29, colitur; see C37)" else None (* COMMEMORATIONS join the live-window comparison (2026-08-18). @@ -2038,6 +2065,10 @@ let test_2038_class_counts () = ("CHRIST-THE-KING-WEEK (M26 shape 2b)", 2); ("CHRISTMAS-MULTI-MASS (M27)", 1); ("COLOUR (M21)", 7); + (* RG 128, ef-oconnell-rubrics: the two vigils of II/III class outside + 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); ("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); |
