diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-11 23:41:33 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-11 23:41:33 +0200 |
| commit | 3583448631c1f1cf0767728d605a858fcb810cfc (patch) | |
| tree | 83975a3e6afde5b4bae42e3649bb03940716f928 | |
| parent | 2ad350e0f97a99f76ac1d2d95cfa210f7393c777 (diff) | |
| download | colitur-3583448631c1f1cf0767728d605a858fcb810cfc.tar.gz colitur-3583448631c1f1cf0767728d605a858fcb810cfc.zip | |
rite(ef): an impeded I-class Sunday commemorates, not transfers
disposition's Class1 branch was unconditional on rank, so an impeded
I-class Sunday (Advent/Lent/Passiontide/Low Sunday) currently
transferred like a feast. RG 95 (register lines 323, 363) restricts the
right of translation to I-class FEASTS -- RG 91's own table lists
Sundays as a separate row (entry 6, line 332) from feasts (entries
11-13, lines 337-339) -- and RG 109(a) (line 374) lists "of a Sunday"
as a privileged commemoration category, which presupposes an impeded
Sunday stays put rather than moving to another day.
Excludes is_sunday_slug losers from the Transfer branch so they fall
through to the existing Commemorate (privilege_of loser) branch, which
already tags them Privileged via RG 109(a) with no further change.
Fires on real dates in the 2005-2050 differential window: 24 December
on Advent IV in 2023, 2028, 2034, 2045; 8 December on an Advent Sunday
in 2024, 2030, 2041.
Verified no previously-passing Transfer assertion used a Sunday-shaped
loser (grepped test_precedence_ef.ml, test_calendar.ml -- which uses
its own synthetic rite unrelated to Precedence_ef.disposition --
test_colitur.ml, test_validate.ml); confirmed by mutation-reverting the
fix and observing exactly the one new test fail, nothing else.
| -rw-r--r-- | lib/rites/rite_ef/precedence_ef.ml | 36 | ||||
| -rw-r--r-- | lib/rites/rite_ef/precedence_ef.mli | 27 | ||||
| -rw-r--r-- | test/test_precedence_ef.ml | 22 |
3 files changed, 64 insertions, 21 deletions
diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml index 06bbf7c..ff6f991 100644 --- a/lib/rites/rite_ef/precedence_ef.ml +++ b/lib/rites/rite_ef/precedence_ef.ml @@ -383,20 +383,34 @@ let disposition ~(winner : Vocab_ef.rank Precedence.candidate) I-class vigil (Nativity, Pentecost) impeded on its own Sunday/ I-class-feast terms would wrongly transfer instead of vanishing. *) Precedence.Omit - else if cel.Celebration.rank = Class1 then - (* RG 95: only I-class feasts have the right of translation. This is the + else if + cel.Celebration.rank = Class1 + && not (is_sunday_slug (Slug.to_string cel.Celebration.slug)) + then + (* RG 95 (register lines 323, 363): only I-class FEASTS have the right + of translation -- RG 91's own table lists Sundays as a separate row + (entry 6, register line 332) from feasts (entries 11-13, register + lines 337-339), so a Sunday is never a "feast" in RG 95's sense, and + [is_sunday_slug] (the same marker RG 33's [impedes_vigil] and RG + 109(a)'s [privilege_of] already use) excludes it here. This is the branch that completes Task 7's All Souls fix (register line 334, RG - 91 entry 8): All Souls is I class and not a vigil, so once it loses - to an occurring Sunday it reaches here and transfers -- to 3 - November per the register, but WHERE it lands is - Rite.transfer_target's job (RG 96), not this function's; disposition - only says THAT it moves. *) + 91 entry 8): All Souls is I class, not a vigil, and not a Sunday + slug, so once it loses to an occurring Sunday it still reaches here + and transfers -- to 3 November per the register, but WHERE it lands + is Rite.transfer_target's job (RG 96), not this function's; + disposition only says THAT it moves. *) Precedence.Transfer else - (* RG 95's other branch, for everything below I class: "aut - commemorantur aut penitus omittuntur" -- commemorated or wholly - omitted. Which of the two survives is RG 108-111's admission count - ([admit], below), not this function's decision; this only opens the + (* RG 95's other branch: "aut commemorantur aut penitus omittuntur" -- + commemorated or wholly omitted. Reached by everything below I class, + AND by an impeded I-class Sunday (excluded from the [Transfer] branch + above): RG 109(a) (register line 374) lists "of a Sunday" as a + privileged commemoration category, which presupposes an impeded + Sunday stays put rather than moving to another day the way a feast + does -- [privilege_of] tags it [Privileged] via the same + [is_sunday_slug] marker, with no further code needed here. Which of + commemorate/omit survives is RG 108-111's admission count ([admit], + below), not this function's decision; this only opens the commemoration, tagged with its real RG 109 privilege via [privilege_of]. diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli index 9c3af95..e1b3638 100644 --- a/lib/rites/rite_ef/precedence_ef.mli +++ b/lib/rites/rite_ef/precedence_ef.mli @@ -78,19 +78,26 @@ val sunday_marker : string - a [Class1] or [Class2] loser whose slug marks it a vigil ({!vigil_suffix}) is [Omit] when the winner is any Sunday ({!sunday_marker}) or itself [Class1] (RG 33 -- entirely omitted, not merely commemorated); - - any other [Class1] loser is [Transfer] (RG 95 -- only I class has the - right of translation; this is also what moves All Souls, register - line 334, once it loses to an occurring Sunday -- WHERE it lands is - {!Rite.t.transfer_target}'s job, not this function's); - - everything else is [Commemorate], carrying its real RG 109 privilege - (see {!admit} below). + - any other [Class1] loser that is NOT a Sunday ({!sunday_marker}) is + [Transfer] (RG 95, register lines 323, 363 -- only I-class FEASTS have + the right of translation; RG 91's own table lists Sundays as a + separate row, entry 6, from feasts, entries 11-13, so a Sunday is + never a "feast" in RG 95's sense and does not transfer even when + impeded by a higher I-class day. This is also what moves All Souls, + register line 334, once it loses to an occurring Sunday -- WHERE it + lands is {!Rite.t.transfer_target}'s job, not this function's); + - everything else -- including an impeded I-class Sunday -- is + [Commemorate], carrying its real RG 109 privilege (see {!admit} + below); RG 109(a) (register line 374) lists "of a Sunday" as a + privileged commemoration category precisely because an impeded Sunday + stays put rather than moving to another day. Total over every winner/loser pair {!Precedence.resolve} or {!Calendar} can construct: [Vocab_ef.rank] (RG 8) and {!Celebration.status} are both - closed variants, so the four cases above exhaust every representable - shape -- there is no fifth, "unclassified" case the way {!band} needs - one, because this function's own return type has no such slot to fall - into by accident. *) + closed variants, so the cases above exhaust every representable shape -- + there is no fifth, "unclassified" case the way {!band} needs one, + because this function's own return type has no such slot to fall into + by accident. *) val disposition : winner:Vocab_ef.rank Precedence.candidate -> loser:Vocab_ef.rank Precedence.candidate -> diff --git a/test/test_precedence_ef.ml b/test/test_precedence_ef.ml index f3fd357..09c41fd 100644 --- a/test/test_precedence_ef.ml +++ b/test/test_precedence_ef.ml @@ -318,6 +318,28 @@ let disposition_cases = cand "ef-nativity", cand ~origin:P.Sanctoral ~layer:PE.universal_layer "ef-local-i-class-feast", "Transfer" ); + (* Fix round 1 (post-Task-9 review): RG 95 (register lines 323, 363) + restricts the right of translation to I-class FEASTS -- RG 91's own + table lists Sundays as a separate row (entry 6, register line 332) + from feasts (entries 11-13, lines 337-339) -- so an impeded I-class + Sunday must NOT transfer, unlike the plain I-class feast row above: + same [Class1] rank, same kind of winner, the ONLY difference is that + this loser's slug carries [PE.sunday_marker]. RG 109(a) (register + line 374) confirms this from the other direction: "of a Sunday" is a + privileged commemoration category, which presupposes an impeded + Sunday stays put rather than moving to another day the way a feast + does. Sourced from [Temporal_ef.temporal]'s own real output (Advent I + Sunday 2026, Class1, "ef-advent-sunday-1"), the same coupling-safety + reason [of_temporal]'s other callers use it -- this is also a + realistic shape: 8 December falls on an Advent Sunday in 2024, 2030 + and 2041 (Immaculate Conception, RG 91 entry 4, outranking entry 6), + and 24 December falls on Advent IV in 2023, 2028, 2034 and 2045 (the + Nativity Vigil, also entry 5 outranking entry 6). *) + ( "RG95/RG109(a): an impeded I-class SUNDAY does NOT transfer -- it is \ + Commemorated and Privileged", + cand ~origin:P.Sanctoral ~layer:PE.universal_layer "ef-immaculate-conception", + of_temporal (T.advent_start 2026), + "Commemorate(Privileged)" ); (* RG 33 -- register line 383-384: a I/II-class vigil impeded by any Sunday or a I-class feast is entirely OMITTED, not commemorated. The vigil is sourced from [Temporal_ef.temporal]'s own real output (as |
