summaryrefslogtreecommitdiff
path: root/lib/rites/rite_ef/precedence_ef.mli
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-11 22:26:17 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-11 22:26:17 +0200
commit553dc44d2ba0e131e7f2ac79dc755641afcd6a1c (patch)
tree93ce2086d7de50eb05dbbe8dbb38f45cedc832c5 /lib/rites/rite_ef/precedence_ef.mli
parent436ba75e27d2aa61b1c6035a22157b40f1a9834b (diff)
downloadcolitur-553dc44d2ba0e131e7f2ac79dc755641afcd6a1c.tar.gz
colitur-553dc44d2ba0e131e7f2ac79dc755641afcd6a1c.zip
rite(ef): fix entry 8's Sunday exception and entry 14's over-restriction
Review of 436ba75 found two calendar defects and one coupling risk. Entry 8 (All Souls) dropped register line 334's own qualifier, "(yields to an occurring Sunday)" -- it returned 8 unconditionally, so on 2 November falling on a Sunday (2025, 2031, 2036, 2042 in the 2005-2050 differential window), All Souls incorrectly outranked and observed over the Sunday. 2 November is always Time_after_pentecost and never coincides with any other entry's own date, so the only rival this exception ever has is an ordinary entry-15 II-class Sunday; on such a Sunday, band now returns one worse than entry 15's own value rather than the literal 8 -- strictly worse, not merely different, since an exact tie would fall to Precedence.resolve's slug tie-break, which for "ef-all-souls" against a Sunday slug would make All Souls win the tie anyway. Entry 8's own rank is untouched, so Task 8's disposition still sees a true I-class candidate to transfer. Entry 14 (Feasts of the Lord, II class) added a universal-layer restriction the register's line 341 does not carry -- contrast entry 16 at line 342, which explicitly says "not of the Lord"; RG 37c (register line 393) also speaks of "II-class feasts of the Lord" with no universal qualifier. Dropped the layer test: a proper or indult feast of the Lord now bands 14, not 19/20. Also exposes vigil_suffix and ember_prefixes from precedence_ef.mli, matching universal_layer/indult_prefix's existing "colitur convention, not an RG citation" treatment -- both were previously private literals duplicated in the test file, so a rename of temporal_ef.ml's slug format could have drifted silently past both sides agreeing with each other. Two test rows now build their candidate from Temporal_ef.temporal's own real output (entry 18's Lent Ember day, entry 21's Ascension Vigil) instead of a hand-typed slug, closing that specific coupling. Adds the three cheap rows review named as closing the remaining unpinned guards (a temporal-origin Class1 candidate on an unnamed date; a universal Class2 vigil of the Lord; a non-universal Class3 vigil), plus a resolve()-level test proving the Sunday is actually observed over All Souls, not just that band returns the right integer in isolation.
Diffstat (limited to 'lib/rites/rite_ef/precedence_ef.mli')
-rw-r--r--lib/rites/rite_ef/precedence_ef.mli29
1 files changed, 26 insertions, 3 deletions
diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli
index e8d4a11..63fb0a1 100644
--- a/lib/rites/rite_ef/precedence_ef.mli
+++ b/lib/rites/rite_ef/precedence_ef.mli
@@ -18,6 +18,24 @@ val universal_layer : string
(** See {!universal_layer}. *)
val indult_prefix : string
+(** Slug suffix marking a celebration as a vigil (RG 91 entries 21, 26),
+ e.g. "ef-ascension-vigil". Also colitur's own convention, not an RG
+ citation, exposed for the same reason as {!universal_layer}: only the
+ Ascension Vigil exists today (rite_ef/temporal_ef.ml); the Assumption,
+ John Baptist, Peter & Paul and Lawrence vigils arrive as sanctoral data
+ in a future task, and must use this same suffix or {!band} will band
+ them 16/24 (an ordinary feast of the same rank) instead of 21/26. *)
+val vigil_suffix : string
+
+(** Slug prefixes marking a celebration as one of RG 91 entry 18's three
+ Ember-day sets (Advent, Lent, September -- the Pentecost/Whitsun set is
+ I class and matched by entry 10 before this is ever consulted). Also
+ colitur's own convention mirroring rite_ef/temporal_ef.ml's own "ef-<set>
+ -ember-<day>" slug format, not re-derived from first principles; exposed
+ so a rename of that format has somewhere to be caught other than a
+ silently-wrong entry 18. *)
+val ember_prefixes : string list
+
(** Returned for a candidate shape RG 91's 28-entry table has no row for --
e.g. a [Class1] vigil that is not the Nativity or Pentecost (entries 5,
9 are the only I-class vigils the table names), or a [Class4] candidate
@@ -29,7 +47,12 @@ val unclassified : int
(** [band ctx c]: RG 91's Table of Precedence. Returns the table's own entry
number -- I class 1-13, II class 14-21, III class 22-26, IV class 27-28;
- lower wins (see {!Precedence.rules.band}). Total over every candidate
- {!Precedence.resolve} or {!Calendar} can construct, including shapes the
- 1962 table itself does not describe (see {!unclassified}). *)
+ lower wins (see {!Precedence.rules.band}) -- EXCEPT where the table's own
+ text states an exception: entry 8 (All Souls, register line 334) reads
+ "yields to an occurring Sunday", so on a Sunday this returns a value that
+ loses to entry 15 rather than the literal integer 8 (see the comment on
+ entry 8 in precedence_ef.ml for the exact value and why). Total over
+ every candidate {!Precedence.resolve} or {!Calendar} can construct,
+ including shapes the 1962 table itself does not describe (see
+ {!unclassified}). *)
val band : Vocab_ef.season Precedence.context -> Vocab_ef.rank Precedence.candidate -> int