aboutsummaryrefslogtreecommitdiff
path: root/lib/kernel/mass_formulary.mli
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-24 16:29:23 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-24 16:29:23 +0200
commit8a5da8756cf6b57aa36c01b71ce893f7967d3a29 (patch)
tree10873a692400fa25ce54c67ac9fc34d46af86272 /lib/kernel/mass_formulary.mli
parent4f87cbde4ee79ac96aa7ebfed105b3a5ec02be43 (diff)
parent73b15551804bb63ee0081005e2869d36afb54be2 (diff)
downloadcolitur-8a5da8756cf6b57aa36c01b71ce893f7967d3a29.tar.gz
colitur-8a5da8756cf6b57aa36c01b71ce893f7967d3a29.zip
merge: celebrant Mass rubrics, and four rubrical corrections
colitur now prints what a real ordo prints for the Mass: which formulary is said and how it was reached, the Gloria, the Creed, the preface, and the commemorations with their Low-Mass/sung distinction. colitur rubrics joins day and readings. Four defects were found and fixed on the way, each by an external witness rather than by inspection: the Creed said at Requiem Masses (RG 476(f)), the missing bissextile shift of St Matthias and St Gabriel (2 041 leap years), Rogation Monday and Tuesday coloured violet in Paschaltide (RG 119(b)), and the ferias after the Ascension resuming the wrong Sunday's Mass rather than the Ascension's. Validation gained a sixth layer and then some: the preface is checked against three independent publishers over seven witness-years (FIUV, three LMS editions, three extraordinaryform.org editions), none of which shares the Divinum Officium -> missalemeum -> lectio lineage the older layers all descend from.
Diffstat (limited to 'lib/kernel/mass_formulary.mli')
-rw-r--r--lib/kernel/mass_formulary.mli57
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/kernel/mass_formulary.mli b/lib/kernel/mass_formulary.mli
new file mode 100644
index 0000000..b990e69
--- /dev/null
+++ b/lib/kernel/mass_formulary.mli
@@ -0,0 +1,57 @@
+(** Which Mass a day actually says, and how that was decided.
+
+ A day does not always say its own Mass. A weekday with no proper of its own
+ resumes the preceding Sunday's; a saint with no proper says a Common. The
+ resolution already happens inside a rite's {!Rite.readings} -- this type is
+ what makes the answer visible instead of discarding it once the citations
+ have been extracted. An ordo prints it as "Mass of the 9th Sunday after
+ Pentecost".
+
+ Rite-agnostic by construction: it names a slug and a provenance, and
+ carries no rank, season or rubric vocabulary of any rite. *)
+
+type source =
+ | Proper (** the observed celebration's own citations *)
+ | Own_slug (** the lectionary's entry for the day's own slug *)
+ | Preceding_sunday (** a weekday with no proper resumes the preceding Sunday *)
+ | Common (** a saint's assigned Common *)
+ | Votive
+ (** a Mass said IN PLACE of the day's own office's Mass, the office
+ itself being kept unchanged -- RG 309(a): "in Ecclesia universa,
+ Missae quae pro sancta Maria in sabbato, iuxta temporum
+ diversitatem, in Missali assignantur", corroborated by RG 431(e)'s
+ own classification of that Mass as "Missa votiva IV classis ...
+ de B. Maria Virg." The office/Mass split this constructor exists
+ to name is general (any rite may say a votive Mass on a day whose
+ OFFICE is not itself votive), even though EF's only witness today
+ is the RG 78/309(a) Saturday Mass of Our Lady. *)
+[@@deriving sexp]
+
+type t = { said : Slug.t option; via : source } [@@deriving sexp]
+
+(** The slug whose CITATIONS were actually used to build the day's
+ readings, when the shipped data can name one.
+
+ [Some] for four of the five sources: {!Proper} and {!Own_slug} each
+ carry the day's own slug; {!Preceding_sunday} carries that Sunday's
+ TEMPORAL slug; {!Common} carries the Common's own id.
+
+ [None] for {!Votive}, and ONLY for {!Votive} (whole-branch review fix
+ round, celebrant-rubrics-phase1): RG 309(a)'s five seasonal "Missae de
+ sancta Maria in sabbato" carry no slug of their own anywhere in the
+ shipped data -- their citations come from a season-keyed function
+ ({!Rite_ef.Lectionary_ef.bvm_saturday_citations}), never from a
+ [Lectionary.find] against any slug, so there is genuinely no slug this
+ field could honestly report. An earlier version of this type set
+ [said] to the day's own OFFICE slug for {!Votive} too (RG 78's Office
+ of Our Lady, kept unchanged under the votive Mass) -- readable at the
+ call site as "this is the slug whose Mass is said", which is false for
+ exactly this one case: that slug's own [Lectionary] entry, if it has
+ one at all, is NOT what the day's citations came from. [None] says so
+ directly instead of silently mis-naming a Mass. The day's own OFFICE
+ is not lost by this change -- it is still on the very same
+ {!Liturgical_day.t} this formulary lives on, via [observed.slug],
+ which every caller already has in scope regardless of [via]; this
+ field does not need to duplicate it. *)
+
+val source_to_string : source -> string