From 3583448631c1f1cf0767728d605a858fcb810cfc Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 11 Aug 2026 23:41:33 +0200 Subject: 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. --- lib/rites/rite_ef/precedence_ef.mli | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'lib/rites/rite_ef/precedence_ef.mli') 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 -> -- cgit v1.3