summaryrefslogtreecommitdiff
path: root/lib/rites/rite_of
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-26 14:28:50 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-26 14:28:50 +0200
commite5cbc662227de4f3ab0089fe73f639f4f84601a4 (patch)
tree264b29424d2d3371f6f31f2b87ac111c74622808 /lib/rites/rite_of
parente5066c0d082a09eca3d4c8bbf8da1cc04dde9104 (diff)
downloadcolitur-e5cbc662227de4f3ab0089fe73f639f4f84601a4.tar.gz
colitur-e5cbc662227de4f3ab0089fe73f639f4f84601a4.zip
fix(citation): make the well-formed reading-part set rite-supplied
I7 (final-review.md, 2026-08-25-colitur-of-phases-3-5): OF Sundays and solemnities shipped without the Second reading, and the lectionary data header called the First reading an "Epistle" -- EF vocabulary. The sole blocker was Validate's own kernel-hardcoded assertion that a well-formed day's sorted citation parts are exactly [First; Gospel]; Citation.part already carried Second. Rite.t gains citation_shapes : Citation.part list list, the fourth EF-shaped kernel misfit (after Preface.t, Mass_formulary.source, transfer_target's strictly-later contract) and the first fixed rather than only documented. EF supplies its one shape unchanged; OF supplies two, [First; Gospel] on a feria/feast/memorial and [First; Second; Gospel] on a Sunday or solemnity (OLM 1981 Praenotanda n. 66.1 vs n. 69.1, n. 84(b)/(c), page-image verified against olm-1981.pdf). Validate's "citations" check now matches against the rite's own declared shapes rather than a single literal pattern, preserving all three invariants it always enforced: zero or one complete shape, never partial; no part outside what the rite declares; no part repeated. bootstrap_lectionary_of.ml's cite now extracts a Second reading from Sunday-cycle ini sections only, correctly excluding the one stray `second` field lectio's snapshot carries on a weekday-cycle section (a content-verified scraping artifact). The hand-authored Christmas Day entry gains its own Second reading from the same OLM passage already cited for its First/Gospel. Regenerated data/of/lectionary.sexp: 771 entries unchanged, citation fields 1542 -> 1725 (+183, all Second readings), SHA-256 re-pinned, header wording fixed and a new coverage bullet added. Responsorial Psalm is deliberately still not emitted -- OLM 1981 Praenotanda n. 71 itself lists it apart from the readings proper as a chant with its own refrain, and the finding driving this change names only the missing Second reading. EF output verified byte-identical to the branch start (empty lib/rites/rite_ef + data/ef diff since v1.0.0, plus a direct binary comparison of `day`/`readings` for 2026, 1583 and 9999 against a worktree build of the pre-change commit). Tests: three new fixtures in test_validate.ml prove the generalisation holds both directions (a multi-shape rite accepts either of its declared shapes; a rite that never declared a shape still rejects it). test_citation_coverage_of.ml's pinned residual grows 41 -> 49, all new entries the same already-understood chapter-crossing shape.
Diffstat (limited to 'lib/rites/rite_of')
-rw-r--r--lib/rites/rite_of/rite_of.ml13
-rw-r--r--lib/rites/rite_of/rite_of.mli7
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/rites/rite_of/rite_of.ml b/lib/rites/rite_of/rite_of.ml
index 9eeb5ef..f45bf50 100644
--- a/lib/rites/rite_of/rite_of.ml
+++ b/lib/rites/rite_of/rite_of.ml
@@ -80,6 +80,19 @@ let context ~lectionary : (Vocab_of.season, Vocab_of.rank) Rite.t =
season_runs = Vocab_of.[ Advent; Christmas; Ordinary_time; Lent; Easter; Ordinary_time ];
transfer_target = Precedence_of.transfer_target;
readings = Lectionary_of.readings ~lectionary ~year_start:Temporal_of.year_start;
+ (* Two well-formed shapes, not EF's one -- OLM 1981 Praenotanda n. 66.1
+ ("Quaelibet Missa tres exhibet lectiones": Sunday/solemnity Mass,
+ First from the OT, Second "ex Apostolo", Gospel) against n. 69.1
+ ("Quaelibet Missa duas exhibet lectiones": ferial Mass, First and
+ Gospel only), both page-image verified,
+ docs/research/of/olm-1981.pdf pp.32-33/"XXXII-XXXIII"; n. 84(b)/(c),
+ pp.37-38/"XXXVII-XXXVIII", extends the three-reading shape to every
+ solemnity of a particular calendar and confines feasts/memorials to
+ two. {!Rite.t.citation_shapes}'s own doc comment has the fuller
+ argument for why this is a rite-supplied field rather than a kernel
+ constant. *)
+ citation_shapes =
+ [ [ Citation.First; Citation.Gospel ]; [ Citation.First; Citation.Second; Citation.Gospel ] ];
creed = Rubrics_of.creed;
gloria = Rubrics_of.gloria;
preface = Rubrics_of.preface }
diff --git a/lib/rites/rite_of/rite_of.mli b/lib/rites/rite_of/rite_of.mli
index eeb38d5..8124467 100644
--- a/lib/rites/rite_of/rite_of.mli
+++ b/lib/rites/rite_of/rite_of.mli
@@ -43,6 +43,13 @@ module Lectionary_of = Lectionary_of
reading-cycle arithmetic's own Advent anchor) -- no [~commons]
parameter, unlike EF: the OF lectionary chain has no Commons
indirection to thread through.
+ - [citation_shapes]: TWO well-formed shapes, not EF's one --
+ [[First; Gospel]] on a feria, feast or memorial, and
+ [[First; Second; Gospel]] on a Sunday or solemnity (OLM 1981
+ Praenotanda n. 66.1/n. 69.1, n. 84(b)/(c)) -- see this file's own
+ [context] for the full citation and
+ {!Colitur_kernel.Rite.t.citation_shapes}'s own doc comment for why
+ this field is rite-supplied at all.
- [creed], [gloria], [preface]: {!Rubrics_of}, IGMR n. 53/67-68/364-365.
[~lectionary] is a caller-supplied parameter, not a value closed over an