summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/rites/rite_ef/precedence_ef.ml41
1 files changed, 40 insertions, 1 deletions
diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml
index dd75765..b69ee52 100644
--- a/lib/rites/rite_ef/precedence_ef.ml
+++ b/lib/rites/rite_ef/precedence_ef.ml
@@ -1532,6 +1532,45 @@ let rg110_find_companion comms companion_slug =
codebase's test suite where commemoration order is asserted at all --
flagged here, and in CLAUDE.md's own "know what each layer cannot see"
section, as a genuine, permanent limit, not merely this fix's own gap. *)
+(* RG 113, sentence ONE -- "Commemoratio de Tempore fit primo loco" (the
+ commemoration of the Season is made in the first place), verified in the
+ electronic transcription docs/research/LT.txt and in both photographic
+ scans; register §6.26.
+
+ §4 of the register and this file's own {!admit} already implement RG 113's
+ SECOND sentence ("In admittendis et ordinandis ALIIS commemorationibus,
+ servetur ordo tabellae praecedentiae") as the admission/ordering criterion,
+ adopted on the ef-rg16a branch. The first sentence was never implemented:
+ ordering was by {!band} alone, for every commemoration including the
+ seasonal one.
+
+ RECONCILED WITH RG 110(c), which says the inseparable Peter/Paul pair is
+ added "ante omnes alias commemorationes". The two rubrics share a technical
+ term: RG 113's own sentence fixes the sense of *aliae commemorationes* as
+ "the ones other than the de Tempore commemoration it has just placed primo
+ loco", and RG 110(c) sits three paragraphs earlier in the same code. Read
+ consistently, RG 110(c) puts the pair at the head of the OTHERS, not ahead
+ of the season. Hence this runs AFTER {!rg110_additions}, not before:
+ RG 110(c)'s own "immediate" adjacency (trigger then companion, fix round 1,
+ register §6.3) is preserved by {!List.partition}'s stability, and the
+ seasonal commemoration then steps in front of the pair rather than
+ splitting it.
+
+ [origin] is the exact discriminator the kernel already carries -- a
+ candidate is {!Precedence.Temporal} iff it came from the rite's temporal
+ cycle, which is what "de Tempore" means. Measured over 1583-9999, no day
+ ever carries more than one such commemoration (RG 112(c), "an Office, Mass
+ or commemoration of the season excludes another seasonal commemoration",
+ holding empirically), so this promotes at most one entry; [partition] is
+ used rather than a find-and-move so the zero case and the never-observed
+ many case are both total without a special branch. *)
+let rg113_season_first
+ (comms : (Vocab_ef.rank Precedence.candidate * Precedence.privilege) list) :
+ (Vocab_ef.rank Precedence.candidate * Precedence.privilege) list =
+ let de_tempore (c, _) = c.Precedence.origin = Precedence.Temporal in
+ let seasonal, others = List.partition de_tempore comms in
+ seasonal @ others
+
let rg110_additions (comms : (Vocab_ef.rank Precedence.candidate * Precedence.privilege * int) list)
~(observed : Vocab_ef.rank Precedence.candidate)
(normal : (Vocab_ef.rank Precedence.candidate * Precedence.privilege) list) :
@@ -1702,7 +1741,7 @@ let admit ~(observed : Vocab_ef.rank Precedence.candidate)
as the non-Sunday II-class case, just with room for two. *)
List.map drop_band (take 2 sorted)
in
- rg110_additions comms ~observed normal
+ rg113_season_first (rg110_additions comms ~observed normal)
(* Task 11: RG 96 -- where an impeded I-class feast lands (docs/research/
rules-register.md §4, "Transfer/translation"). [band] decides who is