aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 08:15:48 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 08:15:48 +0200
commit6319c8d5c012db40206b463dc912a1edf7aeec5d (patch)
tree65182f0ffc9c0fe6f256112354eb9fe8678466cc /lib
parentbbc8ce26916ca92b3c2286c57342a6565323b66f (diff)
downloadcolitur-6319c8d5c012db40206b463dc912a1edf7aeec5d.tar.gz
colitur-6319c8d5c012db40206b463dc912a1edf7aeec5d.zip
precedence(ef): RG91 e14 "primum mobilia" + RG112(a) inseparable exclusion
Two related fixes, both needed for Holy Family to actually observe correctly on the seven years it coincides with the fixed Commemoration of the Baptism of the Lord (13 January): 2008, 2013, 2019, 2030, 2036, 2041, 2047. band's entry 14 ("Festa Domini II classis") gated on sanctoral origin only, so a movable Class2 Lord feast had no row in the table at all. RG 91 entry 14's own text says otherwise: "primum mobilia, deinde fixa" -- movable first, then fixed. entry_14_movable_band gives Holy Family (the one movable candidate this codebase builds with subject Lord) a value strictly better than the fixed half's own literal 14, negative so it can never collide with a real table position -- without it, the two would tie at 14 and fall to Precedence.resolve's own alphabetical tie-break, which picks the WRONG side ("commemoration-of-the-baptism-of-the-lord" sorts before "ef-time-after-epiphany-sunday-1"). disposition gets a new branch for RG 112(a) (Caput XVI, "De Commemorationibus"): the Office, Mass or commemoration of a mystery of one Divine Person excludes a commemoration of another mystery of the SAME Divine Person. Winner and loser both subject Lord -> Omit, not Commemorate -- without it, Holy Family observing correctly still left the Baptism admitted as an ordinary Class2 commemoration under RG111(b), which the primary text does not allow. Confirmed by a MORE SPECIFIC primary source than RG 112(a) alone: the Holy Family Mass propers' own note, found on both photographic scans, word for word, immediately after the Postcommunio -- "Si festum S. Familiae occurrerit die 13 ianuarii, Missa dicitur de festo S. Familiae, sine commemoratione Baptismatis D.N.I.C., et sine commemoratione dominicae." The electronic transcription carries neither this rubric nor RG 112(a)'s own worked example -- another instance of its documented defect, not merely absent from one check. Still expected red: the lectio differential (2005-2050) now shows a new, real divergence on those seven 13-January-Sunday dates -- lectio has no Holy Family at all, so it still shows the fixed Baptism observed there, unlike colitur now. The oracle's own M-series entries also still need widening for the observed-identity axis added two commits ago. Both are the next commits.
Diffstat (limited to 'lib')
-rw-r--r--lib/rites/rite_ef/precedence_ef.ml108
-rw-r--r--lib/rites/rite_ef/precedence_ef.mli17
2 files changed, 118 insertions, 7 deletions
diff --git a/lib/rites/rite_ef/precedence_ef.ml b/lib/rites/rite_ef/precedence_ef.ml
index 750da8b..87cdeeb 100644
--- a/lib/rites/rite_ef/precedence_ef.ml
+++ b/lib/rites/rite_ef/precedence_ef.ml
@@ -48,6 +48,34 @@ let universal_layer = "ef-universal"
let indult_prefix = "indult:"
let unclassified = max_int
+(* Not an RG citation -- an ordering device for RG 91 entry 14's own text
+ (scan-verified, docs/research/rules-register.md §4): "14. Festa Domini II
+ classis, PRIMUM MOBILIA, DEINDE FIXA" -- feasts of the Lord, II class,
+ MOVABLE FIRST, then fixed. Both halves are the SAME numbered table row,
+ but the primary text states a real priority between them, not merely two
+ disjoint categories -- [band]'s own entry-14 branches below must not
+ literally TIE at the shared integer 14, because a tie would fall to
+ {!Precedence.resolve}'s own kernel-level fallback ([compare_by],
+ Slug.compare), which is deliberately NOT rubric-authoritative (the exact
+ anti-pattern RG 113's own fix already corrected once for commemoration
+ ordering, this file's own header) and would in fact pick the WRONG side
+ here: "commemoration-of-the-baptism-of-the-lord" sorts before
+ "ef-time-after-epiphany-sunday-1" alphabetically, backwards from "primum
+ mobilia". Negative, so it can never collide with any real table position
+ (1..28) or [unclassified] (positive [max_int]) by construction -- not a
+ citation to some entry "13.5" that does not exist in the primary text,
+ just an ordering fact this integer has to carry because RG 91's own two
+ half-rows must compare unequal here. The one real witness today: Holy
+ Family (RG 17(b), temporal_ef.ml's own [holy_family_sunday]) against the
+ fixed Commemoration of the Baptism of the Lord (13 January) -- the only
+ date they can ever coincide, since Holy Family only ever falls 7-13
+ January and no OTHER fixed Class2-Lord sanctoral entry shares that
+ window (register §6.0's own subject audit: Transfiguration 6 Aug,
+ Exaltation of the Cross 14 Sep, Dedication of the Archbasilica 9 Nov,
+ the Purification 2 Feb, the Baptism 13 Jan -- the Baptism alone falls in
+ Holy Family's own window). *)
+let entry_14_movable_band = -14
+
let is_indult layer = String.starts_with ~prefix:indult_prefix layer
let is_universal layer = String.equal layer universal_layer
@@ -223,13 +251,28 @@ let band (ctx : Vocab_ef.season Precedence.context) (c : Vocab_ef.rank Precedenc
not the universal layer (11), and marked as an indult overlay (12's
"not indult" test having just failed). *)
else if (not is_temporal) && (not is_vigil) && rank = Class1 then 13
- (* 14: Feasts of the Lord, II class -- RG 91 entry 14, deliberately
- UNQUALIFIED (contrast entry 16, which explicitly says "not
- of the Lord"; RG 37c (§4, "Sundays") speaks of "II-class feasts of
- the Lord" replacing an occurring II-class Sunday with no universal
- qualifier either). No layer test here, unlike 11/12/13 and 16/19/20:
- the register does not split this entry into universal/proper/indult,
- so a proper or indult feast of the Lord still bands 14, not 19/20. *)
+ (* 14, MOVABLE half -- RG 91 entry 14's own "primum mobilia, deinde
+ fixa" ({!entry_14_movable_band}'s own comment has the full citation
+ and reasoning). Checked before the FIXED half immediately below,
+ matching the primary text's own order, though [is_temporal] already
+ makes the two branches structurally disjoint on any one candidate
+ regardless of which is checked first -- the ordering here is for a
+ reader following RG 91's own prose, not for correctness. The only
+ witness this codebase currently constructs is Holy Family
+ (temporal_ef.ml's own [holy_family_sunday] branch, the one place
+ [subject] is ever [Lord] on a temporal-origin candidate); a
+ hypothetical movable Holy-Name-of-Jesus office (RG 17(a), still
+ unbuilt as its own named day, register §6) would reach this same
+ branch too, once built, since nothing here is keyed to Holy Family's
+ own slug. *)
+ else if is_temporal && rank = Class2 && subject = Subject.Lord then entry_14_movable_band
+ (* 14, FIXED half -- RG 91 entry 14, deliberately UNQUALIFIED (contrast
+ entry 16, which explicitly says "not of the Lord"; RG 37c (§4,
+ "Sundays") speaks of "II-class feasts of the Lord" replacing an
+ occurring II-class Sunday with no universal qualifier either). No
+ layer test here, unlike 11/12/13 and 16/19/20: the register does not
+ split this entry into universal/proper/indult, so a proper or
+ indult feast of the Lord still bands 14, not 19/20. *)
else if (not is_temporal) && (not is_vigil) && rank = Class2 && subject = Subject.Lord then 14
(* 15: Sundays, II class (every Sunday not already named at 6). *)
else if is_temporal && rank = Class2 && is_sunday then entry_15_band
@@ -732,6 +775,57 @@ let disposition ~(winner : Vocab_ef.rank Precedence.candidate)
the RG26 branch above gives its own [not is_vigil] guard, rather than
relying on that absence silently. *)
Precedence.Omit
+ else if winner.Precedence.cel.Celebration.subject = Subject.Lord && cel.Celebration.subject = Subject.Lord
+ then
+ (* RG 112(a) (docs/research/rules-register.md §4/§6.0, primary text,
+ verified against BOTH photographic scans -- missale-romanum-1962.pdf
+ and "Missale Romanum 1962_text.pdf" -- the electronic transcription,
+ 1962-06-23,_SS_Ioannes_XXIII,_Missale_Romanum,_LT.pdf, carries
+ NEITHER this paragraph's own worked example NOR its own more
+ specific Mass-proper rubric below, exactly the transcription's
+ documented defect, this project's own methodology note): "112. Ad
+ commemorationes et orationes quod attinet, haec insuper serventur:
+ a) Officium, Missa aut commemoratio de aliquo festo vel mysterio
+ UNIUS DIVINAE PERSONAE excludit commemorationem aut orationem de
+ alio festo vel mysterio EIUSDEM DIVINAE PERSONAE" -- the Office,
+ Mass, or commemoration of some feast or MYSTERY of ONE Divine Person
+ excludes a commemoration or oration of ANOTHER feast or mystery of
+ the SAME Divine Person.
+
+ {!Subject.t} has no finer split within [Lord] than "a mystery
+ touching the Divine Person of the Son" -- every real [subject =
+ Lord] entry this codebase's own data carries concerns Christ
+ specifically (register §6.0's subject audit: the Precious Blood, the
+ Transfiguration, the Exaltation of the Cross, the Dedication of the
+ Archbasilica, the Purification, the Baptism, and now Holy Family),
+ so reading "same Divine Person" as simply "both [Lord]" is safe at
+ today's data's own granularity -- a rite that ever needed to
+ distinguish, say, a Trinity-specific mystery from a Son-specific one
+ by Person would need a finer [Subject.t] first, not a special case
+ added here.
+
+ The one live witness -- confirmed DIRECTLY, not only by this general
+ paragraph: the Holy Family Mass propers' own note, immediately
+ following the Postcommunion, word for word on BOTH photographic
+ scans: "Si festum S. Familiae occurrerit die 13 ianuarii, Missa
+ dicitur de festo S. Familiae, SINE COMMEMORATIONE BAPTISMATIS
+ D.N.I.C., et sine commemoratione dominicae" -- if the feast of the
+ Holy Family occurs on 13 January, the Mass is said of the Holy
+ Family, WITHOUT commemoration of the Baptism of Our Lord Jesus
+ Christ, and without commemoration of the Sunday (RG 17(b)'s own
+ general rule, restated for this specific date). Independently
+ confirmed against missalemeum (register §6.0): title "The Holy
+ Family: Jesus, Mary & Joseph", commemorations [], the Baptism
+ listed only under "displaced", never commemorated.
+
+ Checked after RG 16(a) above (so a genuine RG 16(a) Sunday-
+ suppression is never re-explained under this citation instead) and
+ before the final ordinary-commemoration catch-all below, since
+ without it a [Feast]-status loser of this shape would otherwise
+ reach RG 95's ordinary "commemorated or omitted" branch and be
+ admitted as an ordinary Class2 commemoration under RG 111(b) --
+ confirmed wrong against both primary sources above. *)
+ Precedence.Omit
else
(* RG 95's other branch: "aut commemorantur aut penitus omittuntur" --
commemorated or wholly omitted. Reached by every SANCTORAL loser
diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli
index b283a17..86a0ead 100644
--- a/lib/rites/rite_ef/precedence_ef.mli
+++ b/lib/rites/rite_ef/precedence_ef.mli
@@ -62,6 +62,15 @@ val ember_prefixes : string list
new rule, not a silently wrong one. *)
val unclassified : int
+(** RG 91 entry 14's own text (§4): "Festa Domini II classis, primum
+ mobilia, deinde fixa" -- feasts of the Lord, II class, MOVABLE first,
+ then fixed. {!band}'s value for the movable half (Holy Family, RG
+ 17(b)) -- strictly better than the fixed half's own literal [14],
+ negative so it can never collide with a real table position or
+ {!unclassified}. See precedence_ef.ml's own comment for the full
+ citation and why the two halves must not literally tie. *)
+val entry_14_movable_band : 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}) -- EXCEPT where the table's own
@@ -134,6 +143,14 @@ val sunday_marker : string
weekday, never a saint's day, and RG 111(c)/(d) admit an "ordinary"
commemoration of a losing SAINT freely, with no such class-keyed
gate);
+ - a loser whose [subject] is [Lord] AND whose WINNER's [subject] is also
+ [Lord] is [Omit] (RG 112(a) -- a feast or mystery of one Divine Person
+ excludes a commemoration of another feast or mystery of the SAME
+ Divine Person; live witness: Holy Family, RG 17(b), excluding the
+ fixed Commemoration of the Baptism of the Lord on the years 13
+ January is itself Holy Family's own date -- see the .ml's own comment
+ for the primary text, including the Holy Family Mass propers' own
+ more specific 13-January rubric, on both photographic scans);
- everything else -- including an impeded I-class Sunday, and a
SANCTORAL loser of any rank below I class -- is [Commemorate],
carrying its real RG 109 privilege (see {!admit} below); RG 109(a)