diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 05:25:58 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 05:25:58 +0200 |
| commit | 0121abf66700879b31ef0b9a13e936b95e123c8f (patch) | |
| tree | 383e96e03596820ade6cf1744a9244575cab3083 /test | |
| parent | cb200a3f95e24f67c1d08b2ceb09404bf57a1636 (diff) | |
| download | colitur-0121abf66700879b31ef0b9a13e936b95e123c8f.tar.gz colitur-0121abf66700879b31ef0b9a13e936b95e123c8f.zip | |
kernel(precedence): fix round 1 -- RG23-26 govern ferial commemoration, not RG109
Review round 1 (F1, Critical): the commemoration-eligibility fix from
the previous commit silently dropped II-class Advent and Lent Ember
ferias when impeded, while ordinary (lower-solemnity) ferias of the
same seasons kept their commemoration -- backwards on any reading.
Reproduced: 1900-12-21 (an Advent Ember Friday) lost its commemoration
entirely; 2026-12-21 (an ordinary Advent feria the same week) kept
its.
F2 (Important, the direct cause of F1): the branch's own justification
mis-stated RG 109 as an exhaustive list of the only temporal
circumstances that generate a commemoration. RG 109 is headed
"Commemorationes privilegiatae sunt commemorationes" and closes
"Omnes aliae commemorationes sunt commemorationes ordinariae" -- it
sorts commemorations that already exist into two HONOUR classes
(RG 108's differing liturgical hours), and says nothing about which
offices have the right to be commemorated at all. That right belongs
to Caput IV, "De feriis" (RG 21-27), never opened by the original
pass:
RG 24 (II-class ferias): "si vero impediuntur, commemorari debent"
-- if impeded, MUST be commemorated. Not optional.
RG 25 (III-class ferias): same mandate.
RG 26: every feria not named in 23-25 is IV class, and IV-class
ferias are NEVER commemorated -- the one exclusion RG 21-27 actually
states.
The omission branch is now gated on `rank = Class4` (RG 26) directly,
not on `privilege_of = Ordinary` -- the old gate happened to reach the
right answer for IV-class ferias (RG 26 also excludes them, for a
reason the old citation did not give) and the wrong one for II/III-
class Ember ferias RG 109(e) did not name by letter.
RG 109(e) itself is also corrected: its bare "feriis Adventus,
Quadragesimae et Passionis" previously excluded the Advent and Lent
Ember sub-days by analogy with (d)'s separate September carve-out.
RG 91's own TABLE needs an explicit "exceptis feriis Quatuor
Temporum" at entries 22 and 25 to keep Ember days from being double-
listed against their own entry 18 -- an exception that would be
unnecessary drafting if "feriae Adventus"/"feriae Quadragesimae" did
not already include their Ember sub-days by default. RG 109(e) carries
no such exception, so it is read at that same default, inclusive
scope: the Advent and Lent Ember ferias are privileged under (e), not
merely ordinary-but-commemorable. (d)'s own existence is unaffected --
September Ember days sit outside Advent/Lent/Passiontide under any
reading, so (d) remains necessary regardless.
Verified: 1900-12-21 and 1902-02-22 now correctly commemorate their
Ember ferias; 2026-12-21 and 1902-02-24 (ordinary ferias) unchanged.
Blast radius re-measured against the prior commit, 1900-2100: 102
civil days changed, every one an Advent/Lent Ember (or Ember-vs-
Joseph-collision) day regaining its commemoration, nothing else.
Validate re-swept exhaustively, 1583-9998: 0 failures.
F6: two privilege-boundary test rows that had been bent to expect the
bug's own output (Commemorate -> Omit) are restored to what RG 24/25
actually require, now Commemorate(Privileged) given the RG 109(e)
correction above -- these are the rows that should have caught F1.
F7: admit_cases had no witness for RG 111(b)'s rank floor that wasn't
already Class2, so reverting that filter only reddened the oracle
suite, never this file. Added a row (II-class Sunday, sole candidate
an ordinary Class3) that fails without the filter and passes with it.
F9: RG 122 cited alongside RG 128(b) for Holy Thursday's white --
states the same fact affirmatively ("Demum adhibetur color albus,
feria V Hebdomadae sanctae...") rather than as an exception to violet.
Diffstat (limited to 'test')
| -rw-r--r-- | test/test_precedence_ef.ml | 96 |
1 files changed, 68 insertions, 28 deletions
diff --git a/test/test_precedence_ef.ml b/test/test_precedence_ef.ml index 2f08864..9bd9b7f 100644 --- a/test/test_precedence_ef.ml +++ b/test/test_precedence_ef.ml @@ -523,9 +523,13 @@ let privilege_cases = [Temporal_ef]'s own third-Sunday-of-September rule: first Sunday of September 2026 is the 6th, +14 days = 20th, +3 = 23rd), sourced from [Temporal_ef.temporal] itself, Class2. Not a Sunday, not Class1, not - within the Nativity octave, not an Advent/Lent Ember day (a DIFFERENT - Ember set, deliberately excluded by (d) -- see the negative row - below), not a plain Advent/Lent/Passiontide feria slug either. *) + within the Nativity octave, not a plain Advent/Lent/Passiontide feria + slug either -- and, unlike the Advent/Lent Ember rows below, its own + slug ("ef-september-ember-wed") never starts with any of (e)'s own + [alp_feria_prefixes] ("ef-advent-"/"ef-lent-"/"ef-passiontide-"), so + (d) is this candidate's ONLY route to [Privileged] -- a genuine, + still-necessary distinction from (e), unlike the Advent/Lent Ember + case below (fix round 1). *) ( "(d) a September Ember day is privileged", cand "ef-nativity", of_temporal (mk 2026 9 23), @@ -542,36 +546,49 @@ let privilege_cases = cand "ef-nativity", of_temporal (off (-41)), "Commemorate(Privileged)" ); - (* Negative, RG 109(d) vs (e)'s own boundary: the Advent and Lent Ember - sets are ALSO II-class ferias of Advent/Lent by RG 91 (entry 18), and - their slugs ("ef-advent-ember-*", "ef-lent-ember-*") share (e)'s own - season prefixes -- but RG 109 privileges ONLY the September set (d), - leaving these two ordinary. 16 Dec 2026 is the Advent Ember Wednesday - (independently derived: Advent I 2026 is 29 Nov, +14 days = 13 Dec, - +3 = 16 Dec); the Lent Ember Wednesday is the same date [off (-39)] - already used by the entry-18 [band] row above. Both sourced from - [Temporal_ef.temporal]. If [privilege_of] relied on the season prefix - alone without excluding Ember slugs, both would wrongly come back - [Privileged] -- the exact trap this pair of rows guards against. + (* CHANGED, fix round 1 (F1/F2/F6): these two rows used to be titled + "boundary: ... is NOT privileged (only September is, RG109(d))" and + expected [Omit] (a Task-16-pass reading that treated RG 109(e)'s bare + "feriis Adventus, Quadragesimae" as tacitly excluding the Advent and + Lent Ember sub-days, by analogy with (d)'s own separate, explicit + September carve-out). Review round 1 (F1) reproduced the real + consequence directly -- 1900-12-21, an Advent Ember Friday, lost its + own commemoration entirely, while an ordinary (lower-solemnity, + non-Ember) Advent feria the same week kept its commemoration -- + backwards on any reading, and traced it to this exact + misclassification (F2). - CHANGED, Task 16: these used to expect [Commemorate(Ordinary)] -- - "not privileged" originally meant "commemorated, but without RG 109's - higher liturgical honours". Now that a TEMPORAL-origin [Ordinary] - loser is Task 16's own [Omit] branch (see precedence_ef.ml), "not - privileged" for a temporal candidate means "not commemorable at all" - -- a sharper, more direct assertion of the same underlying - [privilege_of] classification, via the one vantage point available - on that private function. *) - ( "boundary: an Advent Ember day is NOT privileged (only September is, \ - RG109(d)) -- and being temporal+ordinary, TASK16 omits it entirely", + Corrected reading (precedence_ef.ml's own [privilege_of], (e) + branch, carries the full argument): RG 91's TABLE needs an explicit + "exceptis feriis Quatuor Temporum" at its own entries 22 and 25 to + keep Ember days from being double-listed against their own entry 18 + -- an exception that would be unnecessary drafting if "feriae + Adventus"/"feriae Quadragesimae" did not ALREADY include their Ember + sub-days by default. RG 109(e) carries no such "exceptis" clause, so + its bare text is read at that same default, INCLUSIVE scope: the + Advent and Lent Ember ferias ARE privileged under (e), not merely + commemorable-but-ordinary. (d)'s own separate existence survives + this reading intact -- September Ember days sit outside Advent/Lent/ + Passiontide under ANY reading, so (d) remains the ONLY way they + reach [Privileged], the point the row immediately above this one + makes explicit. + + 16 Dec 2026 is the Advent Ember Wednesday (independently derived: + Advent I 2026 is 29 Nov, +14 days = 13 Dec, +3 = 16 Dec); the Lent + Ember Wednesday is the same date [off (-39)] already used by the + entry-18 [band] row above. Both sourced from [Temporal_ef.temporal], + not hand-typed, for the same coupling-safety reason every + [of_temporal] row in this file uses it. *) + ( "(e), corrected fix round 1: an Advent Ember day is ALSO privileged, \ + not excluded from (e)", cand "ef-nativity", of_temporal (mk 2026 12 16), - "Omit" ); - ( "boundary: a Lent Ember day is NOT privileged (only September is, \ - RG109(d)) -- and being temporal+ordinary, TASK16 omits it entirely", + "Commemorate(Privileged)" ); + ( "(e), corrected fix round 1: a Lent Ember day is ALSO privileged, \ + not excluded from (e)", cand "ef-nativity", of_temporal (off (-39)), - "Omit" ); + "Commemorate(Privileged)" ); (* Negative, RG 109(f)'s own boundary: the Minor Litanies/Rogations (Monday/Tuesday before Ascension, RG 87 -- [Temporal_ef.temporal] DOES compute these, unlike the Major Litanies RG 109(f) actually @@ -623,6 +640,17 @@ let privileged_hi = cand ~rank:V.Class2 "ef-privileged-hi" thing under test, not merely how many. *) let ordinary_lowest = cand ~rank:V.Class4 "ef-ordinary-lowest" +(* Class3, tagged [Ordinary] -- fix round 1, F7: the RG 111(b) rank-floor + witness [admit_cases] was missing. [ordinary_hi] above is already Class2, + so every existing II-class-Sunday row here passes whether or not + [admit]'s "de festo II classis" filter is even present -- reverting that + filter would only redden [test_oracle.ml], not this file, which is + exactly the coverage gap the review round found. This candidate is the + ONLY thing due on the Sunday row below, so a version of [admit] without + the rank floor would (wrongly) admit it on pure "best available" + dignity, same as it would have admitted [ordinary_hi]. *) +let ordinary_class3 = cand ~rank:V.Class3 "ef-ordinary-class3" + let observed_class1 = cand "ef-nativity" (* Class1 by [cand]'s own default. *) let observed_class2_sunday = an_ordinary_sunday (* Class2, slug carries "-sunday". *) let observed_class2_other = cand ~rank:V.Class2 "ef-other-class2-day" (* Class2, no "-sunday". *) @@ -658,6 +686,18 @@ let admit_cases = observed_class2_sunday, [ (ordinary_hi, P.Ordinary); (privileged_lo, P.Privileged) ], [ "ef-privileged-lo" ] ); + (* RG 111(b)'s own rank floor ("scilicet DE FESTO II CLASSIS"), fix + round 1 F7: a Class3 ORDINARY candidate -- no privileged rival due, + so the pre-fix-round code's "no privileged? take the best of what's + left" fallback would (wrongly) admit it -- is admitted NOTHING. The + slot is reserved for a II-class candidate specifically; a III-class + ordinary one has no standing for it at all, unlike "other II class" + below, which has no such restriction. *) + ( "II-class Sunday, sole candidate is an ORDINARY Class3 (not \ + \"de festo II classis\") -> admitted nothing, not the best available", + observed_class2_sunday, + [ (ordinary_class3, P.Ordinary) ], + [] ); (* RG 111: "other II class: one" -- no privilege override, the exact asymmetry the brief and precedence_ef.ml's own [admit] comment flag: same candidate pair as the II-class-Sunday row above, OPPOSITE |
