diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 04:12:53 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 04:12:53 +0200 |
| commit | c464c0435c650cf019eb6c6ae1906217d557a15f (patch) | |
| tree | 7a5805b8da7e879a19ebff16edb00aedc46c9796 | |
| parent | 079e332e0a797105588787f7e5fdabd95ba1fa12 (diff) | |
| download | colitur-c464c0435c650cf019eb6c6ae1906217d557a15f.tar.gz colitur-c464c0435c650cf019eb6c6ae1906217d557a15f.zip | |
kernel(temporal): Holy Thursday is white, per RG128(b)'s named exception
RG 128(b) excepts "Missa sive Chrismatis sive in Cena Domini feria V
Hebdomadae sanctae" from the Septuagesima-to-Easter-Vigil violet span
as a whole-Mass exception (unlike Palm Sunday's blessing/procession,
which the same sentence carves out as only part of that day) -- so
Holy Thursday's Mass is white, not violet. temporal_ef.ml fell through
to the generic Passiontide ferial path (season_colour Passiontide =
violet) for this date, since [named] has no entry for the Triduum at
all (rank was already correct via [privileged_feria]; only colour was
wrong).
Found via Task 16's missalemeum oracle comparison: every other Triduum
day's oracle colour set includes violet as an option (Good Friday
"bv", Holy Saturday "vw" -- already-flagged, deliberately deferred
per-action gaps, register §3b), but Holy Thursday's is white alone.
This is a genuine NEW divergence from lectio too (lectio has no such
exception and still prints violet for Holy Thursday) -- added as
Layer C11 to the differential harness and data/ef/expected-divergences
.sexp, 46 rows (2005-2050), rather than silently changing what that
harness accepts.
Also corrected a stale comment on season_colour claiming white's RG
paragraph was never pinned -- RG 119 was found and cited in the
register on 2026-08-11 but the correction was never copied into this
file's own comment.
| -rw-r--r-- | data/ef/expected-divergences.sexp | 5 | ||||
| -rw-r--r-- | lib/rites/rite_ef/temporal_ef.ml | 33 | ||||
| -rw-r--r-- | test/test_differential.ml | 16 |
3 files changed, 42 insertions, 12 deletions
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 17bafc1..6b7bbdd 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -67,3 +67,8 @@ (verdict colitur) (note "2011: Sacred Heart (Friday after the Corpus Christi octave) falls on 1 July and impedes the Precious Blood (also 1 July, I class but a lower RG 91 entry). RG 96's walk must skip 2 July (Visitation, II class) and 3 July (Sunday), landing on 4 July (Monday, a free class-4 feria). lectio instead lands Precious Blood on 2 July, illegitimately displacing the Visitation -- exactly what RG 96's \"not I or II class\" clause forbids.") (expected_rows 2)) + ((id C11) + (citation "RG 128(b), primary-source-verified 2026-08-12 (Task 16): \"...a dominica in Septuagesima usque ad Vigiliam paschalem, exceptis: ... Missa sive Chrismatis sive in Cena Domini feria V Hebdomadae sanctae; ...\" -- violet runs Septuagesima to the Easter Vigil EXCEPT (among other things) the Mass of Holy Thursday, named as a whole-Mass exception") + (verdict colitur) + (note "Holy Thursday (\"ef-passiontide-2-thursday\") is white in colitur, per RG 128(b)'s explicit exception -- independently confirmed by the missalemeum oracle (Task 16 report), whose colour set for that day is white alone, unlike the surrounding Triduum days which include violet as an option. lectio has no such exception and prints Passiontide's base violet straight through Holy Thursday. Found via Task 16's oracle comparison, not the original lectio differential (lectio's own colour did not previously disagree, because colitur's own bug matched it) -- fixed in colitur, so this row records a NEW divergence from lectio's still-uncorrected violet, not a pre-existing one.") + (expected_rows 46)) diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml index 52a9adb..b39da79 100644 --- a/lib/rites/rite_ef/temporal_ef.ml +++ b/lib/rites/rite_ef/temporal_ef.ml @@ -314,13 +314,15 @@ let privileged_feria d = (n >= -6 && n <= -1) || (n >= 1 && n <= 6) || (n >= 50 && n <= 55) (* RG 117 enumerates the five colours (white, red, green, violet, black); - RG 127 assigns green and RG 128 violet to the seasons de Tempore below. - White's own specific paragraph (the "B) De colore albo" section, between - 117 and 123) was not pinned by the primary-source search available here -- - left uncited rather than guessed; see register §3 "Colours". *) + RG 127 assigns green and RG 128 violet to the seasons de Tempore below. RG + 119 (register §3b, primary-source-verified 2026-08-11 -- this comment was + stale until Task 16 noticed the correction had not been copied down here): + white "a festo Nativitatis Domini usque ad expletum tempus Epiphaniae" + and "a Missa Vigiliae paschalis usque ad Missam vigiliae Pentecostis + exclusive" -- exactly Christmastide and Paschaltide below. *) let season_colour = function | Advent | Septuagesima | Lent | Passiontide -> Colour.Violet (* RG 128 *) - | Christmastide | Paschaltide -> Colour.White + | Christmastide | Paschaltide -> Colour.White (* RG 119 *) | Time_after_epiphany | Time_after_pentecost -> Colour.Green (* RG 127 *) (* Gaudete (Advent III) and Laetare (Lent IV) are rose: RG 131, "may be used... @@ -411,6 +413,27 @@ let temporal d = let colour = (* The Pentecost octave weekdays are red, not Paschaltide's white. *) if days_between easter d >= 50 && days_between easter d <= 55 then Colour.Red + (* RG 128(b) (docs/research/rules-register.md §3b), primary + text: "...a dominica in Septuagesima usque ad Vigiliam + paschalem, EXCEPTIS: ... MISSA SIVE CHRISMATIS SIVE IN + CENA DOMINI FERIA V HEBDOMADAE SANCTAE; ..." -- violet + runs Septuagesima to the Easter Vigil EXCEPT (among + others) "the Mass, whether of the Chrism or in Cena + Domini [Holy Thursday], on Thursday of Holy Week" -- + named as a WHOLE-MASS exception (unlike Palm Sunday's + "blessing and procession of palms", which the SAME + sentence carves out as only PART of that day, register + §3b's own RG126 note on the not-yet-modelled per-action + nuance), so this is a clean whole-day colour fact, not + a per-action one the day/colour model cannot express. + Task 16, found via the missalemeum oracle comparison: + every other Triduum day's oracle colour SET includes + violet as one option (Good Friday "bv", Holy Saturday + "vw" -- RG 132's black is a separate, ALREADY-flagged + gap, register §3b, not touched here), but Holy + 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 else season_colour s in let week_n = week d in diff --git a/test/test_differential.ml b/test/test_differential.ml index dd601a1..a9bdb91 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -76,13 +76,14 @@ family would still be caught by everything except the digit itself. - Layer C (data/ef/expected-divergences.sexp, matched by - [layer_c_reason] below): the CITED allow-list. Ten genuine liturgical - disagreements, each citing its RG paragraph and stating which engine is - right (always colitur, verified against the Missal/register, never - against lectio's own behaviour -- "lectio does it differently" is not - itself a justification anywhere in this file). This is the ONLY layer - that may cover a difference in rank, colour, or which celebration is - observed; A and B never do (enforced structurally below: A/B only ever + [layer_c_reason] below): the CITED allow-list. Eleven genuine liturgical + disagreements (C11 added by Task 16's oracle work, below), each citing + its RG paragraph and stating which engine is right (always colitur, + verified against the Missal/register, never against lectio's own + behaviour -- "lectio does it differently" is not itself a justification + anywhere in this file). This is the ONLY layer that may cover a + difference in rank, colour, or which celebration is observed; A and B + never do (enforced structurally below: A/B only ever touch the season/slug fields, and Layer C's predicates each require an exact, narrow field-diff SET, not "anything goes"). @@ -448,6 +449,7 @@ let layer_c_reason (l : row) (c : row) diffs = (String.equal l.date "2011-07-02" || String.equal l.date "2011-07-04") && subset diffs [ Slug_f; Rank; Colour_f ] then Some "C10" + else if String.equal c.slug "ef-passiontide-2-thursday" && diffs = [ Colour_f ] then Some "C11" else None (* ---------------------------------------------------------------------- *) |
