From 03d3c00ccdde318207c8b4fdc456e5e64d6b4abf Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 26 Aug 2026 13:57:14 +0200 Subject: feat(of-lectionary): hand-author the Christmas Day Mass, close the gap colitur readings --rite of printed "- | -" on 25 December every year -- lectio's own 988 keys never included the Christmas DAY Mass at all, only the Vigil (already correctly noted, but left unfilled, in tools/bootstrap_lectionary_of.ml's own named_overrides comment). Sourced, not guessed: docs/research/of/olm-1981-ocr.txt:4513-4520, "16 Ad Missam in die", the same primary authority this module already cites for the cycle rules. First reading and Gospel only, matching this file's own scope everywhere else (First/Gospel is the kernel's own boundary, I7, a separate deferred task) -- Isaiah 52:7-10 / John 1:1-18 (OLM's own LONGER form; the file's LINEAGE section already discloses that short/long-form choices are not modelled anywhere in this data, so this is an application of an existing limitation, not a new one). Injected via a new hand_authored table in the generator, merged into entries before assert_reachable/Lectionary.of_entries -- there is no ini section to derive this from. One new lookup_any call (readings' own existing temporal-slug fallback, unmodified) now resolves BOTH the formulary and the citations for 25 December from the same entry, so both halves of the "citations-unresolved"/"formulary" gap close together, not just the citation half. Verified across the WHOLE domain, not assumed: test_validate_of.ml's exhaustive sweep (COLITUR_EXHAUSTIVE_SWEEP=1, all 8 416 years) now asserts the Nativity gap fires on NONE of them, down from all 8 416 before this fix -- and is kept as a live, dedicated "must never recur" counter rather than deleted. test_rite_of.ml's landmark-year check and test_lectionary_of.ml's 2026 coverage pins are updated the same way (the unresolved-day set that used to be pinned as {25 December} is now pinned as empty, not merely a count going to zero). A concrete golden pin (test_golden_of.ml) locks the exact citations through the full resolved pipeline. data/of/lectionary.sexp regenerated (771 entries, was 770); its own SHA-256 re-pinned. make check (COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force, unpiped, foreground): exit 0, 895 tests, ~536s. --- test/test_golden_of.ml | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'test/test_golden_of.ml') diff --git a/test/test_golden_of.ml b/test/test_golden_of.ml index f40b62a..fd4f781 100644 --- a/test/test_golden_of.ml +++ b/test/test_golden_of.ml @@ -34,7 +34,10 @@ 5. All Souls (2 November). 6. The Sacred Heart (Easter+68). Plus 17 December's own date-keyed reading (Gen 49:2,8-10 / Mt 1:1-17, - fixed earlier on this branch, commit b6d0eba0). *) + fixed earlier on this branch, commit b6d0eba0), and, added by the + fix-wave-2 review (I8), 25 December's own reading (Isa 52:7-10 / + Jn 1:1-18, hand-authored from OLM 1981 -- see [test_christmas_day_ + reading]'s own header). *) module Cal = Colitur_kernel.Calendar module Layer = Colitur_kernel.Layer @@ -317,6 +320,29 @@ let test_december_17_reading () = letter" 2027 12 17 "2027-12-17 slug=of-advent-3-friday first=Genesis 49:2,8-10 gospel=Matthew 1:1-17" +(* ------------------------------------------------------------------ *) +(* 8. Christmas Day itself: fix wave I8 (final-review.md, 2026-08-25- *) +(* colitur-of-phases-3-5). lectio's own 988 keys never covered the *) +(* Christmas DAY Mass at all (only the Vigil) -- `colitur readings *) +(* --rite of` used to print "- | -" on 25 December, every year (pinned, *) +(* before this fix, by test_validate_of.ml's own exhaustive-sweep *) +(* counter: fired on all 8 416 swept years). tools/ *) +(* bootstrap_lectionary_of.ml's own [hand_authored] table now injects it *) +(* directly from OLM 1981's own "16 Ad Missam in die" *) +(* (docs/research/of/olm-1981-ocr.txt:4513-4520): First = Isaiah *) +(* 52:7-10, Gospel = John 1:1-18 (OLM's own LONGER form -- the file's own*) +(* LINEAGE section already discloses that short/long-form choices are *) +(* not modelled anywhere in this data, so this is an application of an *) +(* existing, stated limitation, not a new one). Fixed civil-date entry, *) +(* not cycle-lettered (the Christmas Day Mass does not vary by A/B/C or *) +(* I/II), so a single year is sufficient -- unlike item 7 above, there is*) +(* no cycle-letter axis to re-confirm in a second year. ------------------ *) + +let test_christmas_day_reading () = + check_readings ~msg:"2026-12-25: the Christmas Day Mass, hand-authored from OLM 1981 (Isa 52:7-10/John \ + 1:1-18) -- was \"- | -\" before fix wave I8" + 2026 12 25 "2026-12-25 slug=of-nativity first=Isaiah 52:7-10 gospel=John 1:1-18" + let suite = ( "golden-of", [ Alcotest.test_case "Ordinary Time skips a week (2026); Mary, Mother of the Church" `Quick @@ -328,5 +354,6 @@ let suite = test_annunciation_holy_week_2027; Alcotest.test_case "All Souls (2026)" `Quick test_all_souls_2026; Alcotest.test_case "the Sacred Heart, Easter+68 (2026)" `Quick test_sacred_heart_2026; - Alcotest.test_case "17 December's own date-keyed reading, two civil years" `Quick test_december_17_reading + Alcotest.test_case "17 December's own date-keyed reading, two civil years" `Quick test_december_17_reading; + Alcotest.test_case "Christmas Day's own reading (fix wave I8)" `Quick test_christmas_day_reading ] ) -- cgit v1.3