From 1915f3bb9d74998a411bd55ae658cb3f58fd3477 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Mon, 17 Aug 2026 14:26:42 +0200 Subject: docs(ef): fix round 2 -- three miscitations and a recorded blind spot Comment and citation corrections found by review, plus one finding that survived an attempt to reconstruct it. No behaviour change; the suite is unchanged at 358 green. The ferial rubric "Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii" was attributed to RG 17(a) in three test comments. It is not RG 17(a). RG 17(a) (LT.txt:843) fixes only WHEN the Holy Name is kept -- "celebrandum dominica quae occurrit a die 2 ad 5 ianuarii; secus die 2 ianuarii". The rubric quoted is a Mass-propers rubric printed under the Sanctissimi Nominis Iesu heading (scan1:6523-6526, corroborated scan2:7216), governing what the ordinary ferias of that window say when they are not the feast at all. Two rules sharing a date window. Fix round 1 had already corrected this on the data side; the generator's own comment was right throughout. Only the test comments were stale. test_differential.ml named bootstrap_lectionary.ml's derived_entries as the source of ef-holy-name's citations. That binding no longer exists -- it was the mechanism that derived them from ef-holy-name-sunday's wrongly-widened ini translation, removed in Task 9 because the derivation was itself the error. They are hand-authored from the scans now, as holy_name_entries. M26's shape 1 described its 21 rows as votive Masses of the BVM "on an otherwise-unoccupied feria, not only a Saturday", splitting them into 4 BVM-Saturday rows and 17 "ordinary weekday ferias". Every one of the 21 is a Saturday, each checked individually against date -d. The error was not merely verbal: it made the gap look broader than a single cause and pointed away from the one rule that explains all 21. The sub-groups differ by season, not weekday, and only in what colitur shows in the votive Mass's place. One gap -- the office is built (RG 91 entry 27), the seasonal selection among the five Masses is not. Recorded, not fixed: step 4 of the reading chain has no oracle witness at all. This began as a note to write up a live-oracle confirmation for Felicitas and Perpetua; the reconstruction contradicted its premise. The sweep ran over 2028, where 6 March resolves as a Lenten feria with the saint admitted only as a commemoration, so her own Mass is never read that year. The finding underneath is firmer: only five saints route through a Common, they are the observed office on five days in all of 2005-2050 (isidore-of-seville 2008/2035/2046, frances-rome and sts-felicitas-perpetua both 2038), two are never observed in 46 years, and none falls in layer 4's window. Layer 3 does not cover it either -- lectio resolves the literal "-"/"-" sentinel there, which is what C18 is gated on, so it confirms only that colitur emits a citation where lectio emits none, never that it is right. Closing it needs the oracle fixture extended to 2035, 2038 or 2046; that is a fixture-scope decision. Register: sections 6.6 and 6.7. CLAUDE.md's layer-blindness list gains the step-4 entry. --- CLAUDE.md | 16 ++++++++++++++++ test/test_differential.ml | 34 +++++++++++++++++++++++++++------- test/test_lectionary.ml | 5 ++++- test/test_lectionary_ef.ml | 6 ++++-- test/test_oracle.ml | 40 +++++++++++++++++++++++++++------------- 5 files changed, 78 insertions(+), 23 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6e8289a..0819c88 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -169,6 +169,22 @@ against missalemeum; layer 5 pins ~30 dates. `band`'s own `Commemoration_only` guard (below) also turns it red, on the same date this whole gap was originally found through — both reverted after confirming. +- **Step 4 of the reading chain (the Common route) has NO oracle witness at + all** (register §6.7, `ef-lectionary` fix round 2). Only five saints route + through `data/ef/commons.sexp`, and across all of 2005–2050 they are the + *observed* office on five days total — `isidore-of-seville` 2008/2035/2046, + `frances-rome` and `sts-felicitas-perpetua` both 2038, while + `gregory-the-great` and `patrick` are **never** observed in 46 years (both + sit in March, impeded by Lent's privileged ferias every year). None falls in + layer 4's 2026–2027 window, so no Common-routed citation has ever been + compared against an external source. Layer 3 does not fill the gap either, + and the distinction is exact: those days are in its range, but lectio + resolves the literal `-`/`-` sentinel there (that is *why* C18 exists and + what it is gated on), so layer 3 confirms only that colitur produces *a* + citation where lectio produces none — never that it is the right one. Step 4 + rests on the scan-verified Common assignments and unit tests alone. Closing + it means extending the oracle fixture to 2035, 2038 or 2046 (2038 covers two + of the five at once) — a fixture-scope decision, deliberately not taken. - **Major Litanies (RG 80/109(f), `ef-major-litanies` task): layer 3 is entirely BLIND to a commemoration-only entity, confirmed not merely argued** — lectio computes no Major Litanies at all, and its own `row` diff --git a/test/test_differential.ml b/test/test_differential.ml index 3ca24ca..31ae046 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -994,8 +994,18 @@ let september_ember_sat_slug = "ef-september-ember-sat" NARROWED, Task 9 (branch ef-lectionary, layer-4 oracle): three of the four weekdays (Wednesday/Thursday/Friday) now have their OWN direct lectionary entry (tools/bootstrap_lectionary.ml's own - [epiphanytide_opening_entries], RG 17(a)'s "diebus ferialibus a 2 ad 5 - ianuarii Missa dicitur ut die 1 ianuarii", both scans) -- they no + [epiphanytide_opening_entries], "Diebus ferialibus a 2 ad 5 ianuarii + Missa dicitur ut die 1 ianuarii, cum Gloria et praefatione de + Nativitate, sine Credo et Communicantes proprio" -- scan1.txt:6523-6526, + corroborated scan2.txt:7216 -- CORRECTED, fix round 2: this cited the + rubric as RG 17(a), which it is not. RG 17(a) (LT.txt:843) says only + WHEN the Holy Name is kept ("celebrandum dominica quae occurrit a die 2 + ad 5 ianuarii; secus die 2 ianuarii"). The text quoted here is a + MASS-PROPERS rubric, printed under the "Sanctissimi Nominis Iesu" + heading, governing what the ORDINARY FERIAS of 2-5 January say when + they are not the feast at all. Two different rules that happen to share + a date window; only the second one is what these three weekdays read) -- + they no longer reach step 3's one-hop walkback THIS entry's own citation describes at all, so keeping them here would misdescribe what actually happens on those three weekdays now. See [C30] below for @@ -1087,8 +1097,15 @@ let layer_c_reason (l : row) (c : row) diffs = List.mem l.date holy_name_fallback_dates_2005_2050 (* Task 8: [First_f; Gospel_f] joined the accepted set. Now that [ef-holy-name] carries its own citations (tools/bootstrap_lectionary.ml's - own [derived_entries], sourced from RG 17(a)'s single Mass heading - covering both shapes), most of these 20 rows already match lectio's + own [holy_name_entries], sourced from the Missal's single Mass + heading covering both of RG 17(a)'s shapes -- CORRECTED, fix round 2: + this named [derived_entries], a binding that no longer exists. That + was the mechanism which DERIVED [ef-holy-name] from + [ef-holy-name-sunday]'s own, then wrongly-widened, ini translation, + and it was removed in Task 9 precisely because the derivation WAS + the error; the citations are hand-authored from the scans now. See + that file's own note above [holy_name_citations]), most of these 20 + rows already match lectio's own citation by coincidence -- lectio's OWN plain-ferial fallback, on years with no Sunday 2-5 January, usually lands on a December Sunday whose slug collapses to the SAME "ef-christmas-sunday-0" key @@ -1116,9 +1133,12 @@ let layer_c_reason (l : row) (c : row) diffs = diffs = [ First_f; Gospel_f ] && String.equal c.slug holy_name_sunday_slug then Some "C29" else if - (* C30 -- Task 9: RG 17(a)'s own "diebus ferialibus a 2 ad 5 ianuarii" - rubric, the five non-Saturday weekdays (Saturday stays C25's own, - narrowed note above explains why). *) + (* C30 -- Task 9: the Missal's own Mass-propers "diebus ferialibus a 2 ad + 5 ianuarii" rubric (CORRECTED, fix round 2: this said RG 17(a)'s, + which it is not -- see the C25 note above, and this entry's own + citation in data/ef/expected-divergences.sexp, which fix round 1 + already corrected on the data side), the five non-Saturday weekdays + (Saturday stays C25's own, narrowed note above explains why). *) diffs = [ First_f; Gospel_f ] && List.mem c.slug christmas_1_weekday_slugs then Some "C30" else if diff --git a/test/test_lectionary.ml b/test/test_lectionary.ml index a6ca334..1f8ed75 100644 --- a/test/test_lectionary.ml +++ b/test/test_lectionary.ml @@ -149,7 +149,10 @@ let test_ef_data_file_loads () = check_entry "ef-holy-name-sunday" "Acts 4:8-12" "Luke 2:21"; check_entry "ef-christmas-sunday-0" "Gal 4:1-7" "Luke 2:33-40"; check_entry "ef-holy-name" "Acts 4:8-12" "Luke 2:21"; - (* Task 9: RG 17(a)'s own "diebus ferialibus" rubric (2-13 January, + (* Task 9: the Missal's own Mass-propers "diebus ferialibus" rubric + (CORRECTED, fix round 2: this said RG 17(a)'s, which it is not -- + RG 17(a) fixes only WHEN the Holy Name is kept; the rubric quoted + governs what the ordinary ferias say when it is not) (2-13 January, three 5-weekday families -- bootstrap_lectionary.ml's own [epiphanytide_opening_entries] comment has the full citations and the RG 78/BVM-Saturday reasoning for why Saturday is excluded from diff --git a/test/test_lectionary_ef.ml b/test/test_lectionary_ef.ml index 39e3cb8..3ed6987 100644 --- a/test/test_lectionary_ef.ml +++ b/test/test_lectionary_ef.ml @@ -159,8 +159,10 @@ let test_step3_advent_feria_resumes_sunday () = REPLACED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): 2028-01-05 ("ef-christmas-1-wednesday") stopped exercising step 3 too, the SAME - fate as the 2025-12-29 case this comment already documents -- RG 17(a)'s - own "diebus ferialibus a 2 ad 5 ianuarii" rubric now gives it a direct + fate as the 2025-12-29 case this comment already documents -- the + Missal's own Mass-propers "diebus ferialibus a 2 ad 5 ianuarii" rubric + (CORRECTED, fix round 2: attributed to RG 17(a) here, which it is not -- + RG 17(a) fixes only WHEN the Holy Name is kept) now gives it a direct entry (tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]), so it resolves at step 2. The three families this task's own fix closed (2-5 January, 7-12 January, Holy diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 1e724b8..2d7060b 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -1230,19 +1230,33 @@ let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ] Mass... needs... a season-keyed selection among five formularies" -- RG 309(a), "iuxta temporum diversitatem"): - SHAPE 1 -- 21 rows: a rotating VOTIVE MASS OF THE BVM ("Missae de - sanctae Mariae in sabbato" I-V and their Time-after-Pentecost - siblings, missalemeum's own "II/III/V Mass of the B. V. M." titles) on - an otherwise-unoccupied feria, not only a Saturday -- 2026-01-03/ - 2026-01-10/2027-01-02/2027-01-09 are RG 78's own BVM SATURDAY Office - specifically (Task 6's own named open item; colitur's own step-3 - fallback, not the votive Mass, is what these four rows actually show - -- 2026-01-03/2027-01-09 are `ef-christmas-1-saturday`, C25's own - unchanged population in the sibling lectio differential; 2026-01-10/ - 2027-01-02 are `ef-christmas-2-saturday`); the other 17 of these 21 - are ordinary weekday ferias in Time after Pentecost showing the SAME - votive-Mass title (2026-02-14/06-20/06-27/07-04/07-11/08-01/10-31/ - 11-07/11-28; 2027-07-17/07-24/09-04/09-11/10-30/11-06/11-13/11-27). + SHAPE 1 -- 21 rows, EVERY ONE A SATURDAY: a rotating VOTIVE MASS OF THE + BVM ("Missae de sancta Maria in sabbato" I-V, missalemeum's own + "II/III/V Mass of the B. V. M." titles) on an otherwise-unoccupied + IV-class Saturday -- RG 78's own Office throughout, and RG 309(a)'s own + "iuxta temporum diversitatem" selection of WHICH of the five Masses it + says. + + CORRECTED, fix round 2: this read "on an otherwise-unoccupied feria, not + only a Saturday", and split the 21 into 4 BVM-Saturday rows plus "the + other 17 ... ordinary weekday ferias in Time after Pentecost". Both + halves of that are wrong, and the error was not merely verbal -- it made + the gap look BROADER than a single cause, and pointed the diagnosis away + from the one rule that actually explains all 21. Every date was checked + individually against `date -d`, not inferred: the 17 + (2026-02-14/06-20/06-27/07-04/07-11/08-01/10-31/11-07/11-28; + 2027-07-17/07-24/09-04/09-11/10-30/11-06/11-13/11-27) are Saturdays + exactly like the four January ones. The real distinction between the two + sub-groups is SEASON, not weekday, and it matters only for what colitur + shows in the votive Mass's place: the four Christmastide rows + (2026-01-03/2027-01-09, `ef-christmas-1-saturday`, C25's own unchanged + population in the sibling lectio differential; 2026-01-10/2027-01-02, + `ef-christmas-2-saturday`) show its own step-3 ferial fallback, the 17 + Time-after-Pentecost rows its own season fallback. ONE gap, not two: + colitur builds the Office itself (RG 91 entry 27, register §6.4) but not + the seasonal selection among the five Masses, which that task + deliberately deferred to the lectionary as a Mass-propers question + rather than an office question. SHAPE 2 -- 9 rows, a SECOND, DIFFERENT and DISTINCT gap: ferias of a week whose own Sunday was DISPLACED that year by a movable, named -- cgit v1.3