diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-26 13:57:14 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-26 13:57:14 +0200 |
| commit | 03d3c00ccdde318207c8b4fdc456e5e64d6b4abf (patch) | |
| tree | eaa8b77b549f6751594b2868798c7ca2d1b3ca70 /tools/bootstrap_lectionary_of.ml | |
| parent | 9b8821f7b914c94f5b2c8eeda05407ee921b3d5a (diff) | |
| download | colitur-03d3c00ccdde318207c8b4fdc456e5e64d6b4abf.tar.gz colitur-03d3c00ccdde318207c8b4fdc456e5e64d6b4abf.zip | |
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.
Diffstat (limited to 'tools/bootstrap_lectionary_of.ml')
| -rw-r--r-- | tools/bootstrap_lectionary_of.ml | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/tools/bootstrap_lectionary_of.ml b/tools/bootstrap_lectionary_of.ml index a679b01..f94a7db 100644 --- a/tools/bootstrap_lectionary_of.ml +++ b/tools/bootstrap_lectionary_of.ml @@ -376,9 +376,12 @@ let named_overrides = [ (* Content-verified against the real reading (Isa 62:1-5/Matt 1:18-25, the genealogy/annunciation-to-Joseph narrative): this is the VIGIL Mass, not "Christmas Day" despite the bare name -- the real Christmas - DAY Mass (Isa 52:7-10/John 1:1-14) is ABSENT from lectio's own 988 - keys entirely, a genuine, notable gap (see the generator's own - coverage report). *) + DAY Mass is ABSENT from lectio's own 988 keys entirely (a genuine + gap, not a mapping bug here). CLOSED, fix wave I8: [hand_authored] + below now injects it directly (Isa 52:7-10/John 1:1-18, OLM 1981's + own "16 Ad Missam in die") -- see that table's own citation for the + full argument, including why it is not routed through THIS table + (there is no ini section to override). *) ("christmas", [ "of-nativity-vigil" ]); (* Content-verified (Sirach 24 Wisdom-personified / Eph 1 / John 1:1-18): this is the SECOND SUNDAY AFTER THE NATIVITY (Normae n.36), not a @@ -621,6 +624,38 @@ let weekday_letter = function `I -> "i" | `II -> "ii" let slug_or_die name = match Slug.of_string name with Ok s -> s | Error e -> die "%s" e +(* Fix wave I8 (final-review.md, 2026-08-25-colitur-of-phases-3-5): the + Christmas DAY Mass ("of-nativity") is genuinely absent from lectio's own + 988 ini keys -- niedziela.pl's own harvest never covered it at all, not + a mapping bug in this generator (already noted, correctly, in + [named_overrides]'s own comment on the "christmas" base above, which is + the VIGIL, not the Day). Confirmed sourceable, not merely "cannot + convert": docs/research/of/olm-1981-ocr.txt:4513-4520 ("16 Ad Missam in + die"), the same primary authority this whole module already cites for + the cycle rules (lectionary_of.mli). First reading and Gospel only, + matching this file's own scope everywhere else (data/of/lectionary.sexp + :2's own header, and {!Colitur_kernel.Validate}'s [First; Gospel] + assertion) -- OLM's own Second Reading (Heb 1:1-6) and Psalm (Ps 97) are + out of scope for the identical reason every other day's Second Reading + and Psalm are (I7, a kernel-level limitation, not this file's own). + + The Gospel (Io 1, 1-18) carries OLM's own "longior/brevior" choice + ("1-18 (longior) vel 1-5.9-14 (brevior)") -- the LONGER form is used, + the same already-disclosed limitation this file's own LINEAGE section + states for every other short/long-form pair in this data ("Nor can it + show OLM's short/long-form reading alternatives, which niedziela.pl does + not distinguish"), not a new one introduced here. + + Injected directly as a Lectionary entry, not through the ini-derived + [mapped]/[entries_of] pipeline above -- there is no ini section to + derive it FROM. Merged into [entries] before {!assert_reachable} (so it + is checked exactly like every other emitted key: "of-nativity" is a + real Rite_of.Temporal_of slug) and before {!Lectionary.of_entries}. *) +let hand_authored = + [ ( slug_or_die "of-nativity", + [ { Citation.part = Citation.First; reference = "Isaiah 52:7-10" }; + { Citation.part = Citation.Gospel; reference = "John 1:1-18" } ] ) ] + let entries_of (slug, r) = match r with | Flat cs -> [ (slug_or_die slug, cs) ] @@ -866,7 +901,7 @@ let () = let resolved = resolve_sections secs in let sanctoral_slugs = reachable_sanctoral_slugs () in let mapped, report = map_bases resolved ~sanctoral_slugs in - let entries = List.concat_map entries_of mapped in + let entries = List.concat_map entries_of mapped @ hand_authored in let temporal_slugs = reachable_temporal_slugs () in let date_keyed_slugs = reachable_date_keyed_slugs () in let uncovered_temporal = assert_reachable entries ~temporal_slugs ~sanctoral_slugs ~date_keyed_slugs in |
