From 6559a9b19451ce82a7d71281e25899acbcee2d49 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 25 Aug 2026 15:35:59 +0200 Subject: feat(of): Phase 1 of the OF rite module — vocab_of, temporal_of MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first code for a second rite. lib/rites/rite_of/vocab_of implements the OF's five-way rank vocabulary (Sollemnitas/Festum/Memoria_obligatoria/ Memoria_ad_libitum/Feria) and five-season vocabulary (Advent/Christmas/ Lent/Easter/Ordinary_time), each constructor cited against the 2002 Missale Romanum's Normae universales and the Tabula dierum liturgicorum. temporal_of implements season boundaries, week numbering — including Ordinary Time's own two-block resumption, derived from the Missale's own "HEBDOMADA I/XXXIV 'per annum'" headings and empirically verified across the whole 1583-9999 domain — named temporal days, and Sunday/ferial slugs. Both satisfy Colitur_kernel.Temporal.RITE with no kernel change. No Rite.t is assembled and no CLI wiring is added (Phase 2's own scope); lib/rites/rite_ef and data/ef are untouched, verified byte-identical against the v1.0.0 tag across a domain-spanning sample. test/test_temporal_of.ml adds unit tests for every boundary and named day plus seven QCheck properties (seasons contiguous, Ordinary Time weeks in 1..34, Advent always four Sundays, slug uniqueness, weekday agreement, determinism, consecutive liturgical years partition civil time), with a committed exhaustive sweep mirroring test_validate.ml's own convention. Full account, including the Ordinary Time derivation's evidence and a list of EF concepts that do not carry over, in .superpowers/sdd/of-phase1-report.md (untracked, gitignored). --- lib/rites/rite_of/vocab_of.mli | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 lib/rites/rite_of/vocab_of.mli (limited to 'lib/rites/rite_of/vocab_of.mli') diff --git a/lib/rites/rite_of/vocab_of.mli b/lib/rites/rite_of/vocab_of.mli new file mode 100644 index 0000000..dd23cfa --- /dev/null +++ b/lib/rites/rite_of/vocab_of.mli @@ -0,0 +1,58 @@ +(** OF (post-1970) season and rank vocabulary. *) + +type season = + | Advent + | Christmas + | Lent + | Easter + | Ordinary_time +[@@deriving sexp] + +(** Normae universales de anno liturgico et de calendario (Missale Romanum + editio typica tertia, 2002), Titulus I ("De diebus liturgicis"), and the + Institutio Generalis Missalis Romani (IGMR) n. 346's own colour-rule + prose, both cite the four graded celebrations by these exact names: a + Sunday-or-weekday MYSTERY of the Lord that ranks above everything else + ([Sollemnitas]), a lesser but still universally-binding celebration + ([Festum]), a saint's day the calendar obliges everyone to keep + ([Memoria_obligatoria]), and one a community may keep or not + ([Memoria_ad_libitum]). + + A FIFTH constructor, [Feria], is added beyond those four -- not a fifth + grade on the same scale, but a different kind of thing: an ordinary + weekday carries none of the four (Normae Titulus I.IV n. 16 calls these + days "feriae", never a "celebratio" of any grade), yet + {!Colitur_kernel.Celebration.t} requires a [rank] on every day the way + {!Colitur_kernel.Vocab_ef}'s own catch-all [Class4] does for EF. Ferias + are graded for PRECEDENCE (privileged Lenten/Advent ferias outrank an + ordinary one, per the Tabula dierum liturgicorum's own entries 2, 9 and + 13) but that grading is a {!Colitur_kernel.Precedence.rules.band} table + lookup (Phase 2), not a distinct [rank] value -- unlike EF, where + [Class2]/[Class3]/[Class4] carry a privileged feria's own grade directly. + See vocab_of.ml's own top-of-file comment for the primary-source + citations and the design decision this rests on. *) +type rank = + | Sollemnitas + | Festum + | Memoria_obligatoria + | Memoria_ad_libitum + | Feria +[@@deriving sexp] + +val seasons : season list +val ranks : rank list +val season_to_string : season -> string +val season_of_string : string -> season option + +(** The word used when building a slug: lowercase, hyphenated, e.g. + ["ordinary-time"] for [Ordinary_time]. Unlike {!Colitur_kernel.Vocab_ef + .season_slug_word}, this is not adopted from any external lectionary -- + OF has no bootstrapped-from-lectio slug legacy to preserve -- so it is + simply {!season_to_string}'s own hyphenated image; kept as a separate + function anyway so a future divergence (a real lectionary source using + different words) does not require renaming every call site. *) +val season_slug_word : season -> string + +val rank_to_string : rank -> string +val rank_of_string : string -> rank option +val vocab : (season, rank) Colitur_kernel.Vocab.t -- cgit v1.3