From 12b97761019cfa02ca0da8a5fb50ef815d07685c Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 21 Aug 2026 14:42:30 +0200 Subject: feat(ef): implement RG 33's third omission trigger RG 33 omits a II/III-class vigil in three cases: it falls on a Sunday, it falls on a I-class feast, "vel si festum cui praemittitur in alium diem transferri aut ad commemorationem reduci contingat". Only the first two were built; the third was recorded in precedence_ef.ml as unimplemented on the grounds that no witness existed in the shipped data. That reasoning was wrong, and the rule fires on 1 744 days across 1583-9999. Both halves of the clause reduce to one observable question -- is the feast the OBSERVED office on the following day (RG 34 puts it there) -- so the kernel asks it once per candidate, after place_transfers has settled the year. No fixed point is needed: a vigil is a candidate only on its own day, never on its feast's, so suppressing it cannot change what the next day observes. Precedence.rules gains vigil_feast, which returns the slug of the feast a vigil precedes; the kernel cannot infer that itself, because only two of the five vigil/feast pairs share a slug stem. Blast radius, measured pre-change binary vs HEAD over the whole domain and classified: 1 744 days, three shapes, zero unexplained. 1 199 are the feast reduced to a commemoration (10 August on a Sunday, St Lawrence); 478 and 67 are the feast transferred under RG 96 after the Sacred Heart or Corpus Christi takes its day. The Assumption's and the Ascension's vigils never qualify -- their I-class feasts always keep their own day. Independently witnessed, which is unusual here. The published Ordo -- the only witness outside the Divinum Officium -> missalemeum -> lectio lineage -- omits St Lawrence's vigil on 2025-08-09, agreeing with colitur against both engines. That date had been read earlier as an Ordo gap; the Ordo was right, and correcting the misreading is what surfaced this clause. On 2027-08-09 the feast does keep its day and the Ordo omits a vigil colitur correctly keeps, which is a genuine Ordo gap. Allow-lists: C39 (lectio, 10 rows) and a 2038 oracle class citing the register, the 2026-2027 window having no instance. The golden pin asserting St Lawrence's vigil is violet moved 2025 -> 2027; its own comment had reasoned about the vigil's weekday and missed that RG 33 also looks at the feast's. Two new pins cover both shapes of the clause. The vigil/feast table is built with Slug.of_string_exn: mutation testing showed that of_string plus Result.to_option turns a typo into None, which this hook's contract reads as "not a vigil", switching the rule off in silence. Two tests assert the table against the shipped data in both directions. --- data/ef/expected-divergences.sexp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'data/ef') diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index d6cbc5b..f99add0 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -87,6 +87,19 @@ VERDICT, split by the SAME 138-row population, not two entries: on the 119 rows Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own slug family (`nativity_octave_day_slugs`) AND `subset diffs [ Slug_f; First_f; Gospel_f ]` (widened this task from the exact-match `diffs = [ Slug_f ]` the pre-citation-comparison entry used -- narrowing back to exact-match would have silently re-excluded the very citation divergence this task exists to surface). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 138. NARROWED (Nativity-Octave fix, 2026-08-18): 138 -> 119. Nineteen of these days are 26-28 December, which colitur now builds as days WITHIN the Octave of the Nativity (RG 67) rather than generic Christmastide ferias, so their temporal identity -- and with it their divergence shape -- changed. Not a re-adjudication: the same RG 69 disagreement on the days that remain. VERDICT CLOSED 2026-08-18, open -> colitur, because the defect this entry named was FIXED rather than re-argued. The note above splits the old 138 rows into 119 weekday rows, where it already recorded colitur's citation as CONFIRMED CORRECT and said verdict colitur would be accurate for that subset alone, and 19 Sunday rows where colitur emitted the weekday formulary in defiance of RG 69 and was plainly wrong -- a genuine Temporal_ef defect it deliberately left out of scope. Temporal_ef now excludes Sundays from the octave-day branch (register 6.17, confirmed against the oracle: missalemeum shows Sunday in the Octave of Christmas on 2035-12-30 where colitur showed a feria), so those 19 rows no longer occur at all and the count fell 138 -> 119 -- exactly the population this note had already enumerated by date. What remains is only the subset this entry itself certified correct: colitur says the Missal's own Diebus infra octavam formulary, lectio falls back to whichever civil Sunday precedes the date. Verdict colitur, on the reasoning already written here rather than on anything new. NARROWED, not closed, 2026-08-18: still 119 rows, but the CAUSE has halved. lectio now serves the Missal's own 'Diebus infra octavam Nativitatis Domini' Mass on 29-31 December (Titus 3:4-7 / Luke 2:15-20) instead of falling back to the Sunday's, so First_f and Gospel_f no longer differ on any of these days -- what remains is Slug_f alone, colitur's ef-nativity-octave-day-N against lectio's ordinary ef-christmas-N-weekday. That is naming, not disagreement: the two engines now read the same Mass on the same day. This entry's own gate already admits a Slug_f-only subset, which is why the count did not move even though the substantive half of the divergence did.") (expected_rows 119)) + ((id C39) + (citation "RG 33, primary text, docs/research/LT.txt: \"Vigilia II aut III classis penitus omittitur, si occurrat in dominica quavis, aut in festo I classis, vel si festum cui praemittitur in alium diem transferri aut ad commemorationem reduci contingat\" -- \"A vigil of the II or III class is entirely omitted if it occurs on any Sunday whatsoever, or on a feast of the I class, OR IF THE FEAST IT PRECEDES happens to be transferred to another day or reduced to a commemoration.\" The third clause is the one at issue; RG 34 places the feast on the day after its vigil, which is how the rule is evaluated. Register ยง6.31.") + (verdict colitur) + (note "colitur implements all three of RG 33's omission triggers; lectio implements the first two only. On these 10 days the vigil's own weekday is unremarkable -- it is the FEAST that fails to keep its day, either transferred away under RG 96 or reduced to a commemoration under RG 94 -- so lectio still emits the vigil and colitur omits it entirely. + +Two shapes, both in the rubric's own words. SEVEN rows are 'ad commemorationem reduci': 10 August falls on a Sunday, the II-class Sunday outranks St Lawrence's II-class feast (RG 15), the feast is commemorated rather than celebrated, and the vigil of 9 August goes (2008, 2014, 2025, 2031, 2036, 2042 -- and the same shape reaches the 2038 row through the other half). THREE are 'in alium diem transferri': the Sacred Heart takes 24 June, the Nativity of St John the Baptist transfers under RG 96, and its vigil of 23 June goes (2022, 2033, 2038, 2044). + +Domain-wide this clause fires on 1 744 of the 3 074 246 days in 1583-9999 -- 1 199 St Lawrence, 347 St John the Baptist, 198 Sts Peter and Paul -- measured by diffing a pre-change binary against HEAD over the whole domain and classifying every changed day: three shapes, zero unexplained, and every one independently re-checked to confirm the feast really is absent from its own day. + +INDEPENDENTLY WITNESSED, which is rare in this file and is the reason this entry is verdict colitur rather than open. The published Ordo -- the project's only witness outside the Divinum Officium -> missalemeum -> lectio lineage (see CLAUDE.md's own account of why layers 3 and 4 are one lineage, not two) -- omits the vigil on 2025-08-09, agreeing with colitur against both engines. It had been examined earlier in the same session that implemented this rule and misread as an Ordo GAP, on the reasoning that the Missal's calendarium lists the vigil; the calendarium lists it as a fixed entry, which is not a claim about whether it survives a given year's occurrence. The Ordo was right. Two dates were compared and they part company for the correct reason: on 2027-08-09 (10 August a Tuesday, the feast keeps its day) the Ordo omits a vigil colitur correctly keeps, and that one IS an Ordo gap. + +Gated on lectio's own slug being one of the three vigils this clause can reach and colitur's not being a vigil -- identity on both sides, not a diff-set shape. The Assumption's and the Ascension's vigils are absent from that list because their I-class feasts always keep their own day: 0 occurrences across the whole domain, measured rather than assumed.") + (expected_rows 10)) ; C8 -- CLOSED, REMOVED (2026-08-18): 0 of 16801 rows, was 26. lectio builds ; Rogation Monday and Tuesday now (RG 87, Easter+36/+37, violet under ; RG 128(d)). The Wednesday is NOT built there and deliberately so: Easter+38 -- cgit v1.3 From 8072287da9d8e8a9e2de8b7845923f5d576dea55 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 21 Aug 2026 14:46:34 +0200 Subject: docs(C39): correct the shape split, 7/3 -> 6/4 The note apportioned the entry's ten rows as seven commemoration-reduced and three transferred, counting 2038-06-23 in both halves to make the arithmetic work. It is six and four; the row count itself was always right, and is pinned by the comparator. --- data/ef/expected-divergences.sexp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data/ef') diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index f99add0..bba21c1 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -92,7 +92,7 @@ Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own (verdict colitur) (note "colitur implements all three of RG 33's omission triggers; lectio implements the first two only. On these 10 days the vigil's own weekday is unremarkable -- it is the FEAST that fails to keep its day, either transferred away under RG 96 or reduced to a commemoration under RG 94 -- so lectio still emits the vigil and colitur omits it entirely. -Two shapes, both in the rubric's own words. SEVEN rows are 'ad commemorationem reduci': 10 August falls on a Sunday, the II-class Sunday outranks St Lawrence's II-class feast (RG 15), the feast is commemorated rather than celebrated, and the vigil of 9 August goes (2008, 2014, 2025, 2031, 2036, 2042 -- and the same shape reaches the 2038 row through the other half). THREE are 'in alium diem transferri': the Sacred Heart takes 24 June, the Nativity of St John the Baptist transfers under RG 96, and its vigil of 23 June goes (2022, 2033, 2038, 2044). +Two shapes, both in the rubric's own words. SIX rows are 'ad commemorationem reduci': 10 August falls on a Sunday, the II-class Sunday outranks St Lawrence's II-class feast (RG 15), the feast is commemorated rather than celebrated, and the vigil of 9 August goes (2008, 2014, 2025, 2031, 2036, 2042). FOUR are 'in alium diem transferri': the Sacred Heart takes 24 June, the Nativity of St John the Baptist transfers under RG 96, and its vigil of 23 June goes (2022, 2033, 2038, 2044). 6 + 4 = 10, each date checked against the comparator's own output rather than apportioned by hand. Domain-wide this clause fires on 1 744 of the 3 074 246 days in 1583-9999 -- 1 199 St Lawrence, 347 St John the Baptist, 198 Sts Peter and Paul -- measured by diffing a pre-change binary against HEAD over the whole domain and classifying every changed day: three shapes, zero unexplained, and every one independently re-checked to confirm the feast really is absent from its own day. -- cgit v1.3 From afd82f97ff440add51ea3e87c7ab53938443d5a0 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 21 Aug 2026 15:00:03 +0200 Subject: docs(C39): withdraw the Ordo corroboration claim C39 and the 2025 golden pin both claimed the published Ordo independently confirms RG 33's third trigger, because it omits St Lawrence's vigil on 2025-08-09 where lectio and missalemeum keep it. It does not. The Ordo omits that vigil on 2027-08-09 as well, where the clause says to keep it (10 August is a Tuesday, the feast holds its day), and 2026-08-09 is a Sunday where the rule's first trigger omits it anyway. The 2024 date has no row. So the Ordo never shows St Lawrence's vigil on any date it covers, and the 2025 agreement is a blanket gap coinciding with the right answer, not evidence. The rule itself is unaffected: it rests on RG 33's text, which admits no latitude, and on lectio not evaluating the clause at all -- "RG 33" appears nowhere in its production code, and the third trigger cannot emerge from per-day rank comparison because it turns on what is observed the following day. The divergence is architectural, not a disagreement about the rubric. Recorded rather than deleted: the withdrawn claim is why this entry was first written up as unusually well corroborated. --- data/ef/expected-divergences.sexp | 4 +++- test/test_golden.ml | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'data/ef') diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index bba21c1..8078611 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -96,7 +96,9 @@ Two shapes, both in the rubric's own words. SIX rows are 'ad commemorationem red Domain-wide this clause fires on 1 744 of the 3 074 246 days in 1583-9999 -- 1 199 St Lawrence, 347 St John the Baptist, 198 Sts Peter and Paul -- measured by diffing a pre-change binary against HEAD over the whole domain and classifying every changed day: three shapes, zero unexplained, and every one independently re-checked to confirm the feast really is absent from its own day. -INDEPENDENTLY WITNESSED, which is rare in this file and is the reason this entry is verdict colitur rather than open. The published Ordo -- the project's only witness outside the Divinum Officium -> missalemeum -> lectio lineage (see CLAUDE.md's own account of why layers 3 and 4 are one lineage, not two) -- omits the vigil on 2025-08-09, agreeing with colitur against both engines. It had been examined earlier in the same session that implemented this rule and misread as an Ordo GAP, on the reasoning that the Missal's calendarium lists the vigil; the calendarium lists it as a fixed entry, which is not a claim about whether it survives a given year's occurrence. The Ordo was right. Two dates were compared and they part company for the correct reason: on 2027-08-09 (10 August a Tuesday, the feast keeps its day) the Ordo omits a vigil colitur correctly keeps, and that one IS an Ordo gap. +CORRECTED 2026-08-21, BEFORE THIS ENTRY WAS EVER REVIEWED: an earlier version of this note claimed the published Ordo -- the project's one witness outside the Divinum Officium -> missalemeum -> lectio lineage -- INDEPENDENTLY CONFIRMS colitur here, because it omits St Lawrence's vigil on 2025-08-09 where both software engines keep it. That claim does not survive its own check and is withdrawn. The Ordo covers 2024-2027 and omits that vigil on BOTH 2025-08-09 (where this clause says omit) and 2027-08-09 (where it says keep, 10 August being a Tuesday); 2026-08-09 is a Sunday, omitted by the rule's FIRST trigger anyway, and the fixture has no row for 2024-08-09. So the Ordo never shows St Lawrence's vigil on any date it covers, and its agreement on 2025-08-09 is a coincidence of a blanket gap, not evidence of the third trigger. The Ordo has nothing to say here in either direction. Recorded rather than quietly deleted because the withdrawn claim was the reason this entry was first written up as unusually well corroborated, and a reader who saw that framing should be able to see it retracted. + +WHAT THIS ENTRY ACTUALLY RESTS ON, then. Two things, neither of them a second witness. FIRST, the primary text, which admits no interpretive latitude: RG 33 joins three triggers with 'vel'/'aut' and the third is a plain conditional on the feast's own fate. SECOND -- and this is the substantive point -- lectio does not DISAGREE with the clause, it never evaluates it. 'RG 33' appears nowhere in lectio's production code, only in one test file's comments; its Sunday behaviour is emergent from ordinary rank comparison (a II-class Sunday outranks a III-class vigil), not from a transcribed rule. The third trigger cannot emerge that way at all, because it turns on what is observed the day AFTER, and a per-day precedence contest has no access to it. That is exactly why implementing it in colitur required a whole-year pass and a new field on Precedence.rules rather than a branch in disposition. So the divergence is architectural, not exegetical: on these 10 days lectio is not asserting that the vigil survives, it is producing the only answer its shape can produce. missalemeum and Divinum Officium inherit the same limit by lineage. Gated on lectio's own slug being one of the three vigils this clause can reach and colitur's not being a vigil -- identity on both sides, not a diff-set shape. The Assumption's and the Ascension's vigils are absent from that list because their I-class feasts always keep their own day: 0 occurrences across the whole domain, measured rather than assumed.") (expected_rows 10)) diff --git a/test/test_golden.ml b/test/test_golden.ml index b882596..14fbec4 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -1363,10 +1363,14 @@ let test_vigil_of_st_lawrence_is_violet_2027 () = freed IV-class Saturday, which is why this pin reads white and subject=bvm. St Romanus keeps his commemoration either way (RG 111). - Independently witnessed. The published Ordo -- the project's only witness - outside the Divinum Officium -> missalemeum -> lectio lineage -- omits the - vigil on this exact date, and lectio (and so missalemeum) keeps it; both - allow-lists gained cited entries for that disagreement. *) + NOT independently witnessed, and an earlier version of this comment wrongly + said it was. The published Ordo does omit the vigil on this date -- but it + also omits it on 2027-08-09, where this clause says to KEEP it, so it never + shows St Lawrence's vigil at all in the years it covers and cannot + corroborate anything here. This pin rests on RG 33's own text and on the + fact that lectio never evaluates the clause (it appears nowhere in its + production code); see C39's own note in + data/ef/expected-divergences.sexp. *) let test_rg33_vigil_omitted_when_its_feast_is_commemorated_2025 () = check ~msg:"RG 33: 10 Aug 2025 is a Sunday, so St Lawrence is only commemorated and his vigil is \ -- cgit v1.3 From f3ac69d0a679200a48716be065a0fa2e70a2c6da Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 21 Aug 2026 15:04:52 +0200 Subject: docs(C39): O'Connell 1964 confirms the rule and the vigil inventory Replaces the withdrawn Ordo claim with a real one of a different kind. O'Connell, The Celebration of Mass (4th ed., 1964) -- a rubrics commentary contemporary with the 1960 Code, outside the Divinum Officium -> missalemeum -> lectio lineage, already cited here for RG 128 -- states all three of RG 33's triggers in English, the third included, verbatim in substance with the Latin. The same passage confirms vigil_feast_table's membership independently: Christmas Eve and Pentecost I class and so outside the rule; Ascension, Assumption, John the Baptist and Peter & Paul II class; St Lawrence the sole III-class vigil. Five entries, the same five, same class split. It confirms the RULE and the ENTITY LIST, not the 10 days -- O'Connell publishes no day-by-day calendar. The distinction is stated in the note rather than blurred, since blurring it is what the withdrawn Ordo paragraph did. --- data/ef/expected-divergences.sexp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'data/ef') diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 8078611..60c4886 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -98,7 +98,13 @@ Domain-wide this clause fires on 1 744 of the 3 074 246 days in 1583-9999 -- 1 1 CORRECTED 2026-08-21, BEFORE THIS ENTRY WAS EVER REVIEWED: an earlier version of this note claimed the published Ordo -- the project's one witness outside the Divinum Officium -> missalemeum -> lectio lineage -- INDEPENDENTLY CONFIRMS colitur here, because it omits St Lawrence's vigil on 2025-08-09 where both software engines keep it. That claim does not survive its own check and is withdrawn. The Ordo covers 2024-2027 and omits that vigil on BOTH 2025-08-09 (where this clause says omit) and 2027-08-09 (where it says keep, 10 August being a Tuesday); 2026-08-09 is a Sunday, omitted by the rule's FIRST trigger anyway, and the fixture has no row for 2024-08-09. So the Ordo never shows St Lawrence's vigil on any date it covers, and its agreement on 2025-08-09 is a coincidence of a blanket gap, not evidence of the third trigger. The Ordo has nothing to say here in either direction. Recorded rather than quietly deleted because the withdrawn claim was the reason this entry was first written up as unusually well corroborated, and a reader who saw that framing should be able to see it retracted. -WHAT THIS ENTRY ACTUALLY RESTS ON, then. Two things, neither of them a second witness. FIRST, the primary text, which admits no interpretive latitude: RG 33 joins three triggers with 'vel'/'aut' and the third is a plain conditional on the feast's own fate. SECOND -- and this is the substantive point -- lectio does not DISAGREE with the clause, it never evaluates it. 'RG 33' appears nowhere in lectio's production code, only in one test file's comments; its Sunday behaviour is emergent from ordinary rank comparison (a II-class Sunday outranks a III-class vigil), not from a transcribed rule. The third trigger cannot emerge that way at all, because it turns on what is observed the day AFTER, and a per-day precedence contest has no access to it. That is exactly why implementing it in colitur required a whole-year pass and a new field on Precedence.rules rather than a branch in disposition. So the divergence is architectural, not exegetical: on these 10 days lectio is not asserting that the vigil survives, it is producing the only answer its shape can produce. missalemeum and Divinum Officium inherit the same limit by lineage. +INDEPENDENTLY CONFIRMED AT THE RULE LEVEL (2026-08-21), after the Ordo claim above was withdrawn and the question 'can these be checked against an outside source' was put again. O'Connell, The Celebration of Mass (4th ed., 1964), docs/research/oconnell/oconnell-1964.txt:2626-2629 -- a published rubrics commentary contemporary with the 1960 Code, outside the Divinum Officium -> missalemeum -> lectio lineage and independent of the Missal scans, already cited in this project for RG 128: 'A vigil of II or III class is entirely omitted if it falls on any Sunday, or on a feast of I class, OR IF THE FEAST WHICH IT PRECEDES IS TRANSFERRED TO ANOTHER DATE OR HAPPENS TO BE REDUCED TO A COMMEMORATION.' That is RG 33's three triggers in English, the third included, from a source that is neither the primary text this engine transcribes nor any engine derived from it. + +The same passage independently confirms vigil_feast_table's exact membership, which is the other thing no type can check: I class are Christmas Eve and Pentecost ('these take precedence of all feasts and admit no commemoration' -- RG 30, and why they are excluded from the table); II class are 'the eves of the feasts of the Ascension, the Assumption, the birthday of St. John Baptist (June 24), and SS. Peter and Paul (June 29)'; and 'there is only one vigil of III class, ie., the eve of the feast of St. Laurence (August 10)'. Five vigils, the same five, with the same class split the table encodes. + +WHAT IT DOES NOT DO is witness the 10 DAYS. O'Connell states the rule; he publishes no day-by-day calendar, so the individual dates rest on the rule plus colitur's own occurrence machinery. The distinction is kept deliberately, because collapsing it is exactly the error the withdrawn Ordo paragraph above made. + +WHAT THIS ENTRY ALSO RESTS ON. Two things, neither of them a day-level witness. FIRST, the primary text, which admits no interpretive latitude: RG 33 joins three triggers with 'vel'/'aut' and the third is a plain conditional on the feast's own fate. SECOND -- and this is the substantive point -- lectio does not DISAGREE with the clause, it never evaluates it. 'RG 33' appears nowhere in lectio's production code, only in one test file's comments; its Sunday behaviour is emergent from ordinary rank comparison (a II-class Sunday outranks a III-class vigil), not from a transcribed rule. The third trigger cannot emerge that way at all, because it turns on what is observed the day AFTER, and a per-day precedence contest has no access to it. That is exactly why implementing it in colitur required a whole-year pass and a new field on Precedence.rules rather than a branch in disposition. So the divergence is architectural, not exegetical: on these 10 days lectio is not asserting that the vigil survives, it is producing the only answer its shape can produce. missalemeum and Divinum Officium inherit the same limit by lineage. Gated on lectio's own slug being one of the three vigils this clause can reach and colitur's not being a vigil -- identity on both sides, not a diff-set shape. The Assumption's and the Ascension's vigils are absent from that list because their I-class feasts always keep their own day: 0 occurrences across the whole domain, measured rather than assumed.") (expected_rows 10)) -- cgit v1.3