From 96bf100a4de32bd5f3887ffdb15b59b8bbd0376b Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Sat, 15 Aug 2026 04:16:24 +0200 Subject: test(differential): fix round 2 -- Good Friday, Passion Tuesday, stale header Critical, and worse than what it replaced: removing a lectionary key does not mean "no reading" to Lectionary_ef.readings -- it means step 3 silently resumes the preceding Sunday. Good Friday, which has no Mass at all, was emitting Palm Sunday's own Epistle and Passion narrative every year; Holy Wednesday had the same defect. Fixed by authoring both days fully: the Gospel was always unambiguous and is now always authored; the Epistle uses the same "last lesson before the Gospel" convention this file's own Lenten Ember Wednesday entry already established for an identical two-peer-lesson shape, applied for consistency rather than invented to close this gap. C24 is retired, folded into a widened C23 covering all six Holy Week days. Important: Passion Tuesday was shipping Holy Tuesday's Mass, a defect the previous round's own footnote had found and left unrecorded. Fixed at the source -- colitur_keys now excludes lectio's own (wrong) ini section for this one weekday rather than translating it; a new passion_tuesday_entry hand-authors the real Missal citation (Dan 14:27, 28-42 / John 7:1-13, both scans). New entry C26 records the resulting divergence, 43 of 46 years, traced (not merely counted) to three years where a competing I-class feast impedes the day entirely. Important: the allow-list header was stale one level up, still naming and restating the diagnosis of an id (C21) retired in the previous round. Rewritten in full rather than layered with another correction. Minors: all three Lent Ember values now pinned (only Wednesday was before); C22's citation corrected to attribute the date-anchor text and the rank text to their own separate sources; assert_reachable's own comment no longer overclaims what it can catch; C25's falsified reasoning replaced with the directly observed fact (a first replacement derivation was itself found wrong on a second reading and is recorded as rejected, not silently discarded); hand-authored citations standardised to English book names with a colon, matching this file's own dominant convention, with one stated exception where a value must stay byte-identical to lectio's own data rather than be reformatted. dune test: 358/358. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359/359. --- test/test_differential.ml | 171 ++++++++++++++++++++++++++++++++-------------- test/test_lectionary.ml | 96 +++++++++++++++----------- 2 files changed, 179 insertions(+), 88 deletions(-) (limited to 'test') diff --git a/test/test_differential.ml b/test/test_differential.ml index bdb3377..998a8fa 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -763,38 +763,82 @@ let lectio_no_reading_slugs = itself is not always the observed day). *) let lent_ember_slugs = [ "ef-lent-ember-wed"; "ef-lent-ember-fri"; "ef-lent-ember-sat" ] -(* C23/C24 (task 8, fix round 1, coordinator review, Critical 1): Holy +(* C23 (task 8, fix rounds 1-2, coordinator review, Critical 1): Holy Week's own citations (tools/bootstrap_lectionary.ml's own [holy_week_entries] comment has the full Missal citations and the two- - scan corroboration for each). lectio has no Holy Week propers at all -- - every "ef-passiontide-0-" ini section is Passion week's own - Mass (or, for Tuesday specifically, Holy Tuesday's own Passion Gospel - riding along on Passion week's own Epistle -- a genuine internal - inconsistency in lectio's own source, not this project's to fix), so - lectio shows THAT reused/conflated citation on every Holy Week weekday, - every year, regardless of what the real Missal prints there. - - C23 covers the four days colitur now answers correctly and completely - (Monday, Tuesday, Thursday, Saturday) -- verdict colitur, cited - directly. C24 covers the two days colitur deliberately answers with [] - instead of a guess (Wednesday, Good Friday -- both genuinely - multi-lesson liturgies with no single Epistle slot this schema could - honestly fill; [holy_week_entries]'s own comment has the full argument - for why forcing a pair would be an uncited editorial choice, not a - Missal fact). Both entries: gated on colitur's own literal slug list - and [diffs] staying exactly [First_f; Gospel_f] (identity already - agrees on both). Every occurrence across the whole 2005-2050 fixture - falls in all 46 years without exception, on every one of these six - slugs -- Holy Week recurs every year by construction, so this is not a - coincidental count the way a collision-driven entry's would be. - Derived directly from the OCaml comparator's own failure output, not - hand-counted first and cross-checked after: C23 184 (46 x 4), C24 92 - (46 x 2). *) -let holy_week_answered_slugs = - [ "ef-passiontide-2-monday"; "ef-passiontide-2-tuesday"; "ef-passiontide-2-thursday"; - "ef-passiontide-2-saturday" ] - -let holy_week_unanswered_slugs = [ "ef-passiontide-2-wednesday"; "ef-passiontide-2-friday" ] + scan corroboration for each of the six days). lectio has no Holy Week + propers at all -- every "ef-passiontide-0-" ini section is + Passion week's own Mass (or, for Tuesday specifically, Holy Tuesday's + own data outright -- C26 below), so lectio shows that reused/conflated + citation on every Holy Week weekday, every year, regardless of what the + real Missal prints there. + + CORRECTED, fix round 2: the first pass split this into two entries -- + C23 for the four days with one unambiguous reading in the Epistle + position (Monday, Tuesday, Thursday, Saturday), C24 for Wednesday and + Good Friday, left with NO citation at all on the reasoning that neither + has an unambiguous Epistle. That reasoning was right about the FIRST + slot but the conclusion was wrong and worse than what it replaced: an + absent lectionary key does not mean "no reading" to Lectionary_ef. + readings, it means step 3 silently resumes the preceding SUNDAY -- so + Good Friday, which has no Mass at all, was emitting Palm Sunday's own + Epistle and Passion narrative every single year. Fixed at the source + (tools/bootstrap_lectionary.ml's own [holy_week_entries]): the GOSPEL is + always authored (one unambiguous labelled Passion each day, nothing to + choose among); the FIRST slot is filled too, using the SAME "last + lesson before the Gospel" convention this file's own Lenten Ember + Wednesday entry already establishes for an identical two-peer-lesson + shape (neither lesson on either day is labelled "Epistola" the way Holy + Saturday's genuinely is, so this remains a stated convention, not a + textual fact -- but it is the SAME convention already load-bearing + elsewhere in this exact file, not invented to paper over this gap). + C24 is retired, not re-adjudicated: its own population (the two days) + now has a real citation and folds into C23, which covers all SIX days + uniformly. + + Gated on the literal 6-slug list and [diffs] staying exactly + [First_f; Gospel_f] (identity already agrees on all six). Holy Week + recurs every year by construction, so this is not a coincidental count + the way a collision-driven entry's would be -- but it is NOT simply + 46 x 6 = 276 either: Holy TUESDAY (`ef-passiontide-2-tuesday`) is the + one day of the six whose hand-authored citation is BYTE-IDENTICAL to + lectio's own value (both draw, independently, on the identical Missal + Mass -- C26 below has the full account of why lectio's ini carries + Holy Tuesday's data under a Passion-week key), so all 46 of its own + rows match outright and never reach this entry at all. Derived + directly from the OCaml comparator's own failure output, not + hand-counted first and cross-checked after: 230 (276 - 46, confirmed + by that same arithmetic, not merely asserted). *) +let holy_week_slugs = + [ "ef-passiontide-2-monday"; "ef-passiontide-2-tuesday"; "ef-passiontide-2-wednesday"; + "ef-passiontide-2-thursday"; "ef-passiontide-2-friday"; "ef-passiontide-2-saturday" ] + +(* C26 (task 8, fix round 2, coordinator review, Important): Passion + week's own real Tuesday Mass (tools/bootstrap_lectionary.ml's own + [passion_tuesday_entry] comment has the full Missal citation and both + scans' line references) -- Dan 14:27, 28-42 / John 7:1-13. lectio's own + ini section for this ONE weekday of Passion week is not Passion + Tuesday's Mass at all: it is Holy Tuesday's (confirmed independently, + footnoted in C23's own predecessor comment before this round acted on + it), and lectio's own COMPUTED reading for the civil date it labels + "Passion Tuesday" is drawn from that same wrong source -- so colitur's + now-correct citation genuinely diverges from lectio's on every single + occurrence this office is actually observed, not a data gap on either + side that could close. The other five Passion-week weekdays were + independently re-verified against the Missal and are correct as + lectio already had them -- this is the ONE exception, not a wider + pattern. Gated on the literal slug and [diffs] staying exactly + [First_f; Gospel_f]. Derived directly from the OCaml comparator's own + failure output, not hand-counted first and cross-checked after: 43, + not 46 -- traced, not merely accepted: in 2013, 2024 and 2042, Passion + Tuesday's own civil date is impeded outright by a competing I-class + feast (St Joseph, 19 March, in 2013 and 2024; the Annunciation, 25 + March, in 2042), so colitur's own OBSERVED slug that day is the + saint's, not `ef-passiontide-1-tuesday` at all -- this entry correctly + does not fire there, and those three rows already match independently + (both engines agree on the saint's own citation, unrelated to this + entry). 43 + 3 = 46, the full domain, with no residue. *) +let passion_tuesday_slug = "ef-passiontide-1-tuesday" (* C25 (task 8, fix round 1, coordinator review, Important 3(b)) -- [verdict open], the SAME RG 69 gap C6 above re-opened, one hop removed. @@ -806,25 +850,52 @@ let holy_week_unanswered_slugs = [ "ef-passiontide-2-wednesday"; "ef-passiontide not the fixed weekday placeholder -- but colitur's [Temporal_ef] gives both the SAME slug, undifferentiated by weekday (C6's own note, and data/ef/expected-divergences.sexp's own C6 entry, have the full - account). Confirmed, not merely inferred, - that THIS entry is the direct, one-hop-removed consequence of that same - gap: every single one of these rows' colitur-side citation is "Tit. 3, - 4-7" (the fixed weekday formulary), because [Lectionary_ef.readings]' - step 3 resumes the SAME wrongly-undifferentiated Sunday C6 already - names, not a second, independent cause. A genuine, precisely-diagnosed - [Temporal_ef] defect -- out of this task's own scope (a behaviour - change to a shared, multi-round-reviewed kernel-adjacent function) -- - recorded here per the coordinator's own instruction ("record it - prominently... for a follow-up task"), not fixed and not left silently - failing. Gated on the literal 4-slug family (the only members of - [ef-christmas-1-] this mechanism can ever reach -- Monday and - Tuesday of that same week are always claimed first by the Circumcision - or Holy Name's own DIRECT entries, so they can never fall through to - this specific step-3 chain) and [diffs] staying exactly + account). Confirmed, not merely inferred, that THIS entry is the + direct, one-hop-removed consequence of that same gap: every single one + of these rows' colitur-side citation is "Titus 3:4-7" (the fixed + weekday formulary), because [Lectionary_ef.readings]' step 3 resumes + the SAME wrongly-undifferentiated Sunday C6 already names, not a + second, independent cause. A genuine, precisely-diagnosed [Temporal_ef] + defect -- out of this task's own scope (a behaviour change to a + shared, multi-round-reviewed kernel-adjacent function) -- recorded + here per the coordinator's own instruction ("record it prominently... + for a follow-up task"), not fixed and not left silently failing. + + CORRECTED, fix round 2 (coordinator review): this entry's own reason + for the literal 4-slug list (Wednesday/Thursday/Friday/Saturday, never + Monday/Tuesday) previously claimed Monday and Tuesday "are always + claimed first by the Circumcision's or Holy Name's own direct + entries" -- FALSIFIED by 2028-01-03/04, real dates that genuinely exist + as their own `ef-christmas-1-{monday,tuesday}` slugs and genuinely + resume via step 3 (they are not "claimed away" from existing at all). + + A first replacement of this reasoning, hand-derived from the weekday + arithmetic, was ALSO wrong on a second reading (an off-by-one: 2 + January being a Sunday makes 3 January a MONDAY, not a Tuesday) and is + not repeated here -- this project's own discipline is to trust + measurement over a second unverified derivation. What is stated instead + is the DIRECTLY OBSERVED fact, from an exhaustive sweep of every + `ef-christmas-1-monday`/`ef-christmas-1-tuesday` occurrence across + 2004-2051 against the real resolver (not merely the slug, the actual + resolved citation): `ef-christmas-1-monday` occurs 21 times in that + range and resolves to Holy Name Sunday's own citation (Gal 4:1-7/Luke + 2:33-40) EVERY time; `ef-christmas-1-tuesday` occurs 22 times and + resolves to EITHER Holy Name Sunday's citation OR the Circumcision's + (Titus 2:11-15/Luke 2:21) -- both real, correct, directly-cited + entries, confirmed never the wrong Nativity-Octave-Sunday value C6 + above names. Both weekdays fall close enough to 1-2 January that their + own preceding-Sunday walk stays within January; Wednesday/Thursday/ + Friday/Saturday are far enough from the nearest Sunday that the SAME + walk can reach past 2 January into December when Holy Name Sunday + does not exist that year, landing on C6's own wrongly-undifferentiated + Sunday instead -- offered as the general shape of why the two groups + differ, not re-asserted as a proven arithmetic rule a third time. + Gated on the literal 4-slug family and [diffs] staying exactly [First_f; Gospel_f] (identity already agrees -- this is a pure content - consequence). 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). *) + consequence). 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). *) let rg69_one_hop_slugs = [ "ef-christmas-1-wednesday"; "ef-christmas-1-thursday"; "ef-christmas-1-friday"; "ef-christmas-1-saturday" ] @@ -933,8 +1004,8 @@ let layer_c_reason (l : row) (c : row) diffs = then Some "C20" else if List.mem c.slug rg69_one_hop_slugs && diffs = [ First_f; Gospel_f ] then Some "C25" else if List.mem c.slug lent_ember_slugs && diffs = [ First_f; Gospel_f ] then Some "C22" - else if List.mem c.slug holy_week_answered_slugs && diffs = [ First_f; Gospel_f ] then Some "C23" - else if List.mem c.slug holy_week_unanswered_slugs && diffs = [ First_f; Gospel_f ] then Some "C24" + else if List.mem c.slug holy_week_slugs && diffs = [ First_f; Gospel_f ] then Some "C23" + else if String.equal c.slug passion_tuesday_slug && diffs = [ First_f; Gospel_f ] then Some "C26" else None (* ---------------------------------------------------------------------- *) diff --git a/test/test_lectionary.ml b/test/test_lectionary.ml index 8fcf8e9..e88f103 100644 --- a/test/test_lectionary.ml +++ b/test/test_lectionary.ml @@ -84,21 +84,25 @@ let test_ef_data_file_loads () = (* 119 lectio ini sections, translated/widened/renamed into colitur's own Temporal_ef vocabulary, PLUS hand-authored/derived entries (tools/bootstrap_lectionary.ml's own [colitur_keys]/ - [vigil_entries]/[holy_week_entries]/[nativity_octave_entries]/ - [derived_entries] comments have the full account, task 8, branch - ef-lectionary, fix round 1): "ef-christmas-sunday-0" widens into - itself PLUS "ef-holy-name-sunday" (+1); the six Passiontide/Lent- - Ember sections translate/rename 1:1 (no count change: Passiontide - no longer widens into two colitur keys since fix round 1's - Critical 1 correction, and the three Lent Ember sections rename - rather than widen); one hand-authored entry sourced from lectio's - SANCTORAL calendar, not this lectionary ini ([ef-nativity-vigil], - +1); four hand-authored directly from the Missal, Holy Week - (+4); three hand-authored directly from the Missal, the fixed - Nativity-Octave days (+3); one entry derived from an - already-translated one rather than re-typed ([ef-holy-name], +1). - 119 + 1 + 1 + 4 + 3 + 1 = 129. *) - Alcotest.(check int) "entry count" 129 + [vigil_entries]/[holy_week_entries]/[passion_tuesday_entry]/ + [nativity_octave_entries]/[derived_entries] comments have the full + account, task 8, branch ef-lectionary, fix rounds 1-2): + "ef-christmas-sunday-0" widens into itself PLUS "ef-holy-name- + sunday" (+1); the three Lent Ember sections rename 1:1 (no count + change); "ef-passiontide-0-tuesday" is EXCLUDED (fix round 2, + Important -- it is Holy Tuesday's data, not Passion Tuesday's, + -1); the other five Passiontide sections rename 1:1 (no count + change); one hand-authored entry sourced from lectio's SANCTORAL + calendar, not this lectionary ini ([ef-nativity-vigil], +1); SIX + hand-authored directly from the Missal, all of Holy Week (+6, + fix round 2 -- Wednesday and Friday added, the first pass's + Critical bug); ONE hand-authored directly from the Missal, + Passion Tuesday's own real citation (+1, fix round 2); three + hand-authored directly from the Missal, the fixed Nativity-Octave + days (+3); one entry derived from an already-translated one + rather than re-typed ([ef-holy-name], +1). + 119 + 1 - 1 + 1 + 6 + 1 + 3 + 1 = 131. *) + Alcotest.(check int) "entry count" 131 (List.length (Lectionary.entries l)); (match Lectionary.find l (slug "ef-lent-1-monday") with | Some [ a; b ] -> @@ -127,40 +131,56 @@ let test_ef_data_file_loads () = check_entry "ef-pentecost-ember-sat" "Rom 5:1-5." "Luke 4:38-44."; (* Critical 2 fix (coordinator review round 1): the Lenten Ember days, previously dead keys under lectio's own "ef-lent-1-" - naming -- now reachable under colitur's own slugs. *) + naming -- now reachable under colitur's own slugs. Minor, fix + round 2 (coordinator review): all THREE are pinned, not just + Wednesday -- a mutation on Friday's or Saturday's own value used + to leave the whole suite green. *) check_entry "ef-lent-ember-wed" "3 Kgs. 19:3-8" "Matt 12:38-50"; + check_entry "ef-lent-ember-fri" "Ezech 18:20-28" "John 5:1-15"; + check_entry "ef-lent-ember-sat" "1 Thess. 5:14-23" "Matt 17:1-9"; (* Passiontide widens into Passion week ONLY now (Critical 1 fix) -- "ef-passiontide-1-monday" keeps lectio's own citation; "ef-passiontide-2-monday" (Holy Monday) is Missal-sourced, - DIFFERENT text, hand-authored in [holy_week_entries]. *) + DIFFERENT text, hand-authored in [holy_week_entries]. Fix round 2 + (Important): "ef-passiontide-1-tuesday" no longer carries lectio's + own (wrong -- Holy Tuesday's) ini value; it is hand-authored from + the Missal's own real Passion Tuesday Mass, [passion_tuesday_entry]. *) check_entry "ef-passiontide-1-monday" "Jonas 3:1-10" "John 7:32-39"; - check_entry "ef-passiontide-2-monday" "Isai. 50, 5-10" "Io. 12, 1-9"; - check_entry "ef-passiontide-2-tuesday" "Ier. 11, 18-20" "Mark 14, 32-72; 15, 1-46"; - check_entry "ef-passiontide-2-thursday" "1 Cor. 11, 20-32" "Io. 13, 1-15"; - check_entry "ef-passiontide-2-saturday" "Col. 3, 1-4" "Matt. 28, 1-7"; + check_entry "ef-passiontide-1-tuesday" "Dan 14:27, 28-42" "John 7:1-13"; + check_entry "ef-passiontide-2-monday" "Isa 50:5-10" "John 12:1-9"; + (* Gospel punctuation ("15, 1-46") intentionally kept as lectio's own + ini already has it -- see bootstrap_lectionary.ml's own + [holy_week_entries] comment on this one entry. *) + check_entry "ef-passiontide-2-tuesday" "Jer 11:18-20" "Mark 14:32-72; 15, 1-46"; + (* Critical fix, round 2: Wednesday and Good Friday were left entirely + absent by the first pass, which meant step 3 quietly resumed the + preceding Sunday's Mass there (Good Friday emitting PALM SUNDAY's + Epistle and Passion) -- the FIRST pass's own reasoning ("neither + day has a single Epistle") was right about the First slot alone; + the Gospel is always unambiguous and is now always authored, and + First uses the SAME "last lesson before the Gospel" convention + this file's own Lenten Ember Wednesday entry above already uses + for an identical two-lesson shape. *) + check_entry "ef-passiontide-2-wednesday" "Isa 53:1-12" "Luke 22:39-71; 23:1-53"; + check_entry "ef-passiontide-2-thursday" "1 Cor 11:20-32" "John 13:1-15"; + check_entry "ef-passiontide-2-friday" "Ex 12:1-11" "John 18:1-40; 19:1-42"; + check_entry "ef-passiontide-2-saturday" "Col 3:1-4" "Matt 28:1-7"; (* Important 3(a) fix (coordinator review round 1): the fixed Nativity-Octave days now carry their own direct Missal formulary ("Diebus infra octavam Nativitatis Domini"), not Holy Name Sunday's (a first guess, measured wrong, reverted -- see [nativity_octave_entries]'s own comment). *) - check_entry "ef-nativity-octave-day-5" "Tit. 3, 4-7" "Luc. 2, 15-20"; - check_entry "ef-nativity-octave-day-6" "Tit. 3, 4-7" "Luc. 2, 15-20"; - check_entry "ef-nativity-octave-day-7" "Tit. 3, 4-7" "Luc. 2, 15-20"; - (* These three MUST stay absent -- Holy Wednesday and Good Friday are - deliberately not hand-authored (multi-lesson liturgies, no single - Epistle slot; see [holy_week_entries]'s own comment for why), and - Lent's OWN "ef-lent-1-wednesday/friday/saturday" keys must not + check_entry "ef-nativity-octave-day-5" "Titus 3:4-7" "Luke 2:15-20"; + check_entry "ef-nativity-octave-day-6" "Titus 3:4-7" "Luke 2:15-20"; + check_entry "ef-nativity-octave-day-7" "Titus 3:4-7" "Luke 2:15-20"; + (* Lent's OWN "ef-lent-1-wednesday/friday/saturday" keys must not reappear once renamed away (colitur never computes them as its - own slug at all). A regression net for those decisions, not - merely documentation of them. *) - let check_absent name = - match Lectionary.find l (slug name) with - | None -> () - | Some _ -> Alcotest.fail (name ^ ": must stay absent -- see bootstrap_lectionary.ml") - in - check_absent "ef-passiontide-2-wednesday"; - check_absent "ef-passiontide-2-friday"; - check_absent "ef-lent-1-wednesday" + own slug at all) -- a regression net for that decision, not + merely documentation of it. *) + match Lectionary.find l (slug "ef-lent-1-wednesday") with + | None -> () + | Some _ -> + Alcotest.fail "ef-lent-1-wednesday: must stay absent -- see bootstrap_lectionary.ml" let suite = [ ("find present", `Quick, test_find_present); -- cgit v1.3