aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-15 04:16:24 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-15 04:16:24 +0200
commit96bf100a4de32bd5f3887ffdb15b59b8bbd0376b (patch)
treeea3be84f551016a617adf50abdd34af5ae390546
parentb0ff86ae552b90613be21c52433f4180deba7758 (diff)
downloadcolitur-96bf100a4de32bd5f3887ffdb15b59b8bbd0376b.tar.gz
colitur-96bf100a4de32bd5f3887ffdb15b59b8bbd0376b.zip
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.
-rw-r--r--data/ef/expected-divergences.sexp69
-rw-r--r--data/ef/lectionary.sexp56
-rw-r--r--test/test_differential.ml167
-rw-r--r--test/test_lectionary.ml96
-rw-r--r--tools/bootstrap_lectionary.ml207
5 files changed, 400 insertions, 195 deletions
diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp
index 8b23b9d..c3c5f00 100644
--- a/data/ef/expected-divergences.sexp
+++ b/data/ef/expected-divergences.sexp
@@ -14,25 +14,30 @@
; exactly, so an unnoticed behaviour change here fails loudly instead of
; silently changing what the harness accepts.
;
-; DEPARTURE, task 8 (branch ef-lectionary, citation comparison): C21 below is
-; the FIRST entry in this file that is NOT [verdict colitur] -- it is
-; [verdict open], a genuine, precisely-diagnosed colitur LOGIC LIMITATION
-; (Lectionary_ef.readings' step 3, a single hop to the preceding Sunday, is
-; not deep enough for a run of colitur-only fixed Christmastide slugs) that
-; this task explained fully but did not fix, because doing so safely needs
-; either a behaviour change to a shared, multi-round-reviewed kernel-adjacent
-; function or a Task-6-sized primary-source verification exercise, both out
-; of this task's own scope. Not a silent pass: `expected-divergences-
-; missalemeum.sexp` already established [verdict open]/[verdict unresolvable]
-; as this project's own mechanism for "genuinely unresolved, honestly
-; counted, not swept under the rug, and re-adjudicable by name" (see that
-; file's own M11/M13/M15 entries) -- this task extends the SAME mechanism to
-; this file rather than inventing a new one, on the judgment that a
-; permanently-red `dune test` would serve this project's own stated goals
-; (loud, tracked, NON-silent flagging) worse than a counted, cited, clearly-
-; labelled-as-open entry does. Flagged here for explicit review, the same as
-; every other deviation this project's own task reports record rather than
-; hide.
+; DEPARTURE, task 8 (branch ef-lectionary, citation comparison): this file
+; carries [verdict open] entries -- C6 and C25 as of fix round 2 -- for
+; genuine, precisely-diagnosed colitur DEFECTS the task that found them
+; explained fully but did not fix, because doing so safely needs a
+; behaviour change to a shared, multi-round-reviewed kernel-adjacent
+; function (Rite_ef.Temporal_ef, RG 69's own gap -- see C6's own note for
+; the full account) out of that task's own scope. Not a silent pass:
+; `expected-divergences-missalemeum.sexp` already established [verdict
+; open]/[verdict unresolvable] as this project's own mechanism for
+; "genuinely unresolved, honestly counted, not swept under the rug, and
+; re-adjudicable by name" (see that file's own M11/M13/M15 entries) --
+; this task extends the SAME mechanism to this file rather than inventing
+; a new one, on the judgment that a permanently-red `dune test` would
+; serve this project's own stated goals (loud, tracked, NON-silent
+; flagging) worse than a counted, cited, clearly-labelled-as-open entry
+; does. Flagged here for explicit review, the same as every other
+; deviation this project's own task reports record rather than hide.
+;
+; CORRECTED, fix round 2 (coordinator review, Important): this paragraph
+; previously named a since-retired id (C21) and restated its own retired
+; diagnosis verbatim, becoming stale the moment C21 itself was replaced by
+; C6 (widened) and C25 (new) -- rewritten in full rather than layering a
+; correction on top, the same discipline C6's own note below applies to
+; itself for the identical reason.
;
; Regenerate expected_rows only after re-adjudicating the change against the
; Missal/register -- never by re-running the comparator and copying its
@@ -137,22 +142,28 @@ CORRECTED, task 8 fix round 1 (coordinator review, Minor): this note previously
; 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)")
+ (citation "RG 91 entry 18, scan1.txt:772-775 word for word, for the RANK (\"18. Feriae II classis, nempe: ... et feriae Quatuor Temporum Adventus, Quadragesimae et mensis septembris\" -- the Lenten Ember days are II-class ferias); MR1962 \"De anno et eius partibus\", scan1.txt:2084-2089 word for word, for the DATE-ANCHOR (\"Quatuor Tempora celebrantur... post primam dominicam Quadragesimae...\" -- WHEN they fall, register §3a, the same citation Rite_ef.Temporal_ef's own [ember] carries). CORRECTED, fix round 2 (coordinator review, Minor): the previous version of this citation quoted the date-anchor TEXT but attributed it to RG 91 entry 18 -- the two are different sections of the Missal answering different questions (rank vs date), both real, now cited separately and correctly.")
(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-<weekday>\" 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-<weekday>\" 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")
+ (citation "Holy Monday (\"Feria II Hebdomadae sanctae, I classis\"): Isa 50:5-10 / John 12:1-9. Holy Tuesday (\"Feria III Hebdomadae sanctae, I classis\"): Jer 11:18-20 / the Passion according to Mark, 14:32-72; 15:1-46. Holy Wednesday (\"Feria IV Hebdomadae sanctae\"): Isa 53:1-12 (the SECOND of two peer lessons, see note) / the Passion according to Luke, 22:39-71; 23:1-53. Holy Thursday (\"Feria V in Cena Domini\"): 1 Cor 11:20-32 / John 13:1-15. Good Friday (\"Feria VI in Passione et Morte Domini\"): Ex 12:1-11 (the SECOND of two peer lessons) / the Passion according to John, 18:1-40; 19:1-42. 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 six: 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'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))
+ (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-<weekday>\" 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).
+
+CORRECTED, fix round 2 (coordinator review, Critical): the first-round fix hand-authored only FOUR of Holy Week's six days (Monday, Tuesday, Thursday, Saturday), reasoning that Wednesday and Good Friday have no unambiguous Epistle and leaving both entirely ABSENT under a separate entry, C24 (now retired). That was worse than the bug it replaced: an absent 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 year. Fixed at the source: the GOSPEL is always unambiguous on both days (one labelled Passion narrative each) and is always authored; the FIRST slot is filled too, using the SAME \"last lesson before the Gospel\" convention already load-bearing elsewhere in data/ef/lectionary.sexp (the Lenten Ember Wednesday entry, itself an identical two-peer-lesson shape, already ships its own second lesson) -- not a fresh editorial invention for this entry. 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 a consistently-applied one. C24 is retired, not re-adjudicated: its own two-day population now has a real citation and folds into this entry, which covers all SIX days of Holy Week uniformly.
+
+lectio, still conflating Holy Week with Passion week on all six days, keeps showing Passion week's own reused citation regardless -- a genuine, permanent, structural divergence, not a data gap on either side that could close. Gated on the literal 6-slug list and `diffs = [ First_f; Gospel_f ]` exactly (identity already agrees on all six -- season/slug/rank/colour were never the problem). NOT simply 46 x 6 = 276: Holy TUESDAY's own hand-authored citation is BYTE-IDENTICAL to lectio's own value (both draw on the identical Missal Mass -- C26 below has the account of why lectio's own ini carries Holy Tuesday's data under a Passion-week key), so all 46 of ITS rows match outright and never reach this entry. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 230 (276 - 46).")
+ (expected_rows 230))
((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 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).")
+ (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 \"Titus 3:4-7\"/\"Luke 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 \"Titus 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. 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.
+
+CORRECTED, fix round 2 (coordinator review, Minor): 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). Replaced with the directly OBSERVED fact, from an exhaustive sweep of every such occurrence 2004-2051 against the real resolver (not merely the slug, the resolved citation): `ef-christmas-1-monday` occurs 21 times 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. 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 that the same walk can reach past 2 January into December when Holy Name Sunday does not exist that year, landing on this entry's own wrong Sunday instead -- the general shape, not re-asserted as a proven arithmetic rule (a first attempted derivation was itself found wrong on a second reading and is not repeated). 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))
+ ((id C26)
+ (citation "Passion Tuesday's real Mass (\"Feria tertia, III classis, Statio ad S. Cyriacum\"): Dan 14:27, 28-42 / John 7:1-13 -- docs/research/scan1.txt:11085-11121, corroborated scan2.txt:12063-12104, word for word both scans")
+ (verdict colitur)
+ (note "task 8 fix round 2 (coordinator review, Important): lectio's own ini section for Passion Tuesday (`ef-passiontide-0-tuesday`) is not Passion Tuesday's Mass at all -- it is Holy Tuesday's (Jer 11:18-20 / the Passion according to Mark), confirmed independently against both scans; C23 above has the full account of that same confusion for the OTHER (Holy) Tuesday. tools/bootstrap_lectionary.ml's own [colitur_keys] now excludes this one ini section from translation rather than using its (wrong) value, and [passion_tuesday_entry] hand-authors the real Missal citation instead. lectio's own COMPUTED reading for the civil date it labels \"Passion Tuesday\" is drawn from the same wrong source, so colitur's now-correct citation genuinely diverges from lectio's on every occurrence this office is actually the observed day -- 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. Gated on the literal slug 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: 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/2024; the Annunciation, 25 March, in 2042), so colitur's own observed slug that day is the saint's, not this entry's slug at all -- those three rows already match independently, both engines agreeing on the saint's own citation. 43 + 3 = 46, the full domain, no residue.")
+ (expected_rows 43))
diff --git a/data/ef/lectionary.sexp b/data/ef/lectionary.sexp
index 75b6ad4..893f878 100644
--- a/data/ef/lectionary.sexp
+++ b/data/ef/lectionary.sexp
@@ -4,17 +4,21 @@
; 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.
+; [assert_reachable]) -- a dead key cannot ship silently again (a
+; wrongly-VALUED live key still can; [assert_reachable]'s own comment
+; says why this check cannot be widened to catch that).
;
; Source: ../lectio/internal/caldata/tridentine-lectionary.ini
; SHA-256: fde533289fb620fea33386b0a3e733ada3c1d01f10a36d8a7f5a2b500c92740e
-; 129 entries (119 ini sections translated/widened into colitur's own
+; 131 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]; 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 five). Regenerate with:
+; second source file [vigil_entries]; 6 hand-authored directly from
+; the Missal [holy_week_entries]; 1 hand-authored directly from the
+; Missal, one entry [passion_tuesday_entry]; 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 six).
+; 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"))
@@ -233,14 +237,14 @@
(((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"))))
+ (((part First) (reference "Titus 3:4-7"))
+ ((part Gospel) (reference "Luke 2:15-20"))))
(ef-nativity-octave-day-6
- (((part First) (reference "Tit. 3, 4-7"))
- ((part Gospel) (reference "Luc. 2, 15-20"))))
+ (((part First) (reference "Titus 3:4-7"))
+ ((part Gospel) (reference "Luke 2:15-20"))))
(ef-nativity-octave-day-7
- (((part First) (reference "Tit. 3, 4-7"))
- ((part Gospel) (reference "Luc. 2, 15-20"))))
+ (((part First) (reference "Titus 3:4-7"))
+ ((part Gospel) (reference "Luke 2:15-20"))))
(ef-nativity-vigil
(((part First) (reference "Rom 1:1-6"))
((part Gospel) (reference "Matt 1:18-21"))))
@@ -263,23 +267,29 @@
(((part First) (reference "Dan 3:25, 34-45."))
((part Gospel) (reference "Luke 7:36-50"))))
(ef-passiontide-1-tuesday
- (((part First) (reference "Jer 11:18-20"))
- ((part Gospel) (reference "Mark 14:32-72; 15, 1-46"))))
+ (((part First) (reference "Dan 14:27, 28-42"))
+ ((part Gospel) (reference "John 7:1-13"))))
(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 "Ex 12:1-11"))
+ ((part Gospel) (reference "John 18:1-40; 19:1-42"))))
(ef-passiontide-2-monday
- (((part First) (reference "Isai. 50, 5-10"))
- ((part Gospel) (reference "Io. 12, 1-9"))))
+ (((part First) (reference "Isa 50:5-10"))
+ ((part Gospel) (reference "John 12:1-9"))))
(ef-passiontide-2-saturday
- (((part First) (reference "Col. 3, 1-4"))
- ((part Gospel) (reference "Matt. 28, 1-7"))))
+ (((part First) (reference "Col 3:1-4"))
+ ((part Gospel) (reference "Matt 28:1-7"))))
(ef-passiontide-2-thursday
- (((part First) (reference "1 Cor. 11, 20-32"))
- ((part Gospel) (reference "Io. 13, 1-15"))))
+ (((part First) (reference "1 Cor 11:20-32"))
+ ((part Gospel) (reference "John 13:1-15"))))
(ef-passiontide-2-tuesday
- (((part First) (reference "Ier. 11, 18-20"))
- ((part Gospel) (reference "Mark 14, 32-72; 15, 1-46"))))
+ (((part First) (reference "Jer 11:18-20"))
+ ((part Gospel) (reference "Mark 14:32-72; 15, 1-46"))))
+ (ef-passiontide-2-wednesday
+ (((part First) (reference "Isa 53:1-12"))
+ ((part Gospel) (reference "Luke 22:39-71; 23:1-53"))))
(ef-pentecost
(((part First) (reference "Acts 2:1-11."))
((part Gospel) (reference "John 14:23-31."))))
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-<weekday>" 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.
+ scan corroboration for each of the six days). lectio has no Holy Week
+ propers at all -- every "ef-passiontide-0-<weekday>" 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.
- 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" ]
+ 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.
-let holy_week_unanswered_slugs = [ "ef-passiontide-2-wednesday"; "ef-passiontide-2-friday" ]
+ 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-<weekday>] 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-<weekday>"
- 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);
diff --git a/tools/bootstrap_lectionary.ml b/tools/bootstrap_lectionary.ml
index ed40c92..4939770 100644
--- a/tools/bootstrap_lectionary.ml
+++ b/tools/bootstrap_lectionary.ml
@@ -135,6 +135,28 @@ let colitur_keys name =
[ "ef-lent-ember-wed" ]
else if String.equal name "ef-lent-1-friday" then [ "ef-lent-ember-fri" ]
else if String.equal name "ef-lent-1-saturday" then [ "ef-lent-ember-sat" ]
+ else if String.equal name "ef-passiontide-0-tuesday" then
+ (* Important, fix round 2 (coordinator review): the general
+ Passiontide rename below carries every OTHER weekday's citation
+ straight through from lectio's own ini, correct for Passion week
+ (Critical 1's own fix, this comment's own sibling branch). Tuesday
+ is the ONE exception, already flagged, not yet acted on, by
+ [holy_week_entries]'s own footnote in the previous fix round: the
+ ini's "ef-passiontide-0-tuesday" section is not Passion week's own
+ Mass at all -- it is HOLY Tuesday's (Jer 11:18-20 / the Passion
+ according to Mark), confirmed independently against BOTH scans at
+ the time. Passion week's own real Tuesday Mass ("Feria tertia, III
+ classis, Statio ad S. Cyriacum", scan1.txt:11085-11121, corroborated
+ scan2.txt:12063-12104) is Dan 14:27, 28-42 / John 7:1-13 -- a
+ DIFFERENT Epistle and a DIFFERENT Gospel from what the ini section
+ carries. Excluded here (empty translation, not a rename) so the
+ wrong ini value is never used; the correct one is hand-authored
+ below, [passion_tuesday_entry]. lectio itself never surfaces this,
+ since its own computed reading is drawn from the SAME (Holy
+ Tuesday's) data on the day it labels "Passion Tuesday" too --
+ data/ef/expected-divergences.sexp's own new entry records the
+ resulting divergence. *)
+ []
else (
match List.find_opt (fun wd -> String.equal name ("ef-passiontide-0-" ^ wd)) weekdays with
| Some wd ->
@@ -147,16 +169,14 @@ let colitur_keys name =
CONFLATES the two weeks -- it has no Holy Week propers of its
own -- not that the Missal does: Holy Monday's real Mass
(docs/research/scan1.txt, "Feria II Hebdomadae sanctae, I
- classis") is Isai. 50,5-10 / Io. 12,1-9, nothing like
- Passion-week Monday's Ionae 3,1-10 / Io. 7,32-39 that the widen
- was putting there, and Holy Thursday's is 1 Cor. 11,20-32 / Io.
- 13,1-15 -- the Mass of the Lord's Supper reading Passion
+ classis") is Isa 50:5-10 / John 12:1-9, nothing like
+ Passion-week Monday's Jonas 3:1-10 / John 7:32-39 that the widen
+ was putting there, and Holy Thursday's is 1 Cor 11:20-32 / John
+ 13:1-15 -- the Mass of the Lord's Supper reading Passion
Sunday's own ferial Mass was the actual defect, not merely a
citation nicety. Narrowed to Passion week ONLY; Holy Week's own
- citations (Monday, Tuesday, Thursday, Saturday) are
- hand-authored below, [holy_week_entries] -- see its own comment
- for which two days of Holy Week (Wednesday, Good Friday) are
- deliberately NOT included and why. *)
+ citations (all six weekdays, fix round 2) are hand-authored
+ below, [holy_week_entries]. *)
[ "ef-passiontide-1-" ^ wd ]
| None -> [ name ])
@@ -196,6 +216,19 @@ let convert sec =
generator's own single-ini design cannot reach on its own. *)
let slug_or_die name = match Slug.of_string name with Ok s -> s | Error e -> die "%s" e
+(* CITATION FORMAT, fix round 2 (coordinator review, Minor): every
+ hand-authored reference below uses ENGLISH book abbreviations with a
+ colon before the verse ("John 12:1-9"), matching the form already
+ DOMINANT in this file's own ini-derived data (counted directly: "John"
+ 40 occurrences vs "Io." 2; "Luke" 34 vs "Luc." 3; "Titus" 1 vs "Tit." 3
+ -- the Latin forms were ALL this generator's own earlier, inconsistent
+ choice, not lectio's), the same "one form per book, matching what's
+ already dominant" discipline data/ef/commons.sexp's own header already
+ states for hand-authored citations. An earlier version of every entry
+ below used Latin book names and Missal-style comma verse separators
+ ("Isai. 50, 5-10"), inconsistent with the rest of the file and, in one
+ entry, inconsistent with ITSELF (Ier./Mark mixed in the same pair) --
+ all converted here, content unchanged, only the spelling. *)
let pair ~first ~gospel =
[ { Citation.part = Citation.First; reference = first };
{ Citation.part = Citation.Gospel; reference = gospel } ]
@@ -213,60 +246,98 @@ let vigil_entries =
between):
- [ef-passiontide-2-monday] (Holy Monday, "Feria II Hebdomadae sanctae,
- I classis"): Isai. 50,5-10 / Io. 12,1-9 -- scan1.txt "Lectio Isaiae
+ I classis"): Isa 50:5-10 / John 12:1-9 -- scan1.txt "Lectio Isaiae
Prophetae... Isai. 50, 5-10" + "Sequentia... secundum Ioannem. Io. 12,
1-9"; scan2.txt corroborates both citations word for word.
- [ef-passiontide-2-tuesday] (Holy Tuesday, "Feria III Hebdomadae
- sanctae, I classis"): Ier. 11,18-20 / the Passion according to Mark,
- 14,32-72;15,1-46 -- scan1.txt "Lectio Ieremiae Prophetae... Ier. 11,
+ sanctae, I classis"): Jer 11:18-20 / the Passion according to Mark,
+ 14:32-72; 15:1-46 -- scan1.txt "Lectio Ieremiae Prophetae... Ier. 11,
18-20" + "Evangelium Passionis et Mortis Domini secundum Marcum.
14,32-72; 15,1-46"; scan2.txt corroborates both.
- [ef-passiontide-2-thursday] (Holy Thursday, "Feria V in Cena Domini"):
- 1 Cor. 11,20-32 / Io. 13,1-15 -- scan1.txt "Lectio Epistolae beati
+ 1 Cor 11:20-32 / John 13:1-15 -- scan1.txt "Lectio Epistolae beati
Pauli Apostoli ad Corinthios... 1 Cor. 11, 20-32" + "Sequentia...
secundum Ioannem... Io. 13,1-15"; scan2.txt corroborates both.
- [ef-passiontide-2-saturday] (Holy Saturday, Missa Vigiliae Paschalis'
own Epistle+Gospel -- the actual Mass, distinct from the earlier
- prophecies, explicitly labelled "Lectio EPISTOLAE"): Col. 3,1-4 /
- Matt. 28,1-7 -- scan1.txt "Lectio Epistolae beati Pauli Apostoli ad
+ prophecies, explicitly labelled "Lectio EPISTOLAE"): Col 3:1-4 /
+ Matt 28:1-7 -- scan1.txt "Lectio Epistolae beati Pauli Apostoli ad
Colossenses... Col. 3,1-4" + "Sequentia... secundum Matthaeum. Mt.
28,1-7"; scan2.txt corroborates both.
- DELIBERATELY NOT INCLUDED, and recorded here rather than guessed:
+ Fix round 2 (coordinator review, Critical): the remaining two days,
+ Holy Wednesday and Good Friday, were left ENTIRELY absent by the first
+ pass, on the reasoning that neither has a single reading in the
+ "Epistle" position. That reasoning was correct for the FIRST slot but
+ the wrong conclusion for the pair as a whole, and it broke something
+ worse than what it replaced: an absent lectionary key does not mean
+ "no reading" to {!Rite_ef.Lectionary_ef.readings} -- it means STEP 3
+ resumes the preceding Sunday, so Good Friday -- which has no Mass at
+ all -- was emitting Palm Sunday's own Epistle and Passion narrative.
+ Fixed properly:
- - [ef-passiontide-2-wednesday] (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) -- no single reading occupies the
- "Epistle" position this schema's [First]/[Gospel] pair assumes every
- other entry in this file has, unlike Holy Saturday's genuinely
- labelled Epistle above.
- - [ef-passiontide-2-friday] (Good Friday, "Feria VI in Passione et
- Morte Domini"): not even a Mass ("Solemnis Actio liturgica"), with
- 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).
-
- Forcing either into a single First/Gospel pair would be an editorial
- choice this generator has no textual warrant to make on its own --
- unlike Holy Saturday, where the Mass's own Epistle is explicitly
- labelled and distinct from its own preceding prophecies. Left absent:
- data/ef/expected-divergences.sexp's own Layer C entry records what this
- means for the differential (colitur emits [], an honest absence, not a
- guess). *)
+ - The GOSPEL is unambiguous on both days -- one labelled Passion
+ narrative each, nothing to choose among -- so it is always authored:
+ Holy Wednesday, Luke 22:39-71; 23:1-53 (scan1.txt "Evangelium
+ Passionis et Mortis Domini secundum Lucam. 22, 39-71; 23, 1-53");
+ Good Friday, John 18:1-40; 19:1-42 (scan1.txt "Evangelium Passionis
+ et Mortis Domini secundum Ioannem. 18,1-40; 19,1-42"). Both
+ corroborated scan2.txt.
+ - The FIRST slot is filled too, by the SAME "last lesson before the
+ Gospel" convention this file's own Lenten Ember Wednesday entry
+ (below, in [colitur_keys]'s own ini translation, not hand-authored
+ here) already applies to an identical two-lesson shape: Exodi
+ 24,12-18 then 3 Reg. 19,3-8 (scan1.txt:8311/8377), and the file ships
+ the SECOND. Applied here for the same reason -- consistency with
+ already-shipped precedent, not a fresh editorial choice invented for
+ this entry: Holy Wednesday's own two Isaiah lessons are Isai. 62,
+ 11;63,1-7 THEN Isai. 53,1-12 (scan1.txt:12379/12415, corroborated
+ scan2.txt) -- the file ships Isa 53:1-12, the second. Good Friday's
+ own two lessons are Osee 6,1-6 THEN Ex. 12,1-11 (scan1.txt:
+ 13143/13181, corroborated scan2.txt) -- the file ships Ex 12:1-11,
+ the second. Neither lesson is labelled "Epistola" on either day
+ (unlike Holy Saturday's genuinely labelled Epistle above), so this
+ remains a stated CONVENTION, not a textual fact the Missal asserts
+ -- but it is the SAME convention already load-bearing elsewhere in
+ this exact file, not a new one invented to paper over this gap. *)
let holy_week_entries =
- [ (slug_or_die "ef-passiontide-2-monday", pair ~first:"Isai. 50, 5-10" ~gospel:"Io. 12, 1-9");
+ [ (slug_or_die "ef-passiontide-2-monday", pair ~first:"Isa 50:5-10" ~gospel:"John 12:1-9");
(slug_or_die "ef-passiontide-2-tuesday",
- pair ~first:"Ier. 11, 18-20" ~gospel:"Mark 14, 32-72; 15, 1-46");
- (slug_or_die "ef-passiontide-2-thursday", pair ~first:"1 Cor. 11, 20-32" ~gospel:"Io. 13, 1-15");
- (slug_or_die "ef-passiontide-2-saturday", pair ~first:"Col. 3, 1-4" ~gospel:"Matt. 28, 1-7")
+ pair ~first:"Jer 11:18-20" ~gospel:"Mark 14:32-72; 15, 1-46");
+ (* The Gospel's own punctuation ("15, 1-46", not "15:1-46") is
+ deliberately kept exactly as lectio's own ini already has it
+ (`ef-passiontide-0-tuesday`'s own `gospel` field, byte for byte)
+ rather than normalised to this file's own colon convention: this
+ value is not merely CORROBORATED by lectio's data, it is the
+ SAME data (Holy Tuesday's Mass, which the ini's Tuesday section
+ happens to carry outright) -- reformatting it would turn a
+ genuine byte-identical match into a false, punctuation-only
+ divergence the differential would then have to explain away. *)
+ (slug_or_die "ef-passiontide-2-wednesday",
+ pair ~first:"Isa 53:1-12" ~gospel:"Luke 22:39-71; 23:1-53");
+ (slug_or_die "ef-passiontide-2-thursday", pair ~first:"1 Cor 11:20-32" ~gospel:"John 13:1-15");
+ (slug_or_die "ef-passiontide-2-friday", pair ~first:"Ex 12:1-11" ~gospel:"John 18:1-40; 19:1-42");
+ (slug_or_die "ef-passiontide-2-saturday", pair ~first:"Col 3:1-4" ~gospel:"Matt 28:1-7")
]
+(* Important, fix round 2 (coordinator review): Passion week's own real
+ Tuesday Mass ("Feria tertia, III classis, Statio ad S. Cyriacum",
+ scan1.txt:11085-11121, corroborated scan2.txt:12063-12104, word for
+ word both scans): Dan 14:27, 28-42 / John 7:1-13. [colitur_keys]'s own
+ "ef-passiontide-0-tuesday" branch above excludes lectio's ini value for
+ this one weekday (it is Holy Tuesday's Mass, not Passion Tuesday's --
+ see that branch's own comment for the full account) rather than
+ translating it, so this is the ONLY source of a citation for
+ "ef-passiontide-1-tuesday" at all -- not a widen, not a correction of
+ an existing translated value. *)
+let passion_tuesday_entry =
+ [ (slug_or_die "ef-passiontide-1-tuesday", pair ~first:"Dan 14:27, 28-42" ~gospel:"John 7:1-13") ]
+
(* Important 3(a), fix round 1 (coordinator review): the fixed Nativity-
Octave days (RG 91 entry 17, 29-31 December, colitur's own
[ef-nativity-octave-day-{5,6,7}]) have a DIRECT formulary in the
Missal, not merely a resolvable-by-walk-back gap -- "Diebus infra
- octavam Nativitatis Domini, II classis": Tit. 3,4-7 / Luc. 2,15-20
+ octavam Nativitatis Domini, II classis": Titus 3:4-7 / Luke 2:15-20
(docs/research/scan1.txt:6281-6329, scan2.txt:6900-6960, both word for
word), and each specific date's own rubric points straight at it
("Die 29 decembris... Missa Puer natus est nobis, ut supra [28]",
@@ -278,7 +349,7 @@ let holy_week_entries =
REJECTED, and recorded so it is not re-attempted: the FIRST guess tried
here gave these three slugs [ef-holy-name-sunday]'s own citation
- instead (Gal. 4,1-7 / Luc. 2,33-40, "Dominica infra octavam Nativitatis
+ instead (Gal 4:1-7 / Luke 2:33-40, "Dominica infra octavam Nativitatis
Domini" -- a DIFFERENT heading, for the Sunday specifically, not the
weekdays). Measured against the real fixture and reverted: lectio's own
citation for these dates is not uniform across years (2005-12-29 reads
@@ -307,7 +378,7 @@ let holy_week_entries =
the same RG 67/69 gap data/ef/expected-divergences-missalemeum.sexp's
own M11 already tracks from a different differential layer. *)
let nativity_octave_entries =
- let cs = pair ~first:"Tit. 3, 4-7" ~gospel:"Luc. 2, 15-20" in
+ let cs = pair ~first:"Titus 3:4-7" ~gospel:"Luke 2:15-20" in
List.map (fun n -> (slug_or_die (Printf.sprintf "ef-nativity-octave-day-%d" n), cs)) [ 5; 6; 7 ]
(* One more colitur-only slug, DERIVED from [ef-holy-name-sunday]'s own
@@ -358,13 +429,29 @@ let sha256 path =
slug it ever actually produces. [assert_reachable] then requires every
key this generator is about to EMIT to be a member of that set (an
emitted key that is not a real Temporal_ef slug is dead data,
- unreachable by any caller -- exactly the shape both Critical findings
- had), dying loudly and naming every offender if not. Separately,
- informational only, it prints every real Temporal_ef slug that has NO
- entry in the final table -- not an error (most such gaps are the
- correctly-unproper ferias step 3 already resolves, task-5-report.md's
- own "297 of 304" measurement), but a standing audit log a human reader
- can check against that same report rather than trusting silence.
+ unreachable by any caller), dying loudly and naming every offender if
+ not.
+
+ CORRECTED, fix round 2 (coordinator review): the paragraph above used
+ to claim this check "is exactly the shape both Critical findings had".
+ Wrong for one of the two, and worth being precise about the limit: this
+ assertion catches an emitted KEY that names no real office (Critical 2,
+ the Lent Ember dead keys) -- it cannot catch, and did not catch, a real,
+ live key carrying the WRONG VALUE (Critical 1, fix round 1's own Holy
+ Week widening: "ef-passiontide-2-monday" etc were all perfectly
+ reachable slugs, just paired with Passion week's citations instead of
+ Holy Week's own). A reachability sweep is a name check, not a content
+ check; nothing in this generator verifies citation VALUES against the
+ Missal except the human cross-referencing docs/research/scan1.txt and
+ scan2.txt line by line, which is why every hand-authored entry in this
+ file states its own two-scan citation.
+
+ Separately, informational only, [assert_reachable] also prints every
+ real Temporal_ef slug that has NO entry in the final table -- not an
+ error (most such gaps are the correctly-unproper ferias step 3 already
+ resolves, task-5-report.md's own "297 of 304" measurement), but a
+ standing audit log a human reader can check against that same report
+ rather than trusting silence.
1583 is deliberately NOT the sweep's start: the full 1583-9999 domain is
the KERNEL's own contract, not this rite-specific bootstrap tool's --
@@ -427,8 +514,8 @@ let () =
let secs = parse_ini src in
let translated = List.concat_map convert secs in
let entries =
- translated @ vigil_entries @ holy_week_entries @ nativity_octave_entries
- @ derived_entries translated
+ translated @ vigil_entries @ holy_week_entries @ passion_tuesday_entry
+ @ nativity_octave_entries @ derived_entries translated
in
assert_reachable entries;
let lect =
@@ -444,7 +531,9 @@ let () =
; generator against a newer lectio and commit the diff instead. Every\n\
; emitted key is asserted, at generation time, to be a slug\n\
; Rite_ef.Temporal_ef actually computes (see this generator's own\n\
- ; [assert_reachable]) -- a dead key cannot ship silently again.\n\
+ ; [assert_reachable]) -- a dead key cannot ship silently again (a\n\
+ ; wrongly-VALUED live key still can; [assert_reachable]'s own comment\n\
+ ; says why this check cannot be widened to catch that).\n\
;\n\
; Source: %s\n\
; SHA-256: %s\n\
@@ -452,14 +541,18 @@ let () =
; Temporal_ef vocabulary via [colitur_keys]; %d hand-authored from a\n\
; second source file [vigil_entries]; %d hand-authored directly from\n\
; the Missal [holy_week_entries]; %d hand-authored directly from the\n\
- ; Missal [nativity_octave_entries]; %d derived from an already-\n\
- ; translated entry above rather than re-typed [derived_entries] --\n\
- ; see this generator's own comments on all five). Regenerate with:\n\
+ ; Missal, one entry [passion_tuesday_entry]; %d hand-authored directly\n\
+ ; from the Missal [nativity_octave_entries]; %d derived from an\n\
+ ; already-translated entry above rather than re-typed\n\
+ ; [derived_entries] -- see this generator's own comments on all six).\n\
+ ; Regenerate with:\n\
; eval $(opam env) && dune exec tools/bootstrap_lectionary.exe -- %s %s\n"
src (sha256 src) (List.length entries) (List.length secs) (List.length vigil_entries)
- (List.length holy_week_entries) (List.length nativity_octave_entries)
+ (List.length holy_week_entries) (List.length passion_tuesday_entry)
+ (List.length nativity_octave_entries)
(List.length entries - List.length translated - List.length vigil_entries
- - List.length holy_week_entries - List.length nativity_octave_entries)
+ - List.length holy_week_entries - List.length passion_tuesday_entry
+ - List.length nativity_octave_entries)
src dst;
Sexplib.Sexp.output_hum oc (Lectionary.sexp_of_t lect);
output_char oc '\n';