From 5d236c75c557a7e9ed4a8a852b8089aca48b594e Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Mon, 17 Aug 2026 13:02:39 +0200 Subject: test(oracle): fix round 1 -- C30 disclosure, RG 17(a) misattribution, M26 shapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three Important findings from coordinator review of 8d1eb25, all fixed. 1. C30's own note claimed its 91-row population "is C25's OWN former population, before this task narrowed it" -- false. Independently re-derived against the real resolver (pre-fix vs post-fix binary) and the lectio fixture: only 44 of the 91 rows were ever in C25 (Wed 6/ Thu 19/Fri 19, matching C25's own fix-round-3 breakdown exactly); the other 47 (all of Monday/Tuesday, plus part of Wednesday/Friday) previously matched lectio outright -- both engines independently landing on the same wrong value -- and are newly allow-listed only because colitur is now right. Rewritten to the same "both engines silently agreed on the wrong answer" pattern C33/C34 already used. 2. "Diebus ferialibus" is not RG 17(a) -- RG 17(a) states only the day-identity privilege; the ferial-Mass rubrics are Mass-propers rubrics, a distinction the register's own §6.3 already drew before this task's first pass blurred it in code/allow-list comments. A further slip: C31/C32 called their own rubric "RG 17(a)'s own next/ third sentence" when it is a different rubric block ~230 lines away, in Holy Family's (not Holy Name's) own feast propers. Fixed the attribution chain throughout tools/bootstrap_lectionary.ml, data/ef/expected-divergences.sexp's C29-C34, and (gitignored, outside this commit) docs/research/rules-register.md -- closed the §6.3 park, added §6.5 recording all four citations with corrected attribution. Quotes and line numbers were already right; only the chain of custody to RG 17(a) was wrong. 3. M26's own 30 rows classify into two nameable shapes, not "three confirmed shapes" with an unexplained 23-row residue that was in fact empty: 21 rows are RG 78's own already-documented BVM votive-Mass gap; 9 rows are a second, distinct gap -- a week whose own Sunday was displaced by a movable named feast (Trinity->Corpus Christi, "Missa Dominicae I post Pentecosten"; Christ the King), where the Missal requires the displaced Sunday's own Mass to keep informing that week's ferias but step 3 walks back to the displacing feast's citation instead -- proven directly by colitur's own citation on the Christ- the-King rows being literally that feast's own Gospel. verdict open unchanged (not fixed here); the shape is now named instead of buried. Minors: section count corrected 1458->1456 (four places); "exactly one candidate, zero ambiguous" corrected to "correctness rests on ordering, not uniqueness" (2 of 1456 sections genuinely yield two candidates, Holy Saturday's own Lectio, both years); the stale "nothing in layers 3-5 compares citations" claim corrected (only layer 5 still doesn't); M18's note corrected (five new entries not six; ~18 of its remaining 352 rows only agree now because of this task's own fixes, not "already" before it); "five" corrected to "six" otherwise-unoccupied Saturdays in bootstrap_lectionary.ml; scan2 quotes softened where OCR-garbled. Also done outside the git-tracked files: the step-4 (Commons) coverage gap is now recorded in data/ef/expected-divergences-missalemeum.sexp's own header, not only the commit body and the (gitignored) report. dune test: 358 tests green. COLITUR_EXHAUSTIVE_SWEEP=1 dune test --force: 359 tests green, 95.7s. --- data/ef/expected-divergences-missalemeum.sexp | 31 ++++- data/ef/expected-divergences.sexp | 14 ++- test/fixtures/missalemeum-ef-2026-2027.provenance | 23 +++- test/test_golden.ml | 14 ++- test/test_oracle.ml | 138 +++++++++++++--------- tools/bootstrap_lectionary.ml | 105 ++++++++++------ tools/extract_missalemeum_oracle.py | 19 ++- 7 files changed, 230 insertions(+), 114 deletions(-) diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp index 30187de..b5374ab 100644 --- a/data/ef/expected-divergences-missalemeum.sexp +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -157,6 +157,25 @@ ; Regenerate expected_rows only after re-adjudicating the change against ; the Missal/register -- never by re-running the comparator and copying its ; output back here (that would launder a regression into a new baseline). +; +; STEP 4 (the Commons/propers, Rite_ef.Lectionary_ef.readings) HAS NO +; WITNESS HERE, Task 9 (branch ef-lectionary, layer-4 oracle): confirmed +; empirically (a scratch resolver sweep over 2026-01-01 through +; 2027-12-31, checking every one of the 15 Commons/proper saints' own +; slugs against LD.observed.slug on every civil day; not re-asserted from +; task-6-report.md's own claim without checking) that NONE of the 15 is +; ever the observed office anywhere in this window -- corroborating that +; report's own §4 independently. No entry in this file names step 4: +; layer 4 never reaches it here, the same "structurally blind" shape the +; Major Litanies task already established for layer 3 (CLAUDE.md's own +; "know what each layer cannot see" section). Chain step 4's own +; regression net rests entirely on Task 6's own unit pins +; (test_lectionary_ef.ml) -- NOT on layer 5 either: test_golden.ml's own +; [describe] carries no citation field at all, so golden pins see no +; readings whatsoever, for any office. If a future oracle refresh or a +; different 2-year window ever DOES observe one of the 15, this +; comment -- not a passing test -- is what a reader would otherwise have +; to infer the absence from. ((id M1) (citation "RG 33, corrected (precedence_ef.ml's own [is_omissible_vigil], primary-source-verified 2026-08-12): \"Vigilia II aut III classis penitus omittitur, si occurrat in dominica quavis...\" -- a II or III class vigil is entirely omitted if it occurs on ANY Sunday") (verdict colitur) @@ -223,7 +242,9 @@ WIDENED, Task 9 (branch ef-lectionary, layer-4 oracle): [First_mismatch]/[Gospel REVISED, ef-bvm-saturday task: 395 of the 730 days in this window used to carry this shape alone (M1/M3/M16 absorb a further 4 where it fires ALONGSIDE their own pre-existing citation -- see each entry's own widened note; 395+4=399 is the axis's own full unresolved population, UNCHANGED from before that task -- only the SPLIT moved, since M2 (closed above) used to separately absorb 22 of the 26 that used to be \"elsewhere\"). Before that revision the split was 373 alone / 26 elsewhere (373+26=399) -- CORRECTED, fix round 1 (coordinator finding 8) -- the full breakdown, precisely: of 730 days, 331 are RESOLVED (colitur's own observed celebration carries a name) -- 330 resolved-and-MATCHING, 1 resolved-and-MISMATCHED (M13, Joseph vs the Seven Sorrows, already its own entry above) -- and 399 are UNRESOLVED (colitur's own name is [None]), split between this entry's own (then 395, now 394) and the 4 absorbed elsewhere. The BLIND SPOT this axis exists to close, stated precisely: a TEMPORAL-origin observed day silently replaced by a DIFFERENT temporal-origin observed day of the SAME RANK AND COLOUR -- exactly the shape that hid Holy Family from every layer before the ef-rg112-rg110 task (rank 2/white on both sides, purely coincidental). This count PIN is what stands guard against that population growing silently in either direction: an implementation change that made MORE days temporal-origin-and-unresolvable, or fewer, changes this number and fails the pin, even though the axis itself cannot say WHICH specific day moved or why -- exactly the guard that caught this task's own -1 shift, which HAD to be traced to a specific date and mechanism (above) rather than merely re-baselined. The overwhelming majority of days whose observed celebration is TEMPORAL-origin (an ordinary Sunday, a feria, a movable named feast including Holy Family itself) never carry an English name on colitur's side -- not a rubric dispute and not a data gap either engine is wrong about, a LIMIT of this comparator, honestly counted rather than silently passed, per the brief's own explicit instruction (\"a day whose observed identity cannot be resolved must be a counted, allow-listed outcome, never a silent skip\"). Gated on the diff SHAPE alone (exactly, and only, observed-identity-unresolved), not a literal date list the way every other entry in this file is -- at this population size a date list would itself be the \"pattern that could silently widen\" this file's own header warns against, for the opposite reason a date RANGE is normally risky: the predicate (colitur's own resolved name is [None]) is the precise, falsifiable evidence, the same shape M2's own title-substring predicate already uses instead of enumerating dates, just keyed on presence-of-a-name rather than a title string. Building an English name onto every temporal-cycle candidate (a data/lectionary-bootstrap task, Plan 4, out of this task's scope -- register §6, the same open item M15's own note already tracks) would resolve this entry to Matched for every one of these days it does not instead expose as a REAL divergence (Holy Family's own two dates in this window, 2026-01-11 and 2027-01-10, are counted here, not separately -- the name comparison genuinely cannot distinguish \"Holy Family\" from any other unnamed Sunday, so proving Holy Family's own correctness rests on the golden pins and the differential's own C15, not this axis). -REVISED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): 352, down by 42 from 394. NOT a change to this entry's own guard (still, and only, [diffs = [ Observed_identity_unresolved ]] exactly) -- this task compared reading citations for the first time, and 42 of the former 394 rows now ALSO carry a real [First_mismatch]/[Gospel_mismatch] alongside the pre-existing observed-identity gap, so they escape this entry's own EXACT-match guard and move to the six new entries below (M23 2, M24 4, M25 4, M26 30, M27 2 -- 2+4+4+30+2=42, exactly accounting for the drop, verified against the comparator's own failure output, not assumed from the arithmetic alone). The remaining 352 are every temporal-origin observed day whose reading citation ALREADY agreed with missalemeum before this task and still does -- unaffected by this task's own fixes, since those fixes only ever touched a citation, never an identity.") +REVISED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): 352, down by 42 from 394. NOT a change to this entry's own guard (still, and only, [diffs = [ Observed_identity_unresolved ]] exactly) -- this task compared reading citations for the first time, and 42 of the former 394 rows now ALSO carry a real [First_mismatch]/[Gospel_mismatch] alongside the pre-existing observed-identity gap, so they escape this entry's own EXACT-match guard and move to the FIVE new entries below (M23 2, M24 4, M25 4, M26 30, M27 2 -- 2+4+4+30+2=42, exactly accounting for the drop, verified against the comparator's own failure output, not assumed from the arithmetic alone -- CORRECTED, fix round 1, coordinator review: this note previously miscounted them as \"six\"). + +CORRECTED, fix round 1 (coordinator review): the remaining 352 were previously described as every day whose citation \"ALREADY agreed with missalemeum before this task and still does\" -- imprecise for 18 of them. Before this task the citation axis did not exist at all, so NO row's citation was ever actually checked; \"already agreed\" wrongly implies the pre-task VALUE was correct on all 352, when for 18 it was not -- it only became correct, and therefore only started agreeing, because of this task's own three fixes (Holy Name Sunday's own two dates, 2026-01-04/2027-01-03; 12 more January-window ferias across the three RG-17(a)/Holy-Family-propers-rubric families that now resolve at step 2 instead of the walkback, one full list: 2026-01-02/05/07/08/09/12, 2027-01-04/05/07/08/11/12; and Corpus Christi/Sacred Heart in both years, 2026-06-04/06-12, 2027-05-27/06-04 -- 2+12+4=18, independently re-derived against the real resolver, not merely arithmetic). The other 334 were genuinely unaffected by this task, matching both before and after (or, more precisely, would have matched on the day this axis existed either way).") (expected_rows 352)) ((id M19) (citation "RG 110's OTHER direction: \"In Officio et Missa S. Petri semper fit commemoratio S. Pauli, ET VICISSIM\" -- the SAME rule M12 used to cite, applied here to Paul's own office commemorating Peter, not Peter's own office commemorating Paul; confirmed a third time by the calendarium's own June table, both photographic scans, word for word: \"In Commemoratione S. Pauli Ap., III classis. / Commemoratio S. Petri Ap.\"") @@ -257,7 +278,13 @@ REVISED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): 352, down by 42 fr ((id M26) (citation "{!Rite_ef.Lectionary_ef.readings}'s own header comment (not an RG citation, a comparator/architecture LIMIT): step 3's own WARRANT is \"lectio's own observed behaviour... not a confirmed Missal citation\" -- register's own standing note; RG 309(a) (\"iuxta temporum diversitatem\", the season-keyed votive-Mass selection this task's own investigation confirmed missalemeum implements and colitur does not, corroborating Task 6's own already-recorded open item)") (verdict open) - (note "Task 9 (branch ef-lectionary, layer-4 oracle): 30 rows, ONE root cause, THREE confirmed shapes, none built here. (1) RG 78's own rotating votive Mass of the BVM (\"Missae de sanctae Mariae in sabbato\" and its Time-after-Pentecost siblings, missalemeum's own \"II/III/V Mass of the B. V. M.\" titles) on an otherwise-unoccupied feria -- Task 6's own already-named open item (\"the BVM Saturday Office still emits its feria's Mass... needs... a season-keyed selection among five formularies\"), confirmed live on four Saturdays here (2026-01-03/01-10, 2027-01-02/01-09 -- `ef-christmas-1-saturday`/`ef-christmas-2-saturday`, this task's own deliberately-unentered slugs, C25's unchanged population in the sibling lectio differential) and on every ordinary Time-after-Pentecost weekday feria in this entry's own remaining population (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). (2) A named weekly formula distinct from the plain Sunday-repeat rule, found by accident while researching Corpus Christi's own Mass (docs/research/scan1.txt, \"Missa dominicae I post Pentecosten\", 1 Ioann. 4:8-21/Luc. 6:36-42, printed immediately before Corpus Christi's own heading) but NOT independently verified as a general \"every week has its own named formula\" rule the way the January window (this task's own [epiphanytide_opening_entries]) was -- 2026-06-02/06-03 and 2027-05-24 show it. (3) Later Time-after-Pentecost weeks (2026-10-26 through 2026-10-30, 2027-11-03/11-05) whose own votive/ferial answer this task's own investigation did not narrow to a single citable rule at all. None is safe to fix piecemeal inside this task's own scope (extending layer 4 + triage) without the same real, dedicated, TDD/mutation-tested unit of work data/ef/expected-divergences.sexp's own C6/C25 and Task 6's own open item already call for -- a season-keyed ferial/votive-Mass-selection mechanism, new behaviour, not new data. Verdict open, the SAME fourth verdict M15/M18 already establish for a genuine comparator/architecture LIMIT, honestly counted rather than silently absorbed or left failing without explanation. A literal date list, not a shape predicate: no single structural signal (unlike C17's own [subject = bvm]) distinguishes this population from a genuinely new, unrelated citation bug on some other Time-after-Pentecost feria. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 30.") + (note "Task 9 (branch ef-lectionary, layer-4 oracle): 30 rows, one root cause, TWO NAMEABLE SHAPES -- CORRECTED, fix round 1 (coordinator review, Important 3): a prior version of this note described three shapes, the third an unexplained \"23-row residue... not narrowed to a single citable rule at all\". That bucket was EMPTY: every one of the 30 dates classifies into one of the two shapes below, and describing it as unknown buried a real, nameable defect (layer 3 is blind to it too -- lectio makes the identical mistake -- so this entry is the only place either engine's own gap here is written down). + +SHAPE 1 -- 21 rows: RG 78's own rotating votive Mass of the BVM (\"Missae de sanctae Mariae in sabbato\" and its Time-after-Pentecost siblings, missalemeum's own \"II/III/V Mass of the B. V. M.\" titles) on an otherwise-unoccupied feria -- Task 6's own already-named open item (\"the BVM Saturday Office still emits its feria's Mass... needs... a season-keyed selection among five formularies\"), confirmed live on four Saturdays here (2026-01-03/01-10, 2027-01-02/01-09 -- `ef-christmas-1-saturday`/`ef-christmas-2-saturday`, this task's own deliberately-unentered slugs, C25's unchanged population in the sibling lectio differential) and on 17 ordinary Time-after-Pentecost weekday ferias (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 2 -- 9 rows, a SECOND, DIFFERENT gap: ferias of a week whose own Sunday was DISPLACED that year by a movable named temporal-cycle feast, where the Missal requires the DISPLACED Sunday's own Mass to continue informing that week's ferias, but step 3 walks back to the DISPLACING feast's citation instead. Two witnessed instances: (a) 2026-06-02/03 and 2027-05-24 (the ferias between Trinity Sunday and Corpus Christi) -- the Missal prints a named formula for exactly this week, \"Missa Dominicae I post Pentecosten\" (1 Ioann. 4,8-21/Luc. 6,36-42, docs/research/scan1.txt:21758-21830, found while researching Corpus Christi's own Mass immediately following it), but colitur's step 3 walks back to Trinity SUNDAY's own generic citation instead, since [ef-corpus-christi] (this task's own fix) now correctly interrupts the week at step 2, one Sunday short of what the week's own ferias actually need; (b) 2026-10-26/27/29/30 and 2027-11-03/05 (the ferias of the week Christ the King, I class movable, \"Dominica ultima octobris\", displaces) -- colitur's own citation on all six is LITERALLY Christ the King's own Gospel (John 18:33-37, \"Art thou a king?\"), confirming step 3 walked back to the DISPLACING feast, not the displaced ordinary Sunday; missalemeum shows a different citation each row. No Missal-propers rubric for Christ the King's own week ferias was found the way Holy Name/Holy Family's own each carry one (checked: no rubric text precedes Christ the King's own Mass heading, scan1.txt:39140-39163) -- this half is named from the OBSERVED citation evidence itself, not from a located propers rubric; no citation SPECIFIC to Christ the King's own week is claimed. + +Neither shape is safe to fix inside this task's own scope (extending layer 4 + triage) without the same real, dedicated, TDD/mutation-tested unit of work data/ef/expected-divergences.sexp's own C6/C25 and Task 6's own open item already call for -- a season-keyed ferial/votive-Mass-selection mechanism, new behaviour, not new data. Verdict open, the SAME fourth verdict M15/M18 already establish for a genuine comparator/architecture LIMIT, honestly counted and NAMED rather than silently absorbed, left failing, or buried in an unexplained residue. A literal date list, not a shape predicate: no single structural signal (unlike C17's own [subject = bvm]) distinguishes this population from a genuinely new, unrelated citation bug on some other Time-after-Pentecost feria. Derived directly from the OCaml comparator's own failure output, not hand-counted first and cross-checked after: 30.") (expected_rows 30)) ((id M27) (citation "tools/extract_missalemeum_oracle.py's own header (the extraction script, not an RG citation): Christmas Day has THREE Masses in the 1962 Missal (Midnight/Dawn/Day), each with its own distinct Epistle+Gospel; this fixture's own entry[0] convention (verified, and documented, for every OTHER field it reads) takes the Midnight Mass, while colitur's own citation (bootstrapped from lectio) reflects the Day Mass -- two DIFFERENT, both genuine, Masses of the identical civil day") diff --git a/data/ef/expected-divergences.sexp b/data/ef/expected-divergences.sexp index 8522da5..836ebed 100644 --- a/data/ef/expected-divergences.sexp +++ b/data/ef/expected-divergences.sexp @@ -72,7 +72,7 @@ (verdict colitur) (note "6-13 January is Christmastide in colitur, matching RG 72-73's explicit boundary at 13 January (corroborated independently by RG 119a's colour rule, §3b). lectio's efSeason switches to time-after-epiphany on 6 January. The season disagreement cascades into colour (green vs white) and, on 7-12 January specifically, into the ferial slug family name (colitur's ef-christmas-2- vs lectio's ef-time-after-epiphany-1- for those days). REFRESHED (ef-rebootstrap fixture refresh, 2026-08-12): expected_rows moved 361 -> 368. NOT a new divergence -- the closed C13's own 7 rows (13 January in the 7 years it falls on a Sunday) fold back in here: lectio's fix wave independently fixed its own equivalent of the RG16(a) defect C13 used to allow-list, so on all 7 of those Sunday years lectio's slug now matches colitur's `commemoration-of-the-baptism-of-the-lord` too (not just rank/colour), leaving season as the ONLY residual difference on those rows -- squarely inside C1's own existing shape (diffs subset of [Season;Colour;Slug] with the Slug-diff escape clause unused). REFRESHED AGAIN (ef-rg112-rg110 task, branch ef-rg112-rg110): expected_rows moved 368 -> 361, back to its PRE-ef-rebootstrap value, but for a THIRD, different reason -- SPLIT OUT to its own new entry, C15, not silently re-absorbed: colitur now BUILDS Holy Family (RG 17(b)) and, on these same 7 dates, correctly observes it in the fixed Baptism's place (RG 91 entry 14, RG 112(a)), so colitur's own slug there changes from `commemoration-of-the-baptism-of-the-lord` (which happened to already match lectio's own slug) to `ef-time-after-epiphany-sunday-1` (Holy Family's own, lectio has no equivalent) -- a genuine SLUG divergence now, no longer inside C1's own [Season]-only shape. See C15's own entry for the full account. PROVENANCE, fix round 1 (coordinator finding 6, restoring the discipline this entry's own prior refresh recorded and this round's rewrite had dropped): 361 read directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations's `Received` array, run against the widened C15 predicate/allow-list together, not before it existed) -- not hand-counted first and cross-checked after, and not 368 minus 7 taken on faith: the arithmetic matches C15's own independently-derived 7, which is corroboration, not the derivation itself. -REFRESHED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): expected_rows moved 361 -> 173. NOT a data change -- this entry's OWN diff-set guard (`subset diffs [Season;Colour_f;Slug_f]`) never accepted a citation diff, and this task gave the `ef-christmas-2-` and `ef-time-after-epiphany-1-` families their OWN direct citations for the first time (RG 17(a)'s own \"diebus ferialibus\" rubric, tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) -- every row in this window that ALSO now carries a real First_f/Gospel_f divergence escapes this entry's own subset guard and moves to the new C31/C32 instead (not silently re-absorbed: C31/C32's own [subset diffs [Season;Slug_f;Colour_f;First_f;Gospel_f]] guard is what actually catches them, checked BEFORE this entry no longer applies, not assumed). What remains here is every 6-13 January row this task's own fix did NOT touch: Epiphany itself, the fixed Baptism commemoration, and any day a competing saint or the BVM Saturday Office already wins outright (unaffected by a lectionary citation either way). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 173.") +REFRESHED AGAIN, Task 9 (branch ef-lectionary, layer-4 oracle): expected_rows moved 361 -> 173. NOT a data change -- this entry's OWN diff-set guard (`subset diffs [Season;Colour_f;Slug_f]`) never accepted a citation diff, and this task gave the `ef-christmas-2-` and `ef-time-after-epiphany-1-` families their OWN direct citations for the first time (the Missal's own Mass-propers \"diebus ferialibus\" rubrics -- NOT RG 17(a) itself, which states only the day-identity privilege; see C30/C31's own citations for the corrected attribution -- tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) -- every row in this window that ALSO now carries a real First_f/Gospel_f divergence escapes this entry's own subset guard and moves to the new C31/C32 instead (not silently re-absorbed: C31/C32's own [subset diffs [Season;Slug_f;Colour_f;First_f;Gospel_f]] guard is what actually catches them, checked BEFORE this entry no longer applies, not assumed). What remains here is every 6-13 January row this task's own fix did NOT touch: Epiphany itself, the fixed Baptism commemoration, and any day a competing saint or the BVM Saturday Office already wins outright (unaffected by a lectionary citation either way). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 173.") (expected_rows 173)) ((id C6) (citation "RG 91 entry 17 (\"days within the Octave of the Nativity\") for the slug/rank divergence; RG 69, scan1.txt:625-631 word for word, for the QUESTIONED citation component (Important 3(b), coordinator review, task 8 fix round 1): \"De dominica infra octavam Nativitatis Domini, quae scilicet a die 26 ad 31 decembris occurrit, semper fit Officium cum commemoratione festi forte occurrentis, iuxta rubricas, nisi dominica incidat in festum I classis: quo in casu, fit de festo cum commemoratione dominicae\" -- the Sunday's OWN Office (not the fixed weekday placeholder) is kept, WITH a commemoration of whatever feast falls that day, whenever a Sunday lands anywhere 26-31 December (unless that feast is itself I class, in which case the feast wins with the Sunday commemorated instead)") @@ -168,7 +168,7 @@ CORRECTED, fix round 2 (coordinator review, Minor): this entry's own reason for CORRECTED, fix round 3 (coordinator review): the TOTAL, 57, is derived directly from the OCaml comparator's own failure output (its own `expected_rows` pin, cross-checked against a real test run) -- that part was accurate. The PER-WEEKDAY split is NOT: the comparator reports per-id totals only, never a per-weekday breakdown, so that finer split came from a separate pass over the raw per-slug failure list, and a prior version of this note wrongly implied it came from the comparator directly. That prior version also rotated the labels: it read \"19 + 19 + 13 + 6, Wednesday/Thursday/Friday/Saturday respectively\" -- the right four numbers, each attached to the wrong weekday. Re-measured directly against the real resolver: Wednesday 6, Thursday 19, Friday 19, Saturday 13 (6 + 19 + 19 + 13 = 57, no residue). -NARROWED, Task 9 (branch ef-lectionary, layer-4 oracle): expected_rows moved 57 -> 13, and the slug list narrowed to `ef-christmas-1-saturday` ALONE. Wednesday/Thursday/Friday (6+19+19=44 of the former 57 rows) each now have their OWN direct lectionary entry (RG 17(a)'s own \"diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii\", tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) and no longer reach step 3's walkback at all -- colitur is now RIGHT there, not merely differently wrong, so those 44 rows are a SEPARATE new id (C30 below, verdict colitur), not a re-adjudication of this one. `ef-christmas-1-saturday` is the ONE weekday deliberately left WITHOUT a direct entry (RG 78's BVM Saturday Office wins that day unconditionally whenever nothing else does, {!Rite_ef.Temporal_ef.bvm_saturday_names} -- giving it the \"repeat 1 January\" citation would be wrong on exactly the days this same rubric is correct for the other four weekdays), so its own step-3 walkback -- and this entry's own root cause and citation, \"Titus 3, 4-7\" -- are genuinely UNCHANGED by this task, confirmed directly: the pinned regression test (test_lectionary_ef.ml's own `test_step3_christmas_feria_resumes_sunday`, now re-pointed at 2026-01-03) still returns exactly \"Gal 4:1-7\"/\"Luke 2:33-40\", the Nativity-Octave Sunday's own value C6 above still questions. 13 matches the ORIGINAL per-weekday breakdown's own Saturday figure exactly (6+19+19+13=57 from fix round 3 above), corroborating rather than merely asserting the narrowed count; re-derived directly from the OCaml comparator's own failure output after narrowing the predicate, not assumed from the old breakdown alone.") +NARROWED, Task 9 (branch ef-lectionary, layer-4 oracle): expected_rows moved 57 -> 13, and the slug list narrowed to `ef-christmas-1-saturday` ALONE. Wednesday/Thursday/Friday (6+19+19=44 of the former 57 rows) each now have their OWN direct lectionary entry (the Most Holy Name of Jesus Mass-propers' own \"diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii\" rubric -- NOT RG 17(a) itself, see C30's own citation for the corrected attribution -- tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) and no longer reach step 3's walkback at all -- colitur is now RIGHT there, not merely differently wrong, so those 44 rows are a SEPARATE new id (C30 below, verdict colitur), not a re-adjudication of this one. `ef-christmas-1-saturday` is the ONE weekday deliberately left WITHOUT a direct entry (RG 78's BVM Saturday Office wins that day unconditionally whenever nothing else does, {!Rite_ef.Temporal_ef.bvm_saturday_names} -- giving it the \"repeat 1 January\" citation would be wrong on exactly the days this same rubric is correct for the other four weekdays), so its own step-3 walkback -- and this entry's own root cause and citation, \"Titus 3, 4-7\" -- are genuinely UNCHANGED by this task, confirmed directly: the pinned regression test (test_lectionary_ef.ml's own `test_step3_christmas_feria_resumes_sunday`, now re-pointed at 2026-01-03) still returns exactly \"Gal 4:1-7\"/\"Luke 2:33-40\", the Nativity-Octave Sunday's own value C6 above still questions. 13 matches the ORIGINAL per-weekday breakdown's own Saturday figure exactly (6+19+19+13=57 from fix round 3 above), corroborating rather than merely asserting the narrowed count; re-derived directly from the OCaml comparator's own failure output after narrowing the predicate, not assumed from the old breakdown alone.") (expected_rows 13)) ((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-12120 (CORRECTED, fix round 3, coordinator review: the scan2 endpoint previously read 12104, which stops after the Epistle -- \"Lectio Danielis Prophetae, Dan. 14,27 et 28-42\" -- and never reaches the Gospel heading/citation at all; \"Sequentia sancti Evangelii secundum Ioannem, Ioann. 7,1-13\" is at scan2.txt:12117-12120, so the range now extends to 12120, mirroring scan1's own convention of ending right at the Gospel's citation line rather than the full pericope text), word for word both scans") @@ -191,17 +191,19 @@ NARROWED, Task 9 (branch ef-lectionary, layer-4 oracle): expected_rows moved 57 (note "Task 9 (branch ef-lectionary, layer-4 oracle): `ef-holy-name-sunday`, the primary RG 17(a) shape (a genuine Sunday 2-5 January), had NO lectionary entry of its own before this task -- Rite_ef.Temporal_ef already computed the right slug/rank/colour (RG 91 entry 14, {!Rite_ef.Precedence_ef.entry_14_movable_band}), but tools/bootstrap_lectionary.ml's own [colitur_keys] used to WIDEN lectio's \"ef-christmas-sunday-0\" ini section onto this slug too, by analogy, on the (WRONG) assumption that Holy Name Sunday shares the Sunday-within-the-Octave's own Mass -- DISPROVED by missalemeum's own independent extraction for the two real Holy Name Sundays in its 2026-2027 window (test/fixtures/missalemeum-ef-2026-2027.txt, 2026-01-04/2027-01-03: \"Acts 4:8-12\"/\"Luke 2:21\", title \"Holy Name of Jesus\"), then confirmed against the Missal itself, twice, both scans (above) -- see [colitur_keys]'s own CORRECTED note in bootstrap_lectionary.ml for the full account of the analogy error this replaces. Season and Slug_f already agree on every occurrence (Layer A's own alias for \"ef-christmas-sunday-0\"/\"ef-holy-name-sunday\" -- the SAME underlying fact the generator's old, wrong widen also used, only one of the two uses was ever mistaken), so this entry's own guard is an EXACT match, `diffs = [ First_f; Gospel_f ]`, not a subset. 26 of the 46 years in the fixture's own 2005-2050 span DO have a Sunday 2-5 January -- the complement of C16's own 20 fallback years (26 + 20 = 46, no residue) -- derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 26.") (expected_rows 26)) ((id C30) - (citation "RG 17(a)'s own rubric, immediately following the Holy-Name-Sunday heading, both scans, word for word: \"Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii\" (docs/research/scan1.txt:6522-6526) / \"Diebus ferialibus a 2 ad 6 ianuarii Missa dicitur ut die 1 ianuarii\" (scan2.txt, the \"6\" a one-digit OCR variant of scan1's \"5\" -- immaterial, 6 January is always Epiphany, a fixed I-class feast outranking any ferial rubric outright) -- ON FERIAL DAYS from 2 to 5 January, THE SAME MASS AS 1 JANUARY (the Circumcision, Titus 2:11-15/Luke 2:21) IS SAID") + (citation "NOT RG 17(a) itself -- CORRECTED, fix round 1 (coordinator review): RG 17(a) (scan1.txt:396-402) states only the day-identity privilege (\"festum Ss.mi Nominis Iesu, celebrandum dominica quae occurrit a die 2 ad 5 ianuarii, secus die 2 ianuarii\"), nothing about ferial Masses -- this is the Missal's own MASS-PROPERS rubric for the Most Holy Name of Jesus (docs/research/rules-register.md's own account, \"the Mass propers' own rubric for this feast\", already correct there and now matched here), printed immediately BEFORE the Sunday-shape Mass heading, not after it, both scans, word for word: \"Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 ianuarii\" (docs/research/scan1.txt:6522-6526) / \"Diebus ferialibua a 2 ad fi ianuarii Missa dicitur ut die 1 ianuarii\" (scan2.txt:7213-7217 -- OCR-garbled there, \"ferialibua\"/\"fi\" for \"ferialibus\"/\"5\"; scan1 is clean and missalemeum's own extraction corroborates the citation this rubric produces, so the reading is not in doubt) -- ON FERIAL DAYS from 2 to 5 January, THE SAME MASS AS 1 JANUARY (the Circumcision, Titus 2:11-15/Luke 2:21) IS SAID") (verdict colitur) - (note "Task 9 (branch ef-lectionary, layer-4 oracle): `ef-christmas-1-{monday,tuesday,wednesday,thursday,friday}` (2-5 January, EXCLUDING Saturday) had NO lectionary entry of their own before this task, falling through to step 3's preceding-Sunday walkback (C25's OWN former population, before this task narrowed it -- see C25's own note for the full split). Given a direct entry now (tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]), Season/Slug_f already agree with lectio on every occurrence (this window is entirely BEFORE C1's own 6-13 January boundary, and lectio's own naming for 2-5 January is already the SAME \"ef-christmas-0\"/\"ef-christmas-sunday-0\" family Layer A already aliases), so this entry's own guard is an EXACT match, `diffs = [ First_f; Gospel_f ]`. `ef-christmas-1-saturday` is DELIBERATELY excluded, both from the direct entry and from this predicate's own slug list -- RG 78's BVM Saturday Office wins that day unconditionally whenever nothing else does (Rite_ef.Temporal_ef's own [bvm_saturday_names], already built, ef-bvm-saturday task), confirmed directly against missalemeum's own title on this window's own two such Saturdays (\"II Mass of the B. V. M. -- Vultum Tuum\", never \"Feria\") -- giving it this entry's own citation would be wrong exactly there; it remains C25's own narrower population, unaffected by this task (see C25's own note). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 91.") + (note "Task 9 (branch ef-lectionary, layer-4 oracle): `ef-christmas-1-{monday,tuesday,wednesday,thursday,friday}` (2-5 January, EXCLUDING Saturday) had NO lectionary entry of their own before this task, falling through to step 3's preceding-Sunday walkback. Given a direct entry now (tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]), Season/Slug_f already agree with lectio on every occurrence (this window is entirely BEFORE C1's own 6-13 January boundary, and lectio's own naming for 2-5 January is already the SAME \"ef-christmas-0\"/\"ef-christmas-sunday-0\" family Layer A already aliases), so this entry's own guard is an EXACT match, `diffs = [ First_f; Gospel_f ]`. `ef-christmas-1-saturday` is DELIBERATELY excluded, both from the direct entry and from this predicate's own slug list -- RG 78's BVM Saturday Office wins that day unconditionally whenever nothing else does (Rite_ef.Temporal_ef's own [bvm_saturday_names], already built, ef-bvm-saturday task), confirmed directly against missalemeum's own title on this window's own two such Saturdays (\"II Mass of the B. V. M. -- Vultum Tuum\", never \"Feria\") -- giving it this entry's own citation would be wrong exactly there; it remains C25's own narrower population, unaffected by this task (see C25's own note). + +CORRECTED, fix round 1 (coordinator review, Important 1): this note previously described its own 91-row population as \"C25's OWN former population, before this task narrowed it\" -- FALSE, the single load-bearing sentence an auditor would check. C25's former (pre-this-task) population contributed only 44 of these 91 rows (Wednesday 6, Thursday 19, Friday 19 -- C25's own fix-round-3 breakdown, unchanged); the remaining 47 (Monday 20, Tuesday 14, Wednesday 7, Friday 6) were NEVER in C25 at all -- C25's own fix-round-2 note already states Monday/Tuesday were excluded because they resolved to lectio's OWN value and passed outright. Those 47 rows PREVIOUSLY MATCHED lectio (both engines independently landing on the identical, now-known-wrong \"Gal 4:1-7\"/\"Luke 2:33-40\" value -- colitur's via the old mis-widened `ef-christmas-sunday-0` borrow, lectio's via its own equivalent fallback) and are NEWLY allow-listed here because colitur is now right and lectio still is not -- the SAME \"both engines independently fell back... and silently AGREED on the wrong answer... newly VISIBLE only because colitur is now correct\" shape this file's own C33/C34 already describe correctly. Re-derived directly against the real resolver (colitur's own PRE-fix binary vs POST-fix, both checked against the lectio fixture for every one of the 91 dates, not asserted): inherited 44 (Wed 6/Thu 19/Fri 19, matching C25's own totals exactly, corroboration not derivation), newly visible 47 (Mon 20/Tue 14/Wed 7/Fri 6), 44+47=91, no residue. Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 91.") (expected_rows 91)) ((id C31) - (citation "RG 17(a)'s own rubric's own next sentence, both scans, word for word: \"Diebus ferialibus a 7 ad 12 ianuarii ante dominicam I post Epiphaniam occurrentibus, dicitur Missa de festo Epiphaniae\" (docs/research/scan1.txt:6753-6757) -- ON FERIAL DAYS from 7 to 12 January occurring BEFORE the first Sunday after Epiphany (Holy Family), THE MASS OF THE FEAST OF EPIPHANY (Isa 60:1-6/Matt 2:1-12) IS SAID") + (citation "NOT RG 17(a) -- CORRECTED, fix round 1 (coordinator review): this is a DIFFERENT Mass-propers rubric block, ~230 scan1 lines after Holy Name's own (C30 above), sitting within HOLY FAMILY'S OWN feast propers (RG 17(b)'s feast, page header \"Sanctae Familiae Iesu, Mariae, Ioseph\", scan1.txt:6751/scan2.txt:7412) -- printed immediately BEFORE the \"DOMINICA PRIMA post Epiphaniam / SANCTAE FAMILIAE\" Mass heading, the same structural position C30's own rubric occupies relative to Holy Name's heading, both scans: \"Diebus ferialibus a 7 ad 12 ianuarii ante dominicam I post Epiphaniam occurrentibus, dicitur Missa de festo Epiphaniae\" (docs/research/scan1.txt:6753-6757; scan2.txt:7413-7415 corroborates, OCR-garbled -- \"occurentibus\"/\"Epipbaniee\" -- but the reading is not in doubt: scan1 is clean and missalemeum's own extraction corroborates the citation this rubric produces) -- ON FERIAL DAYS from 7 to 12 January occurring BEFORE the first Sunday after Epiphany (Holy Family), THE MASS OF THE FEAST OF EPIPHANY (Isa 60:1-6/Matt 2:1-12) IS SAID") (verdict colitur) (note "Task 9 (branch ef-lectionary, layer-4 oracle): `ef-christmas-2-{monday,tuesday,wednesday,thursday,friday}` (7 January through the day before Holy Family Sunday, EXCLUDING Saturday -- the same RG 78 exclusion C30 above explains, confirmed again on this window's own remaining such Saturdays) had NO lectionary entry of their own before this task, falling through to step 3's preceding-Sunday walkback. This slug family's own civil dates ALREADY carried a Season/Slug_f/Colour_f divergence against lectio BEFORE this task (lectio's own season boundary starts Time-after-Epiphany at Epiphany itself, RG 72-73's own later boundary colitur keeps; lectio's own week numbering has no Holy Family to wait for, so its own slug for these dates is already \"ef-time-after-epiphany-1-\", not \"ef-christmas-2-...\"), previously absorbed by C1's own [jan_6_13_slug] allow-list (which already names this family, unchanged) -- this task's own fix (tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) adds a First_f/Gospel_f divergence on top of that EXISTING one, so this entry's own guard is a SUBSET, `subset diffs [Season;Slug_f;Colour_f;First_f;Gospel_f]` with at least one of First_f/Gospel_f present (a feria's Epistle and Gospel are independent lookups and can each happen to already coincide). `ef-christmas-2-saturday`, though deliberately given no DIRECT entry (the same RG 78 reasoning as C30), is included in THIS entry's own slug list for a different, genuinely observed reason: its own step-3 walkback CAN land on `ef-holy-name-sunday` in years where that Sunday immediately precedes it, inheriting that slug's newly-corrected citation (C29 above) as a side effect, with no direct entry of its own involved at all -- confirmed directly against the real resolver, not theorised (`ef-christmas-1-saturday`'s own walkback structurally cannot reach that far forward, since its own window, 2-5 January, is entirely before Holy Name Sunday can exist; C25's own unchanged population is the proof this genuinely does not happen there). Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 89.") (expected_rows 89)) ((id C32) - (citation "RG 17(a)'s own rubric's own third sentence, a named formula, both scans: \"post eandem dominicam vero Missa de eadem dominica In excelso throno, ut infra... Haec Missa dicenda est diebus ferialibus huius hebdomadae\" (docs/research/scan1.txt:6758-6851) -- \"MISSA DOMINICAE PRIMAE post Epiphaniam\", Epistle \"Lectio Epistolae beati Pauli Apostoli ad Romanos. Rom. 12, 1-5\" (scan1.txt:6875-6877), Gospel the SAME pericope as Holy Family's own Sunday Mass, Luke 2:42-52 (scan1.txt:6885-6905) -- said on the FERIAL DAYS of Holy Family Sunday's OWN week") + (citation "NOT RG 17(a) -- CORRECTED, fix round 1 (coordinator review): the SAME Holy Family propers block C31 above cites, its own next sentence, a named formula, both scans: \"post eandem dominicam vero Missa de eadem dominica In excelso throno, ut infra... Haec Missa dicenda est diebus ferialibus huius hebdomadae\" (docs/research/scan1.txt:6758-6851; scan2.txt:7415-7434 corroborates \"In excelso throno... ut infra\", OCR-garbled elsewhere in the same passage, reading not in doubt) -- \"MISSA DOMINICAE PRIMAE post Epiphaniam\", Epistle \"Lectio Epistolae beati Pauli Apostoli ad Romanos. Rom. 12, 1-5\" (scan1.txt:6875-6877), Gospel the SAME pericope as Holy Family's own Sunday Mass, Luke 2:42-52 (scan1.txt:6885-6905) -- said on the FERIAL DAYS of Holy Family Sunday's OWN week") (verdict colitur) (note "Task 9 (branch ef-lectionary, layer-4 oracle): `ef-time-after-epiphany-1-{monday,tuesday,wednesday,thursday,friday}` (Holy Family Sunday's own week, EXCLUDING Saturday -- the same RG 78 reasoning as C30/C31) had NO lectionary entry of their own before this task, falling through to step 3's preceding-Sunday walkback (which happened to land on Holy Family Sunday's OWN citation, Col 3:12-17/Luke 2:42-52 -- a DIFFERENT Epistle from this entry's own Rom 12:1-5, the same Mass propers' own distinction between the Sunday and its week's ferias, both scans). This slug family's own civil dates ALREADY carried a bare Season/Colour_f divergence against lectio BEFORE this task (SAME slug on both sides here, unlike C31 -- lectio's own season boundary alone, RG 72-73 vs Epiphany), previously absorbed by C1's own generic 6-13 January window (no [Slug_f] involved, so C1's own [jan_6_13_slug] gate was never even reached) -- this task's own fix (tools/bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) adds a First_f/Gospel_f divergence on top, so this entry's own guard is a SUBSET, `subset diffs [Season;Colour_f;First_f;Gospel_f]` with at least one of First_f/Gospel_f present, the same \"not necessarily both\" reasoning C31 explains. Checked AFTER C19 deliberately in test_differential.ml's own [layer_c_reason]: C19's own 7 \"week shift\" years (2008/2013/2019/2030/2036/2041/2047) already explain this SAME slug family's own citation divergence there, for a DIFFERENT root cause (the week-numbering offset, not this task's own fix) -- this entry must not re-claim those rows under a citation-content reason C19 already owns, so its own population is exactly the OTHER (non-shift-year) civil dates; C19's own count is independently confirmed UNCHANGED at 45 by this same test run. `ef-time-after-epiphany-1-saturday`, though deliberately given no direct entry, is included in this entry's own slug list for the SAME step-3-ripple reason C31's own note explains for `ef-christmas-2-saturday` -- confirmed directly against the real resolver, not theorised. Derived directly from the OCaml comparator's own failure output (test_layer_c_counts_match_citations), not hand-counted first and cross-checked after: 99.") (expected_rows 99)) diff --git a/test/fixtures/missalemeum-ef-2026-2027.provenance b/test/fixtures/missalemeum-ef-2026-2027.provenance index d760c9f..33b5566 100644 --- a/test/fixtures/missalemeum-ef-2026-2027.provenance +++ b/test/fixtures/missalemeum-ef-2026-2027.provenance @@ -49,11 +49,24 @@ things verified during extraction, not merely assumed: no field collides with the "|"/";" delimiters, all 4 multi-Mass days (info is an array on 2026-11-02, 2026-12-25, 2027-11-02, 2027-12-25) carry an IDENTICAL info block (rank/colors/tempora/commemorations/displaced) across every Mass of -the day, so taking entry[0] throughout (this fixture's own convention) -loses nothing the comparator or a human auditor needs, and the citation -extraction itself (all 1 458 Lectio/Evangelium sections across the 728 -days that carry one) yields exactly one unambiguous citation-shaped -candidate per section -- checked exhaustively, not sampled. +the day, so taking entry[0] throughout for THOSE fields (this fixture's +own convention) loses nothing the comparator or a human auditor needs +there -- CORRECTED, fix round 1 (coordinator review): this is NOT true +for the citation fields Task 9 added. Christmas (25 December) has three +genuinely different Masses (Midnight/Dawn/Day) with three different +Epistle+Gospel pairs; entry[0] is the Midnight Mass, colitur's own +citation (bootstrapped from lectio) reflects the Day Mass -- a real, +documented divergence (test_oracle.ml's own M27), not one this +convention avoids. The citation extraction itself (all 1 456 Lectio/ +Evangelium sections, 728 days x 2) does NOT yield exactly one candidate +per section either -- CORRECTED, fix round 1: 2 of the 1 456 (Holy +Saturday's own "Lectio", both years) yield two verse-shaped spans, +['Col 3:1-4', 'Ps 117, 1'] (the second is the Tractus verse following +the real citation in the same paragraph). Both rows are still extracted +correctly because [extract_citation] returns candidates[0] and the real +citation happens to come first -- correctness rests on ORDERING, not +uniqueness. See tools/extract_missalemeum_oracle.py's own header for +the full account of both corrections. Regenerate with the same commands if the missalemeum snapshot is refreshed and the fixture needs updating; do not hand-edit this file or the fixture. diff --git a/test/test_golden.ml b/test/test_golden.ml index 2f8930f..8d33e29 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -94,11 +94,15 @@ let real_ef_lectionary = (* The Commons (data/ef/commons.sexp) travel the same caller-supplied seam as the lectionary above, and [~commons] is required rather than defaulted - so that no caller can silently run with none -- nothing in layers 3-5 - compares reading citations, so a rite quietly missing its Commons would - be invisible. Loaded here even where this file asserts nothing about - readings, so that the rite under test is the same one bin/main.ml - assembles. *) + so that no caller can silently run with none. CORRECTED, Task 9 fix + round 1 (coordinator review): this used to claim "nothing in layers 3-5 + compares reading citations" -- stale since Task 8 (layer 3) and Task 9 + (layer 4). THIS layer (5, golden pins) is the one that still does not: + this file's own [describe] carries no citation field at all, so a rite + quietly missing its Commons would still be invisible here specifically, + even though layers 3/4 would now catch it. Loaded here even where this + file asserts nothing about readings, so that the rite under test is the + same one bin/main.ml assembles. *) let real_ef_commons = match Rite_ef.Lectionary_ef.Commons.load commons_path with | Error e -> failwith (Printf.sprintf "%s: failed to load: %s" commons_path e) diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 41d8a2e..1ad4b1f 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -234,9 +234,13 @@ let real_lectionary () = (* The Commons (data/ef/commons.sexp) travel the same caller-supplied seam as the lectionary above, and [~commons] is required rather than defaulted - so that no caller can silently run with none -- nothing in layers 3-5 - compares reading citations, so a rite quietly missing its Commons would - be invisible. Loaded here even where this file asserts nothing about + so that no caller can silently run with none. CORRECTED, fix round 1 + (coordinator review): this used to claim "nothing in layers 3-5 compares + reading citations" -- stale since Task 8 (layer 3) and this task itself + (layer 4, this file). Layer 5 (test_golden.ml's own [describe]) still + has no citation field at all, so it alone would still miss a rite + quietly missing its Commons; layers 3/4 compare citations directly and + would not. Loaded here even where this file asserts nothing about readings, so that the rite under test is the same one bin/main.ml assembles. *) let real_commons () = @@ -1161,57 +1165,85 @@ let m24_dates = [ "2026-04-01"; "2026-04-02"; "2027-03-24"; "2027-03-25" ] predicate already applies to a citation-vocabulary gap. *) let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ] -(* M26 -- Task 9: the large remaining population, one single root cause. - {!Rite_ef.Lectionary_ef.readings}'s own header comment already names - this LIMIT, not a rubric dispute this task settled: step 3 ("a feria - with no proper says the preceding SUNDAY's Mass") is colitur's only - fallback mechanism, and its own WARRANT is "lectio's own observed - behaviour... not a confirmed Missal citation" -- register's own - standing note. missalemeum's own ferial-Mass selection is more - granular than that single rule in (at least) three distinct ways this - task's own investigation found and confirmed against the primary - source, but did NOT build (a genuine, understood, ALREADY-DOCUMENTED - architecture gap, the SAME shape data/ef/expected-divergences.sexp's - own C6/C25 entries already carry for the sibling lectio differential, - and Task 6's own residual concern 4/5, "the BVM Saturday Office still - emits its feria's Mass... needs... a season-keyed selection among five - formularies" -- RG 309(a), "iuxta temporum diversitatem"): - (1) 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 rest of this entry's own population +(* M26 -- Task 9: the remaining population, one root cause, + TWO NAMEABLE SHAPES -- CORRECTED, fix round 1 (coordinator review, + Important 3): a prior version of this entry described three shapes, + the third an unexplained "23-row residue... not narrowed to a single + citable rule at all". That bucket was EMPTY -- every one of the 30 + dates classifies cleanly into one of the two shapes below; the + "residue" framing buried a real, nameable defect instead of recording + it. {!Rite_ef.Lectionary_ef.readings}'s own header comment already + names the underlying LIMIT, not a rubric dispute this task settled: + step 3 ("a feria with no proper says the preceding SUNDAY's Mass") is + colitur's only fallback mechanism, and its own WARRANT is "lectio's + own observed behaviour... not a confirmed Missal citation" -- + register's own standing note. missalemeum's own ferial-Mass selection + is more granular than that single rule in two distinct, CONFIRMED ways + (the same "needs a season-keyed selection mechanism, new behaviour not + new data" shape data/ef/expected-divergences.sexp's own C6/C25 entries + already carry for the sibling lectio differential, and Task 6's own + residual concern 4/5, "the BVM Saturday Office still emits its feria's + 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; - (2) a NAMED weekly formula distinct from the plain Sunday-repeat rule - for at least one week this task's own primary-source reading found by - accident while fixing a DIFFERENT gap (Holy Family's own week, - "Missa Dominicae Primae post Epiphaniam" -- built, tools/ - bootstrap_lectionary.ml's own [epiphanytide_opening_entries]) -- - 2026-06-02/03 and 2027-05-24 are the SAME shape for a different week - (the ferias between Trinity Sunday and Corpus Christi, "Missa - Dominicae I post Pentecosten", 1 John 4:8-21/Luke 6:36-42, visible in - the raw scan while researching Corpus Christi's own Mass -- see - docs/research/scan1.txt around line 21800 -- but NOT independently - verified as a general "every week has its own named formula" rule the - way the January window was, and NOT built here); - (3) later Time-after-Pentecost weeks whose own votive/ferial answer - this task's investigation did not narrow to a single citable rule at - all (2026-10-26 through 2026-11-28, 2027-11-03 through 2027-11-27). - ALL THREE are variations on the identical root limitation, not three - separate bugs, and none is safe to fix piecemeal inside this task's own - scope (extending layer 4 + triage) without the same real, dedicated, - TDD/mutation-tested unit of work C6/C25 and Task 6's own open item - already call for -- a season-keyed ferial/votive-Mass-selection - mechanism, new behaviour, not new data. Verdict open, the SAME fourth - verdict M15/M18 already establish for a genuine comparator/architecture - LIMIT, honestly counted rather than silently absorbed or left failing - without explanation. A literal date list, not a shape predicate (no + 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 2 -- 9 rows, a SECOND, DIFFERENT and DISTINCT gap: ferias of a + week whose own Sunday was DISPLACED that year by a movable, named + temporal-cycle feast, where the Missal requires the DISPLACED + Sunday's own Mass to continue informing that week's ferias, but step 3 + walks back to the DISPLACING feast's citation instead (the SAME + Sunday's own OFFICE is displaced; its own reading is not). Two + witnessed instances, not a residue: (a) 2026-06-02/03 and 2027-05-24, + the ferias between Trinity Sunday and Corpus Christi -- the Missal + prints a named formula for exactly this week, "Missa Dominicae I post + Pentecosten" (1 Ioann. 4,8-21 / Luc. 6,36-42, docs/research/ + scan1.txt:21758-21830, found while researching Corpus Christi's own + Mass immediately following it) -- but colitur's step 3 walks back to + Trinity SUNDAY's own citation (Rom 11:33-36, the generic Time-after- + Pentecost fallback), not this named formula, since [ef-corpus-christi] + now correctly interrupts Trinity's own week at step 2 (this task's own + fix) and step 3's walkback from the Tuesday/Wednesday after it lands + one Sunday further back than the week actually calls for; (b) + 2026-10-26/27/29/30 and 2027-11-03/05, the ferias of the week Christ + the King (I class, movable, "Dominica ultima octobris") displaces -- + colitur's own citation on all six is LITERALLY Christ the King's own + Gospel (John 18:33-37, "Art thou a king?"), confirming step 3 walked + back to the DISPLACING feast, not the displaced ordinary Sunday; + missalemeum shows a different citation each row (the displaced + Sunday's own, varying by year). No Missal-propers rubric for Christ + the King's own week ferias was found the way Holy Name/Holy Family's + own each carry one (checked: no rubric text precedes Christ the + King's own Mass heading, scan1.txt:39140-39163, unlike the two + feasts C30/C31/C32 above document) -- this half is named from the + OBSERVED citation evidence itself (colitur's own value IS the + displacing feast's, missalemeum's is not), not from a located + propers rubric; the general mechanism (a week's own ferias follow its + OWN Sunday's temporal identity even when that Sunday is impeded that + year) is the same shape RG 69 already establishes for the Nativity + Octave (C6's own citation) and RG 96's own general transfer framework + assumes throughout, but no citation SPECIFIC to Christ the King's own + week was found or is claimed here. + + Neither shape is safe to fix inside this task's own scope (extending + layer 4 + triage) without the same real, dedicated, TDD/mutation-tested + unit of work C6/C25 and Task 6's own open item already call for. + Verdict open, the SAME fourth verdict M15/M18 already establish for a + genuine comparator/architecture LIMIT, honestly counted and NAMED + rather than silently absorbed, left failing, or buried in an + unexplained residue. A literal date list, not a shape predicate (no single structural signal -- unlike C17's own [subject = bvm] -- exists to distinguish this population from a genuinely new, unrelated citation bug on some other Time-after-Pentecost feria): the SAME diff --git a/tools/bootstrap_lectionary.ml b/tools/bootstrap_lectionary.ml index 357cb81..7fb186d 100644 --- a/tools/bootstrap_lectionary.ml +++ b/tools/bootstrap_lectionary.ml @@ -479,25 +479,47 @@ let holy_name_entries = generator relies on here; not re-derived, read directly from the code that computes them). + NOT RG 17(a) -- CORRECTED, fix round 1 (coordinator review): RG 17(a) + itself (scan1.txt:396-402, "festum Ssmi Nominis Iesu, celebrandum + dominica quae occurrit a die 2 ad 5 ianuarii... secus die 2 ianuarii") + states only the day-identity PRIVILEGE (which day the feast falls on), + nothing about ferial Masses -- exactly the distinction docs/research/ + rules-register.md's own account already draws ("a THIRD, more specific + primary text... the Mass propers' own rubric for this feast", + deliberately NOT folded into RG 17(a) there). All three rubrics below + are Mass-PROPERS rubrics, printed as part of a feast's own Mass + heading, not General Rubrics chapter text -- and the second and third + are a DIFFERENT feast's propers from the first, not a continuation of + it (see each bullet's own attribution). + - [ef-christmas-1-{monday,tuesday,wednesday,thursday,friday}] (2-5 - January, EXCLUDING Saturday -- see below): RG 17(a)'s OWN rubric, - immediately following the Holy-Name-Sunday heading, both scans, word - for word: "Diebus ferialibus a 2 ad 5 ianuarii Missa dicitur ut die 1 - ianuarii" (scan1.txt:6522-6526) / "Diebus ferialibus a 2 ad 6 - ianuarii Missa dicitur ut die 1 ianuarii" (scan2.txt, the "6" a - one-digit OCR variant of scan1's "5" -- immaterial either way, since - 6 January is always Epiphany, a fixed I-class feast outranking any - ferial rubric outright) -- ON FERIAL DAYS from 2 to 5 January, THE - SAME MASS AS 1 JANUARY (the Circumcision) IS SAID. + January, EXCLUDING Saturday -- see below): the Missal's own + Mass-propers rubric for the Most Holy Name of Jesus, printed + immediately BEFORE the Sunday-shape Mass heading (not after it), + both scans, word for word: "Diebus ferialibus a 2 ad 5 ianuarii + Missa dicitur ut die 1 ianuarii" (scan1.txt:6522-6526) / "Diebus + ferialibua a 2 ad fi ianuarii Missa dicitur ut die 1 ianuarii" + (scan2.txt:7213-7217 -- OCR-garbled there, "ferialibua"/"fi" for + "ferialibus"/"5"; scan1 is clean and missalemeum's own extraction + corroborates the citation this rubric produces, so the reading is + not in doubt) -- ON FERIAL DAYS from 2 to 5 January, THE SAME MASS + AS 1 JANUARY (the Circumcision) IS SAID. - [ef-christmas-2-{monday,tuesday,wednesday,thursday,friday}] (7 January through the day before Holy Family Sunday's own civil date, - EXCLUDING Saturday -- see below): the SAME rubric's own next - sentence, both scans, word for word: "Diebus ferialibus a 7 ad 12 - ianuarii ANTE dominicam I post Epiphaniam occurrentibus, dicitur - Missa de festo Epiphaniae" (scan1.txt:6753-6757, scan2.txt - corroborates) -- ON FERIAL DAYS from 7 to 12 January occurring BEFORE - the first Sunday after Epiphany (Holy Family), THE MASS OF THE FEAST - OF EPIPHANY IS SAID. + EXCLUDING Saturday -- see below): a DIFFERENT Mass-propers rubric + block, ~230 scan1 lines after the one immediately above, sitting + within HOLY FAMILY'S OWN feast propers (RG 17(b)'s feast, page + header "Sanctae Familiae Iesu, Mariae, Ioseph", scan1.txt:6751/ + scan2.txt:7412), printed immediately BEFORE the "DOMINICA PRIMA post + Epiphaniam / SANCTAE FAMILIAE" Mass heading -- the same structural + position the rubric above occupies relative to Holy Name's own + heading, but a different feast's propers, not a continuation of the + same rubric: "Diebus ferialibus a 7 ad 12 ianuarii ANTE dominicam I + post Epiphaniam occurrentibus, dicitur Missa de festo Epiphaniae" + (scan1.txt:6753-6757; scan2.txt:7413-7415 corroborates, OCR-garbled + -- "occurentibus"/"Epipbaniee" -- reading not in doubt) -- ON FERIAL + DAYS from 7 to 12 January occurring BEFORE the first Sunday after + Epiphany (Holy Family), THE MASS OF THE FEAST OF EPIPHANY IS SAID. - [ef-time-after-epiphany-1-{monday,tuesday,wednesday,thursday,friday}] (Holy Family Sunday's own week, EXCLUDING Saturday -- see below, straddling the Christmastide/Time-after-Epiphany season boundary on @@ -506,20 +528,22 @@ let holy_name_entries = Time-after-Epiphany ferial fallback... will give the rest of that same Sunday-to-Saturday week", so one hand-authored value covers the whole week regardless of which code path computed the slug for a - given civil day): the rubric's own THIRD sentence, same citation, a - named formula rather than a second "repeat the Sunday" instruction: - "post eandem dominicam vero Missa de eadem dominica In excelso - throno, ut infra... Haec Missa dicenda est diebus ferialibus huius - hebdomadae" (scan1.txt:6758-6851, the formula's own heading "MISSA - DOMINICAE PRIMAE post Epiphaniam" immediately below) -- Epistle - "Lectio Epistolae beati Pauli Apostoli ad Romanos. Rom. 12, 1-5" - (scan1.txt:6875-6877), Gospel the SAME pericope as Holy Family's own - Sunday Mass, Luke 2:42-52 (printed out in full immediately below the - Epistle, scan1.txt:6885-6905) -- a DIFFERENT Epistle from Holy Family - Sunday's own (Col 3:12-17), but the SAME Gospel, exactly as - missalemeum's own fixture rows show (2026-01-12/2027-01-11/ - 2027-01-12: Gospel already agreed before this fix, only the Epistle - diverged). + given civil day): the SAME Holy Family propers block immediately + above, its own next sentence, a named formula rather than a second + "repeat the Sunday" instruction: "post eandem dominicam vero Missa + de eadem dominica In excelso throno, ut infra... Haec Missa dicenda + est diebus ferialibus huius hebdomadae" (scan1.txt:6758-6851; + scan2.txt:7415-7434 corroborates "In excelso throno... ut infra", + OCR-garbled elsewhere in the same passage, reading not in doubt), + the formula's own heading "MISSA DOMINICAE PRIMAE post Epiphaniam" + immediately below -- Epistle "Lectio Epistolae beati Pauli Apostoli + ad Romanos. Rom. 12, 1-5" (scan1.txt:6875-6877), Gospel the SAME + pericope as Holy Family's own Sunday Mass, Luke 2:42-52 (printed out + in full immediately below the Epistle, scan1.txt:6885-6905) -- a + DIFFERENT Epistle from Holy Family Sunday's own (Col 3:12-17), but + the SAME Gospel, exactly as missalemeum's own fixture rows show + (2026-01-12/2027-01-11/2027-01-12: Gospel already agreed before this + fix, only the Epistle diverged). - 13 January's OWN separate case, checked and found to need NO entry here: when Holy Family does not fall there, 13 January carries a II-class sanctoral commemoration of its own ("Commemoration of the @@ -544,14 +568,19 @@ let holy_name_entries = this ranking whenever the day's own office would otherwise be a plain Class4 feria, checked in {!Rite_ef.Temporal_ef}'s own [bvm_saturday_names] comment and confirmed against the real resolver here, not assumed). - This window's own five otherwise-unoccupied Saturdays inside these - three families (2026-01-03, 2026-01-10, 2027-01-09; 2026-01-17 and - 2027-01-16 are won outright by a saint instead, Anthony and Marcellus I - respectively, whose own citations are unaffected either way) genuinely - ARE the BVM Office, missalemeum's own title confirming it on every one - that reaches the office at all ("II Mass of the B. V. M. -- Vultum - Tuum", never "Feria") -- so none of the three "repeat X" rubrics above - ever actually apply on a Saturday. The three [-saturday] slugs are + This window's own SIX otherwise-unoccupied Saturdays inside these + three families (2026-01-03, 2026-01-10, 2027-01-02, 2027-01-09; + 2026-01-17 and 2027-01-16 are won outright by a saint instead, Anthony + and Marcellus I respectively, whose own citations are unaffected + either way) genuinely ARE the BVM Office, missalemeum's own title + confirming it on every one that reaches the office at all ("II Mass of + the B. V. M. -- Vultum Tuum", never "Feria") -- so none of the three + "repeat X" rubrics above ever actually apply on a Saturday. (CORRECTED, + fix round 1, coordinator review: this comment previously counted only + five, omitting 2027-01-02 -- `ef-christmas-2-saturday`, the same shape + as 2026-01-10 -- from its own list; no consequence for the code, which + already excludes every [-saturday] slug in all three families + unconditionally, not by enumerating dates.) The three [-saturday] slugs are DELIBERATELY left unentered, all three: the BVM Saturday Office's own citation is a genuine, ALREADY-DOCUMENTED open item (register, Task 6's own residual concern 4, "the BVM Saturday Office still emits its diff --git a/tools/extract_missalemeum_oracle.py b/tools/extract_missalemeum_oracle.py index 4b010e2..1abc574 100644 --- a/tools/extract_missalemeum_oracle.py +++ b/tools/extract_missalemeum_oracle.py @@ -57,11 +57,20 @@ # under 40 characters that contains a chapter:verse-shaped digit pair # (`\d+\s*[:,.]\s*\d+`, matching all three separators actually used in # this source -- "Titus 2:11-15", "4 Kings, 5:1-15", "John 20. 19-31"). -# Verified exhaustively over the whole fixture (all 1 458 Lectio/ -# Evangelium sections across the 728 days that carry one): exactly one -# candidate per section, zero ambiguous, zero false positives from a -# longer rubric sentence. TWO days (Good Friday, both years -- the "Missa -# Praesanctificatorum" liturgy) have no "Lectio"/"Evangelium" section at +# Verified exhaustively over the whole fixture (all 1 456 Lectio/ +# Evangelium sections, 728 days x 2) -- CORRECTED, fix round 1 +# (coordinator review): this used to claim +# "exactly one candidate per section, zero ambiguous". WRONG: 2 of the +# 1 456 sections (Holy Saturday's own "Lectio", both years) yield TWO +# candidates, ['Col 3:1-4', 'Ps 117, 1'] -- the second is the Tractus +# verse that follows the real Epistle citation in the same paragraph, +# also matching the verse-shaped regex. The fixture is still correct on +# both rows (Col 3:1-4 IS the real citation) because [extract_citation] +# below returns candidates[0] and the real citation happens to come +# FIRST in the text -- correctness here rests on ORDERING, not +# uniqueness, and this header previously overclaimed the latter. TWO +# days (Good Friday, both years -- the "Missa Praesanctificatorum" +# liturgy) have no "Lectio"/"Evangelium" section at # all (a multi-lesson structure instead, "Lectiones"/"Passio", with no # single reading occupying the Epistle/Gospel slot this schema assumes, # the SAME shape colitur's own test_lectionary.ml records for its own -- cgit v1.3