From b0ff86ae552b90613be21c52433f4180deba7758 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sat, 15 Aug 2026 03:40:19 +0200 Subject: test(differential): fix round 1 -- Holy Week, Lent Ember, RG 69 Two Critical findings, both real: Holy Week (including the entire Sacred Triduum) was reading Passion Week's Masses -- the original colitur_keys widened lectio's single, conflated ini section into both weeks instead of Passion week alone. Narrowed to Passion week only; Holy Week's own four cleanest days (Monday, Tuesday, Thursday, Saturday) are hand-authored directly from the Missal, verified twice against both scans (C23); Holy Wednesday and Good Friday are genuinely multi-lesson liturgies with no single Epistle slot and are deliberately left unanswered, not guessed (C24). The Lenten Ember days were still dead keys: Temporal_ef computes ef-lent-ember-{wed,fri,sat}, lectio's ini names the same data ef-lent-1-{wednesday,friday,saturday}, and colitur_keys never translated it -- both engines independently fell through to the same wrong ferial answer, so even the differential stayed green (C22, a genuine lectio bug recorded for upstream). Fixed the instance and the class: colitur_keys gained the rename, and tools/bootstrap_lectionary.ml gained assert_reachable, sweeping Rite_ef.Temporal_ef.temporal at generation time so a translation table entry naming a slug colitur never computes dies loudly instead of shipping silently, plus an informational log of every real slug with no entry at all. C21 ("colitur's step 3 cannot reach a correct answer for the fixed Christmastide slugs") is retired, superseded rather than merely patched: the Nativity-Octave days now have their own direct Missal formulary (Tit. 3,4-7/Luc. 2,15-20, "Diebus infra octavam Nativitatis Domini"), resolved at step 2, not step 3 at all. That surfaced a real RG 69 gap underneath it: a Sunday landing 26-31 December should keep its own Office, not the fixed weekday placeholder, which Temporal_ef does not currently distinguish. C6's verdict is re-opened (open, not colitur) for the 19 of its 138 rows where this applies directly, and a new entry C25 (57 rows) records the same gap propagating one hop further through step 3 into Holy Name week. Both are out of this task's own scope -- a behaviour change to a shared, multi-round-reviewed kernel-adjacent function -- and recorded, not fixed, per the coordinator's own instruction. C6's own note is rewritten in full rather than layered with another correction; C18's stale trailing count is fixed to match its own pin; the Vigil-misapplication risk flagged as a Minor closed itself once the Nativity-Octave fix landed, confirmed by inspection rather than assumed. dune test: 358/358. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359/359. --- data/ef/expected-divergences.sexp | 57 +++++++++++++++++++++++++++-------- data/ef/lectionary.sexp | 62 ++++++++++++++++++++++----------------- 2 files changed, 79 insertions(+), 40 deletions(-) (limited to 'data') diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 8c39b43..8b23b9d 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -68,14 +68,18 @@ (note "6-13 January is Christmastide in colitur, matching RG 72-73's explicit boundary at 13 January (corroborated independently by RG 119a's colour rule, §3b). lectio's efSeason switches to time-after-epiphany on 6 January. The season disagreement cascades into colour (green vs white) and, on 7-8 January specifically, into the ferial slug family name (colitur's ef-christmas-2- vs lectio's ef-time-after-epiphany-1- for the same two days). REFRESHED (ef-rebootstrap fixture refresh, 2026-08-12): expected_rows moved 361 -> 368. NOT a new divergence -- the closed C13's own 7 rows (13 January in the 7 years it falls on a Sunday) fold back in here: lectio's fix wave independently fixed its own equivalent of the RG16(a) defect C13 used to allow-list, so on all 7 of those Sunday years lectio's slug now matches colitur's `commemoration-of-the-baptism-of-the-lord` too (not just rank/colour), leaving season as the ONLY residual difference on those rows -- squarely inside C1's own existing shape (diffs subset of [Season;Colour;Slug] with the Slug-diff escape clause unused). REFRESHED AGAIN (ef-rg112-rg110 task, branch ef-rg112-rg110): expected_rows moved 368 -> 361, back to its PRE-ef-rebootstrap value, but for a THIRD, different reason -- SPLIT OUT to its own new entry, C15, not silently re-absorbed: colitur now BUILDS Holy Family (RG 17(b)) and, on these same 7 dates, correctly observes it in the fixed Baptism's place (RG 91 entry 14, RG 112(a)), so colitur's own slug there changes from `commemoration-of-the-baptism-of-the-lord` (which happened to already match lectio's own slug) to `ef-time-after-epiphany-sunday-1` (Holy Family's own, lectio has no equivalent) -- a genuine SLUG divergence now, no longer inside C1's own [Season]-only shape. See C15's own entry for the full account. PROVENANCE, fix round 1 (coordinator finding 6, restoring the discipline this entry's own prior refresh recorded and this round's rewrite had dropped): 361 read directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations's `Received` array, run against the widened C15 predicate/allow-list together, not before it existed) -- not hand-counted first and cross-checked after, and not 368 minus 7 taken on faith: the arithmetic matches C15's own independently-derived 7, which is corroboration, not the derivation itself.") (expected_rows 361)) ((id C6) - (citation "RG 91 entry 17 (\"days within the Octave of the Nativity\")") - (verdict colitur) - (note "29-31 December (and any Sunday landing among them) are II class in colitur, with the ef-nativity-octave-day-{5,6,7} slugs. REFRESHED (ef-rebootstrap fixture refresh, 2026-08-12): expected_rows is UNCHANGED at 138, but the SHAPE narrowed -- lectio's fix wave independently promoted 26-31 December to II class too (its own \"beyond the seven\" fix, RG 67-68), so the RANK component of this divergence is gone; every one of the 138 rows now differs ONLY in slug (lectio keeps its generic ef-christmas-0- feria name; colitur's date-keyed ef-nativity-octave-day-N names are not adopted, since these are FIXED calendar dates within the octave, not a weekday-numbered family Layer A's own literal-pair table could safely absorb without re-entangling the two engines' differing office-identity conventions for this window -- see test_differential.ml's own norm_slug comment for why the analogous January case is handled there and this one deliberately is not). Re-derived the same way as C1 above (Python cross-check against the refreshed fixture and colitur's `day` CLI output, cross-checked against the OCaml comparator's own failure output): 138, exactly the prior count -- a coincidence of this being a pure renaming (identity/count both unchanged), not evidence the recount was skipped. + (citation "RG 91 entry 17 (\"days within the Octave of the Nativity\") for the slug/rank divergence; RG 69, scan1.txt:625-631 word for word, for the QUESTIONED citation component (Important 3(b), coordinator review, task 8 fix round 1): \"De dominica infra octavam Nativitatis Domini, quae scilicet a die 26 ad 31 decembris occurrit, semper fit Officium cum commemoratione festi forte occurrentis, iuxta rubricas, nisi dominica incidat in festum I classis: quo in casu, fit de festo cum commemoratione dominicae\" -- the Sunday's OWN Office (not the fixed weekday placeholder) is kept, WITH a commemoration of whatever feast falls that day, whenever a Sunday lands anywhere 26-31 December (unless that feast is itself I class, in which case the feast wins with the Sunday commemorated instead)") + (verdict open) + (note "REWRITTEN IN FULL, task 8 fix round 1 (coordinator review, Important 4: a prior version of this note left three successive NARROWED/CORRECTED paragraphs standing on top of each other in a file whose whole purpose is a top-down audit trail -- this replaces all of them with one current account, history preserved in git, not layered here again. + +29-31 December (RG 91 entry 17, II class) are colitur's own fixed `ef-nativity-octave-day-{5,6,7}` slugs regardless of weekday -- including on the years one of them IS itself a Sunday, which is the root of everything below. lectio keeps its own generic `ef-christmas-0-` (or, on a Sunday, `ef-christmas-sunday-0`) naming instead: a genuine, historically stable SLUG divergence (this part of the entry is unchanged since the fixture refresh that first measured 138). -NARROWED, task 8 (branch ef-lectionary, citation comparison): expected_rows moved 138 -> 31, and this is a GENUINE NARROWING, not a re-absorption -- the missing 107 are DELIBERATELY LEFT UNEXPLAINED (failing test_no_unexplained_differences), not folded into any entry here. Root cause, traced precisely: `ef-nativity-octave-day-{5,6,7}` are colitur-only FIXED slugs with no lectionary entry of their own; when the day is a WEEKDAY (not itself a Sunday), Lectionary_ef.readings' step 3 walks back to the ONE immediately preceding civil Sunday and reads THAT Sunday's own temporal identity -- which, for a run of consecutive December/January dates, is itself frequently ANOTHER entry-less fixed slug (another Nativity-Octave day, or `ef-nativity-vigil` on the one occasion 24 December itself falls on a Sunday) rather than a slug this generator was able to give a citation. lectio's own resolution reaches further (empirically: it sometimes finds Christmas Day's own Mass, sometimes Advent IV's, sometimes the Sunday-within-the-Octave's own distinct Mass -- Missal-verified, docs/research/scan1.txt, \"Dominica infra octavam Nativitatis Domini, II classis\": Epistle Gal. 4,1-7, Gospel Luc. 2,33-40) via a mechanism colitur's own single-hop step 3 does not implement. A genuine, precisely-diagnosed colitur LOGIC gap (Lectionary_ef.readings, not a data/bootstrap issue) -- fixing it properly (an iterative walk-back, or a per-year-verified direct entry for every fixed Christmastide slug, the same rigor task 6 applied to the 15 readingless saints) is out of this task's own safe scope; recommended as a follow-up task in task-8-report.md. Of the 138 prior rows, 88 still match this entry's own [Slug_f]-only shape (the day's OWN citation, via whatever it resolves to, happens to equal lectio's); the other 50 now also carry [First_f]/[Gospel_f] and fall outside this entry's [diffs = [ Slug_f ]] exact-equality guard, by design -- narrowing this guard to `subset` would have silently re-absorbed exactly the failure this task was asked to surface. +CITATION component, new this task: Important 3(a) (tools/bootstrap_lectionary.ml's own `nativity_octave_entries`) gave these three slugs a real, twice-Missal-verified citation for the first time (\"Diebus infra octavam Nativitatis Domini, II classis\": Tit. 3,4-7 / Luc. 2,15-20, docs/research/scan1.txt:6281-6329 and scan2.txt:6900-6960, each date's own rubric -- \"Missa Puer natus est nobis, ut supra [28]\" -- pointing straight at it). It does NOT converge with lectio's own answer, on ANY of the 138 rows, because lectio's own resolution never reaches this direct formulary either -- empirically, it always falls back to whichever true civil Sunday precedes the date (Christmas Day's own Mass, Advent IV's, or the genuinely different \"Dominica infra octavam\" Mass, Gal. 4,1-7/Luc. 2,33-40, depending on the year's own alignment) -- so all 138 rows, not merely a subset, now carry a citation diff alongside the pre-existing slug one. -CORRECTED, same task, fix round: an earlier pass of this note measured 31/107 (not 88/50) against a version of tools/bootstrap_lectionary.ml's own `colitur_keys` that REPLACED (rather than widened) the \"ef-christmas-sunday-0\" translation -- a regression caught by test_lectionary_ef.ml's own PRE-EXISTING `test_step3_christmas_feria_resumes_sunday` going from pass to fail (that test predates this task and pins the historical \"Sunday within the Octave of the Nativity\", 26-28 December, a DIFFERENT civil window from Holy Name Sunday that also, Missal-confirmed, shares the identical Mass -- docs/research/scan1.txt, \"Dominica infra octavam Nativitatis Domini\": Gal. 4,1-7 / Luc. 2,33-40). Fixed by widening `colitur_keys \"ef-christmas-sunday-0\"` to keep the original key ALONGSIDE the Holy-Name-Sunday alias, the same \"widen, never narrow\" rule Passiontide already used -- once fixed, every later feria whose one-hop preceding-Sunday walk lands on THAT Sunday now also resolves correctly, moving 57 more rows out of [C21] and into this entry's own [Slug_f]-only shape. Re-derived directly from the OCaml comparator's own failure output after the fix, not hand-counted first and cross-checked after: 88.") - (expected_rows 88)) +VERDICT, split by the SAME 138-row population, not two entries: on the 119 rows where 29-31 December is an ordinary WEEKDAY that year, colitur's `Tit. 3,4-7` citation is CONFIRMED CORRECT against the Missal (verdict colitur would be accurate for this subset alone). On the 19 rows where 29-31 December IS ITSELF a Sunday that year (2006-12-31, 2007-12-30, 2012-12-30, 2013-12-29, 2017-12-31, 2018-12-30, 2019-12-29, 2023-12-31, 2024-12-29, 2028-12-31, 2029-12-30, 2030-12-29, 2034-12-31, 2035-12-30, 2040-12-30, 2041-12-29, 2045-12-31, 2046-12-30, 2047-12-29 -- independently re-derived against `date -d +%u` for every one of the 138 dates, not estimated), RG 69's own unconditional rule means the SUNDAY'S distinct Office should be observed instead -- colitur's `Temporal_ef` does not distinguish the two cases at the slug level at all, so it emits the weekday formulary there too, which is WRONG by this reading. This is a genuine [Temporal_ef] defect (not a lectionary/bootstrap issue, and not something this generator can fix on its own), out of this task's own safe scope -- a behaviour change to a shared, multi-round-reviewed kernel-adjacent function, the same discipline C25 below explains for its own one-hop-removed consequence of this identical gap. [verdict] is [open], not [colitur], because a single per-entry verdict cannot honestly claim BOTH sub-populations at once, and the coordinator's own instruction was explicit: mark it questioned, not leave a verdict the evidence contradicts. + +Gated on the literal date window (month=12, day in {29,30,31}) AND colitur's own slug family (`nativity_octave_day_slugs`) AND `subset diffs [ Slug_f; First_f; Gospel_f ]` (widened this task from the exact-match `diffs = [ Slug_f ]` the pre-citation-comparison entry used -- narrowing back to exact-match would have silently re-excluded the very citation divergence this task exists to surface). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 138.") + (expected_rows 138)) ((id C8) (citation "RG 87 (Minor Litanies/Rogations, Mon/Tue before Ascension); register §3c item 3") (verdict colitur) @@ -106,7 +110,9 @@ NARROWED, task 8: expected_rows moved 416 -> 406. Not a regression -- 10 of the ((id C18) (citation "RG 124 (\"XVIII - De coloribus paramentorum\", \"C) De colore rubro\"), both photographic scans word for word: 124(b) \"adhibetur color ruber in Officio et Missa de festis: ... Sanctorum Apostolorum et Evangelistarum, in eorum die natalicio, excepto festo S. Ioannis (27 decembris)\"; 124(e) \"Sanctorum Martyrum, quorum colitur aut martyrium\"; register's own audit rewrite, ef-sanctoral-audit task") (verdict colitur) - (note "ef-sanctoral-audit task (2026-08-14): 14 [status = Feast] sanctoral entries bootstrapped from lectio's own tridentine-calendar.ini carry a colour lectio's data gets wrong at the source (checked individually: e.g. `martha`'s own Polish field there already reads \"Dziewicy\" -- Virgin, no \"Męczennicy\" -- yet that SAME record's colour is red) -- corrected via data/ef/adjustments.sexp's own `Edit ((Set_colour ...))` directives, the same mechanism and root-cause shape `eusebius-confessor` (ef-rebootstrap fix round 1, F3) already used. Two rules: an Apostle/Evangelist's own feast day is red except John's (27 December, already correctly white, untouched); a plain Confessor/Bishop/Virgin (no \"Mart.\"/\"Mm.\" in the calendarium's own line, not an Apostle) is white by RG 117's five-colour residual; a Martyr's own martyrdom is red. `audit_colour_corrected_slugs` in test_differential.ml is the literal 14-slug list (conversion-of-st-paul, chair-of-st-peter, john-of-san-fecundo, ephrem-of-syria, julia-of-falconieri, john-gualbert, camillus-de-lellis, jerome-emiliani, apollinaris, martha, alphonsus-liguori, augustine, rose-of-lima, josaphat) -- every one of these [status = Feast], so it wins its own day most years (rarely impeded) and diffs on [Colour_f] alone against lectio's still-wrong value. A further eight corrections (prisca/peter/vitus/margaret/agapitus/liborii/mark-i, all [Commemoration_only], plus the new `barbara` Add) are NOT in this count: a [Commemoration_only] candidate can never be the OBSERVED day (Precedence.resolve's own design), so this row-level comparator (which reads only the observed day's own record) never has a row to diff for them -- inert to this fixture, not unaffected in truth. Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations's own `Received`), not hand-counted first and cross-checked after: 526.") + (note "ef-sanctoral-audit task (2026-08-14): 14 [status = Feast] sanctoral entries bootstrapped from lectio's own tridentine-calendar.ini carry a colour lectio's data gets wrong at the source (checked individually: e.g. `martha`'s own Polish field there already reads \"Dziewicy\" -- Virgin, no \"Męczennicy\" -- yet that SAME record's colour is red) -- corrected via data/ef/adjustments.sexp's own `Edit ((Set_colour ...))` directives, the same mechanism and root-cause shape `eusebius-confessor` (ef-rebootstrap fix round 1, F3) already used. Two rules: an Apostle/Evangelist's own feast day is red except John's (27 December, already correctly white, untouched); a plain Confessor/Bishop/Virgin (no \"Mart.\"/\"Mm.\" in the calendarium's own line, not an Apostle) is white by RG 117's five-colour residual; a Martyr's own martyrdom is red. `audit_colour_corrected_slugs` in test_differential.ml is the literal 14-slug list (conversion-of-st-paul, chair-of-st-peter, john-of-san-fecundo, ephrem-of-syria, julia-of-falconieri, john-gualbert, camillus-de-lellis, jerome-emiliani, apollinaris, martha, alphonsus-liguori, augustine, rose-of-lima, josaphat) -- every one of these [status = Feast], so it wins its own day most years (rarely impeded) and diffs on [Colour_f] alone against lectio's still-wrong value. A further eight corrections (prisca/peter/vitus/margaret/agapitus/liborii/mark-i, all [Commemoration_only], plus the new `barbara` Add) are NOT in this count: a [Commemoration_only] candidate can never be the OBSERVED day (Precedence.resolve's own design), so this row-level comparator (which reads only the observed day's own record) never has a row to diff for them -- inert to this fixture, not unaffected in truth. Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations's own `Received`), not hand-counted first and cross-checked after: 450. + +CORRECTED, task 8 fix round 1 (coordinator review, Minor): this note previously ended \"...cross-checked after: 526\", inconsistent with its own `(expected_rows 450)` immediately below and with the value `dune test` actually asserts and passes -- a stale transcription, not a live discrepancy (the test itself has been green at 450 throughout; only this trailing sentence disagreed with it). Fixed to read 450, matching the pin.") (expected_rows 450)) ((id C19) (citation "register §3c item 5 (Time-after-Epiphany week-numbering anchor, the SAME citation this file's own [strip_epiphany_index]/Layer B header comment already carries) -- not a new rubric dispute, the previously-invisible CITATION-level consequence of an already-adjudicated NUMBERING artifact") @@ -118,10 +124,35 @@ NARROWED, task 8: expected_rows moved 416 -> 406. Not a regression -- 10 of the (verdict colitur) (note "task 8 (branch ef-lectionary): lectio's own [caldata.Readings] genuinely resolves NOTHING at all -- literally \"-\"/\"-\", not merely a different value -- for 14 civil days across 2005-2050 (task-7-report.md's own count, independently reproduced here): every one is a day on which one of SEVEN readingless class-3 saints (vincent-ferrer x5, isidore-of-seville x3, john-of-god x2, thomas-aquinas, francis-of-paola, sts-felicitas-perpetua, frances-rome, x1 each) is the day's own observed office. Task 6 gave every one of these saints either a Common assignment (data/ef/commons.sexp, the Missal's own instruction at that saint's date, e.g. \"Missa Os iusti, de Communi Confessoris non Pontificis I loco\" for Vincent Ferrer) or, where the Missal instead prints a full proper Mass at the saint's own date (thomas-aquinas, john-of-god, francis-of-paola), a direct citation via data/ef/adjustments.sexp -- both routes read from three independent witnesses each (scan1, scan2, the page images; task-6-report.md's own cross-check discipline), not invented. colitur is MORE COMPLETE here, not wrong: lectio's own generator simply has no data for these particular saints, a genuine upstream gap this task's own report records for lectio, not a colitur defect. Gated on the literal 7-slug list AND on lectio's field reading the literal \"-\"/\"-\" sentinel, never \"any citation mismatch on these slugs\" -- a genuine future content disagreement on one of these seven saints (e.g. if lectio's own data ever grew an entry that DISAGREED with colitur's scan-verified citation) would still surface as unexplained, not silently absorbed here. Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 14.") (expected_rows 14)) - ((id C21) - (citation "NONE -- this entry cites no RG paragraph, deliberately: it is not a rubric dispute. Missal-verified anyway, for the ONE guessed value this task tried and reverted: docs/research/scan1.txt, \"Dominica infra octavam Nativitatis Domini, II classis\" -- Epistle \"Gal. 4, 1-7\", Gospel \"Luc. 2, 33-40\" (the SAME pair as Holy Name Sunday, corroborating tools/bootstrap_lectionary.ml's own [derived_entries] comment on why that particular guess was wrong for OTHER years anyway)") + ; C21 -- CLOSED, task 8 fix round 1 (coordinator review), REMOVED not + ; re-adjudicated to a different verdict: its own diagnosis ("colitur's + ; step 3 cannot reach a correct answer for the fixed Christmastide + ; slugs") was SUPERSEDED, not merely fixed around, by Important 3(a)'s + ; direct Missal formulary for ef-nativity-octave-day-{5,6,7} (which + ; resolves at step 2 now, not step 3 at all) and the Critical-1/2 fixes + ; elsewhere in this same fix round. What C21 used to cover has split + ; cleanly into C6 above (widened, re-opened) and C25 below (a newly, + ; more precisely diagnosed one-hop-removed consequence of the SAME RG 69 + ; gap) -- test_differential.ml's own layer_c_reason carries no C21 + ; predicate any more, the same discipline this file's own C2-C5/C7/ + ; C9-C13 closures already established. + ((id C22) + (citation "RG 91 entry 18 (\"Quatuor Tempora... post primam dominicam Quadragesimae\" -- the Lenten Ember days) + MR1962 \"De anno et eius partibus\" (register §3a, the same citation Rite_ef.Temporal_ef's own [ember] carries)") + (verdict colitur) + (note "task 8 fix round 1 (coordinator review, Critical 2): the Lenten Ember days (colitur's own `ef-lent-ember-{wed,fri,sat}`) are reachable for the first time this fix round -- tools/bootstrap_lectionary.ml's own [colitur_keys] comment has the full account of the dead-key bug this closes (lectio's own ini keys this data under the generic \"ef-lent-1-\" family, unreachable under colitur's own spelling until renamed). lectio's own SLUG for these three days already matched colitur's (\"ef-lent-ember-wed\" etc, both engines -- confirmed no [Slug_f] in this entry's own rows), but lectio's own READING resolution has the IDENTICAL internal mismatch colitur's used to have: its own [caldata.Readings] never reaches its own Ember data either, so it still falls back to Lent I Sunday's own Mass (e.g. \"2 Cor. 6:1-10\"/\"Matt 4:1-11\") on every one of these dates, where colitur now correctly shows the Ember day's own proper (e.g. \"3 Kgs. 19:3-8\"/\"Matt 12:38-50\"). A genuine LECTIO bug, reported here for upstream, NOT patched in this task (the brief's own triage rule). This is exactly the \"Holy Thursday was violet in both\" shape this project's own CLAUDE.md already names: layer 3 was STRUCTURALLY BLIND to this the whole time colitur also had the bug, since both engines independently produced the identical wrong answer -- a real illustration of why a passing differential means less here than it looks, not merely a citation elsewhere in this file's own header. Gated on the literal 3-slug list and `diffs = [ First_f; Gospel_f ]` exactly (slug/rank/colour already agree). Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 128 (43 + 43 + 42 -- a few of the 46-year population are impeded by a competing sanctoral feast each year, so the Ember office itself is not always the observed day).") + (expected_rows 128)) + ((id C23) + (citation "Holy Monday (\"Feria II Hebdomadae sanctae, I classis\"): Isai. 50,5-10 / Io. 12,1-9. Holy Tuesday (\"Feria III Hebdomadae sanctae, I classis\"): Ier. 11,18-20 / the Passion according to Mark, 14,32-72;15,1-46. Holy Thursday (\"Feria V in Cena Domini\"): 1 Cor. 11,20-32 / Io. 13,1-15. Holy Saturday (Missa Vigiliae Paschalis' own Epistle+Gospel, explicitly labelled \"Lectio Epistolae\", distinct from its own preceding prophecies): Col. 3,1-4 / Matt. 28,1-7. All four: docs/research/scan1.txt AND scan2.txt, word for word, both scans independently (tools/bootstrap_lectionary.ml's own [holy_week_entries] comment has the exact line references)") + (verdict colitur) + (note "task 8 fix round 1 (coordinator review, Critical 1): the ORIGINAL version of this task's own `colitur_keys` widened lectio's single \"ef-passiontide-0-\" ini section into BOTH Passion week (`ef-passiontide-1-*`) and Holy Week (`ef-passiontide-2-*`, including the entire Sacred Triduum) on the strength of lectio's own citation being byte-identical between the two weeks -- WRONG: that only proves lectio CONFLATES the two weeks (it has no Holy Week propers of its own at all), not that the Missal does. The Mass of the Lord's Supper reading Passion Sunday's own ferial Mass was a real defect, not a citation nicety -- caught by coordinator review before this task's own commit, not by anything in this suite (the differential was GREEN under the wrong widening, since both sides showed the identical wrong value). Fixed: Holy Week's own four cleanest days (Monday, Tuesday, Thursday, Saturday -- ordinary single-Epistle-single-Gospel Mass structure, unlike Wednesday/Good Friday, see C24 below) are hand-authored directly from the Missal, twice-verified. lectio, still conflating the two weeks, keeps showing Passion week's own reused citation on every one of these dates, every year -- a genuine, permanent, structural divergence, not a data gap on either side that could close. Gated on the literal 4-slug list and `diffs = [ First_f; Gospel_f ]` exactly (identity already agrees on both sides -- season/slug/rank/colour were never the problem). Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 184 (46 years x 4 days -- Holy Week recurs every single year without exception, so this is not a coincidental count the way a collision-driven entry's would be).") + (expected_rows 184)) + ((id C24) + (citation "Holy Wednesday (\"Feria IV Hebdomadae sanctae\"): TWO Old Testament lessons, Isai. 62,11;63,1-7 THEN Isai. 53,1-12, neither labelled \"Epistola\", before the Passion according to Luke (22,39-71;23,1-53). Good Friday (\"Feria VI in Passione et Morte Domini\" -- not even a Mass, \"Solemnis Actio liturgica\"): TWO peer lessons, Osee 6,1-6 THEN Exodus 12,1-11, again neither labelled \"Epistola\", directly into the Passion according to John (18,1-40;19,1-42). Both: docs/research/scan1.txt, corroborated scan2.txt") + (verdict colitur) + (note "task 8 fix round 1 (coordinator review, Critical 1's own scope boundary): unlike Holy Monday/Tuesday/Thursday/Saturday (C23 above), Holy Wednesday and Good Friday genuinely have no single reading in the \"Epistle\" position this schema's [First]/[Gospel] pair assumes every OTHER entry in data/ef/lectionary.sexp has -- TWO peer Old Testament lessons lead directly into the Passion narrative on both days, neither one labelled \"Epistola\" the way Holy Saturday's own Colossians reading explicitly is. Forcing either lesson into the [First] slot would be an uncited editorial choice this generator has no textual warrant to make on its own, so tools/bootstrap_lectionary.ml's own [holy_week_entries] deliberately leaves both slugs absent -- colitur emits [], an honest declination, not a guess. lectio, still conflating Holy Week with Passion week (C23's own account), shows Passion week's own reused (wrong) citation on both dates regardless. verdict colitur: declining to guess is the epistemically correct move here, and strictly more correct than lectio's confident wrong answer, even though colitur offers no citation of its own to point to. Gated on the literal 2-slug list and `diffs = [ First_f; Gospel_f ]` exactly. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 92 (46 years x 2 days).") + (expected_rows 92)) + ((id C25) + (citation "RG 69, scan1.txt:625-631 word for word (the SAME citation C6 above carries in full) -- this entry is the one-hop-removed CONSEQUENCE of that same gap, not an independent rubric question") (verdict open) - (note "task 8 (branch ef-lectionary): a genuine, precisely-diagnosed colitur LOGIC LIMITATION, not a data/bootstrap issue -- Rite_ef.Lectionary_ef.readings' step 3 is a SINGLE hop to the immediately preceding civil Sunday's own temporal identity. For a run of colitur-only FIXED Christmastide slugs (`ef-nativity-octave-day-{5,6,7}`, 29-31 December; the `ef-christmas-{0,1,2}-` ferias of the two weeks that follow) that ONE preceding Sunday is itself frequently ANOTHER entry-less fixed slug (another Nativity-Octave day, or, on the single occasion 24 December itself falls on a Sunday, `ef-nativity-vigil`) -- so step 3 finds nothing at all (95 of these 107 rows: colitur emits [], a conservative, honest absence, never a fabricated guess) or, on the 12 rows where the walk lands exactly on that Vigil-is-a-Sunday collision, finds the WRONG thing (the Vigil's own Mass -- Rom 1:1-6/Matt 1:18-21 -- correctly attached to 24 December itself, but misapplied here to a LATER feria that is not Christmas Eve). lectio's own resolution reaches further by a mechanism this task did not fully reverse-engineer: empirically (grep against the fixture) it variously finds Christmas Day's own Mass or Advent IV's own Mass (e.g. 2005-12-29 -> Heb 1:1-12/John 1:1-14, Christmas Day's own Mass, 25 December 2005 being a Sunday that year; 2006-12-29 -> 1 Cor. 4:1-5/Luke 3:1-6, Advent IV's, 24 December 2006 being a Sunday with no OTHER Sunday between it and 29 December). Properly fixing this needs either an ITERATIVE walk-back inside [readings] itself (keep walking to the next-earlier Sunday until an entry is found, a genuine behaviour change) or a per-year-verified direct entry for every fixed Christmastide slug across the whole window (task 6's own rigor, applied to a new, comparably-sized population) -- both are real units of work needing their own TDD/mutation-testing/review-round discipline (Tasks 4-6's own history: every one of them had at least one review round with real findings before being adjudicated DONE), not something to bolt onto this task's own scope (fixture regeneration + the comparator + triage) without that same rigor. RECOMMENDED as a dedicated follow-up task; task-8-report.md has the full diagnostic account. Gated on the two literal colitur slug-family prefixes (`ef-nativity-octave-day-`, `ef-christmas-`) and the diff set (`subset diffs [ Slug_f; First_f; Gospel_f ]`, never `Rank`/`Colour_f`/`Season`) -- broader than C14-C16's own short literal-DATE lists (matching C17's own precedent for a large, structurally-defined population instead), so a future regression that also changed RANK or COLOUR on one of these same slugs would still surface as unexplained; a future regression confined to CONTENT on one of these exact slugs, however, would be silently absorbed here -- the acknowledged, and unavoidable, cost of tracking a genuinely-open, unfixed area rather than a closed one. - -CORRECTED, same task, fix round: an earlier pass of this note measured 202 (190 empty + 12 misapplied-Vigil), before `colitur_keys \"ef-christmas-sunday-0\"` was fixed to WIDEN rather than replace (C6's own note above has the full account -- a regression this task introduced and then caught via test_lectionary_ef.ml's own pre-existing `test_step3_christmas_feria_resumes_sunday`). Fixing that regression also legitimately shrank THIS entry's own population: 57 of the 202 rows resolved outright once `ef-christmas-sunday-0` had its own direct entry again (the Sunday-within-the-Octave case, and every later feria whose one-hop walk lands there); 38 more matched lectio's own citation exactly with no Layer C entry needed at all, once the true target -- Christmas Day's own Mass, on a year 25 December falls on a Sunday -- became reachable via the SAME fix (a Sunday's own temporal identity resolving correctly is a precondition for a THIRD entity, a later feria's own preceding-Sunday walk finding it, to resolve correctly too). Re-derived directly from the OCaml comparator's own failure output after the fix, not hand-counted first and cross-checked after: 107 (95 empty + 12 misapplied-Vigil, the SAME 12 dates as before -- that sub-population is untouched by the `ef-christmas-sunday-0` fix, since it is caused by a DIFFERENT fixed slug, `ef-nativity-vigil`, colliding with a Sunday).") - (expected_rows 107)) + (note "task 8 fix round 1 (coordinator review, Important 3(b)): colitur's `ef-christmas-1-{wednesday,thursday,friday,saturday}` (Holy Name week ferias with no proper of their own) resume, via Lectionary_ef.readings' step 3, the preceding Sunday's temporal identity -- which, on these specific dates, is one of the Nativity-Octave Sundays C6 above already names as RG-69-QUESTIONED (a Sunday landing 29-31 December, where colitur wrongly emits the fixed weekday formulary \"Tit. 3,4-7\"/\"Luc. 2,15-20\" instead of the Sunday's own distinct Office). Confirmed, not merely inferred: every single one of these 57 rows' colitur-side citation is exactly \"Tit. 3, 4-7\" -- the SAME wrong value C6's own 19 Sunday-landing rows carry, propagated one civil-date hop later, not a second, independent cause. Monday and Tuesday of the SAME week can never reach this chain (they are always claimed first by the Circumcision's or Holy Name's own direct entries), which is why only four weekdays appear here, never six. A genuine [Temporal_ef] defect, out of this task's own scope (the same shared, multi-round-reviewed kernel-adjacent function C6's own note names) -- recorded here per the coordinator's own explicit instruction (\"record it prominently... for a follow-up task\"), not fixed and not left silently failing. Gated on the literal 4-slug family and `diffs = [ First_f; Gospel_f ]` exactly (identity already agrees -- this is a pure content consequence one hop removed). Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 57 (19 + 19 + 13 + 6, Wednesday/Thursday/Friday/Saturday respectively).") + (expected_rows 57)) diff --git a/data/ef/lectionary.sexp b/data/ef/lectionary.sexp index 41504c1..75b6ad4 100644 --- a/data/ef/lectionary.sexp +++ b/data/ef/lectionary.sexp @@ -1,15 +1,20 @@ ; data/ef/lectionary.sexp -- EF (1962) temporal lectionary (Epistle + ; Gospel citations, never scripture text), bootstrapped from lectio. ; Generator: tools/bootstrap_lectionary.ml -- do not hand-edit; re-run the -; generator against a newer lectio and commit the diff instead. +; generator against a newer lectio and commit the diff instead. Every +; emitted key is asserted, at generation time, to be a slug +; Rite_ef.Temporal_ef actually computes (see this generator's own +; [assert_reachable]) -- a dead key cannot ship silently again. ; ; Source: ../lectio/internal/caldata/tridentine-lectionary.ini ; SHA-256: fde533289fb620fea33386b0a3e733ada3c1d01f10a36d8a7f5a2b500c92740e -; 128 entries (119 ini sections translated/widened into colitur's own +; 129 entries (119 ini sections translated/widened into colitur's own ; Temporal_ef vocabulary via [colitur_keys]; 1 hand-authored from a -; second source file [vigil_entries]; 1 derived from an already- +; second source file [vigil_entries]; 4 hand-authored directly from +; the Missal [holy_week_entries]; 3 hand-authored directly from the +; Missal [nativity_octave_entries]; 1 derived from an already- ; translated entry above rather than re-typed [derived_entries] -- -; see this generator's own comments on all three). Regenerate with: +; see this generator's own comments on all five). Regenerate with: ; eval $(opam env) && dune exec tools/bootstrap_lectionary.exe -- ../lectio/internal/caldata/tridentine-lectionary.ini data/ef/lectionary.sexp ((ef-advent-2-monday (((part First) (reference "Rom 15:4-13")) @@ -128,24 +133,15 @@ (ef-holy-name-sunday (((part First) (reference "Gal 4:1-7")) ((part Gospel) (reference "Luke 2:33-40")))) - (ef-lent-1-friday - (((part First) (reference "Ezech 18:20-28")) - ((part Gospel) (reference "John 5:1-15")))) (ef-lent-1-monday (((part First) (reference "Ezech 34:11-16")) ((part Gospel) (reference "Matt 25:31-46")))) - (ef-lent-1-saturday - (((part First) (reference "1 Thess. 5:14-23")) - ((part Gospel) (reference "Matt 17:1-9")))) (ef-lent-1-thursday (((part First) (reference "Ezech 18:1-9")) ((part Gospel) (reference "Matt 15:21-28")))) (ef-lent-1-tuesday (((part First) (reference "Isa 55:6-11")) ((part Gospel) (reference "Matt 21:10-17")))) - (ef-lent-1-wednesday - (((part First) (reference "3 Kgs. 19:3-8")) - ((part Gospel) (reference "Matt 12:38-50")))) (ef-lent-2-friday (((part First) (reference "Gen 37:6-22")) ((part Gospel) (reference "Matt 21:33-46")))) @@ -209,6 +205,15 @@ (ef-lent-after-ashes-thursday (((part First) (reference "Isa 38:1-6")) ((part Gospel) (reference "Matt 8:5-13")))) + (ef-lent-ember-fri + (((part First) (reference "Ezech 18:20-28")) + ((part Gospel) (reference "John 5:1-15")))) + (ef-lent-ember-sat + (((part First) (reference "1 Thess. 5:14-23")) + ((part Gospel) (reference "Matt 17:1-9")))) + (ef-lent-ember-wed + (((part First) (reference "3 Kgs. 19:3-8")) + ((part Gospel) (reference "Matt 12:38-50")))) (ef-lent-sunday-1 (((part First) (reference "2 Cor. 6:1-10")) ((part Gospel) (reference "Matt 4:1-11")))) @@ -227,6 +232,15 @@ (ef-nativity (((part First) (reference "Heb 1:1-12")) ((part Gospel) (reference "John 1:1-14")))) + (ef-nativity-octave-day-5 + (((part First) (reference "Tit. 3, 4-7")) + ((part Gospel) (reference "Luc. 2, 15-20")))) + (ef-nativity-octave-day-6 + (((part First) (reference "Tit. 3, 4-7")) + ((part Gospel) (reference "Luc. 2, 15-20")))) + (ef-nativity-octave-day-7 + (((part First) (reference "Tit. 3, 4-7")) + ((part Gospel) (reference "Luc. 2, 15-20")))) (ef-nativity-vigil (((part First) (reference "Rom 1:1-6")) ((part Gospel) (reference "Matt 1:18-21")))) @@ -254,24 +268,18 @@ (ef-passiontide-1-wednesday (((part First) (reference "Lev 19:1-2, 11-19, 25")) ((part Gospel) (reference "John 10:22-38")))) - (ef-passiontide-2-friday - (((part First) (reference "Jer 17:13-18")) - ((part Gospel) (reference "John 11:47-54")))) (ef-passiontide-2-monday - (((part First) (reference "Jonas 3:1-10")) - ((part Gospel) (reference "John 7:32-39")))) + (((part First) (reference "Isai. 50, 5-10")) + ((part Gospel) (reference "Io. 12, 1-9")))) (ef-passiontide-2-saturday - (((part First) (reference "Jer 18:18-23")) - ((part Gospel) (reference "John 12:10-36")))) + (((part First) (reference "Col. 3, 1-4")) + ((part Gospel) (reference "Matt. 28, 1-7")))) (ef-passiontide-2-thursday - (((part First) (reference "Dan 3:25, 34-45.")) - ((part Gospel) (reference "Luke 7:36-50")))) + (((part First) (reference "1 Cor. 11, 20-32")) + ((part Gospel) (reference "Io. 13, 1-15")))) (ef-passiontide-2-tuesday - (((part First) (reference "Jer 11:18-20")) - ((part Gospel) (reference "Mark 14:32-72; 15, 1-46")))) - (ef-passiontide-2-wednesday - (((part First) (reference "Lev 19:1-2, 11-19, 25")) - ((part Gospel) (reference "John 10:22-38")))) + (((part First) (reference "Ier. 11, 18-20")) + ((part Gospel) (reference "Mark 14, 32-72; 15, 1-46")))) (ef-pentecost (((part First) (reference "Acts 2:1-11.")) ((part Gospel) (reference "John 14:23-31.")))) -- cgit v1.3