From 60db67eb2246d748d1e8e55047cef7d3d7843c4e Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 18 Aug 2026 17:13:03 +0200 Subject: test(differential): C20 and C38 closed -- agreement 98.4% lectio carries the readings of the nine Common-routed saints and of three more that had proper Masses but no reading at all. Every day of 2005-2050 now resolves a reading there; four days used to come back empty. C38's own note said it could not close without lectio gaining a Commons concept. The readings arrived instead of the abstraction, which was enough: each Common resolves to one first/gospel pair for the saint that names it, so a table plus assignment layer would have bought indirection and nothing else. C20 14 -> 0 C38 70 -> 0 7 classes -> 5, 351 rows -> 267, agreement 97.9% -> 98.4%. --- test/test_differential.ml | 55 +---------------------------------------------- 1 file changed, 1 insertion(+), 54 deletions(-) (limited to 'test/test_differential.ml') diff --git a/test/test_differential.ml b/test/test_differential.ml index 49d0395..bd03969 100644 --- a/test/test_differential.ml +++ b/test/test_differential.ml @@ -164,7 +164,7 @@ let allow_list_path = "../data/ef/expected-divergences.sexp" deliberately, after re-running the exact command the provenance note names -- never by copying the actual value back in to make a mismatch pass, which would defeat the point of pinning it at all. *) -let fixture_sha256 = "d42d53f5b73bd7cf0129f5f839c7d7d87955256a2c2061afd085d8747de290d6" +let fixture_sha256 = "8299ccd495301eb98f6ba07a0a2f39ec7bbf063cbefa17cedbb840f903f04f36" (* Same technique tools/bootstrap_sanctoral.ml already uses for this exact purpose (that file's own comment: shelling out to the system's @@ -1157,54 +1157,6 @@ let layer_c_reason (l : row) (c : row) diffs = && subset diffs [ Season; Slug_f; First_f; Gospel_f ] && String.equal c.slug "ef-time-after-epiphany-sunday-1" then Some "C15" - else if - 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 [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 - this generator translated -- but on the 7 years where 1 January - ITSELF is a Sunday, lectio's own fallback instead finds the - Circumcision's own real Mass (Titus 2:11-15/Luke 2:21), a genuine - divergence from colitur's RG 17(a) office, which reads the SAME - Mass on 2 January regardless of what happened the day before. Both - shapes are the identical underlying cause (colitur builds RG 17(a); - lectio has no equivalent office at all), so both belong to this one - id, not a split entry. *) - && subset diffs [ Slug_f; Rank; First_f; Gospel_f ] - && String.equal c.slug "ef-holy-name" - then Some "C16" - else if - (* C29 -- Task 9: the Holy-Name-SUNDAY shape (RG 17(a)'s own primary - Sunday case, distinct from C16's fallback above) -- Season/Slug_f - already agree (Layer A already normalises lectio's own - "ef-christmas-sunday-0" for this civil date onto colitur's - "ef-holy-name-sunday", the SAME alias this generator's OWN - [colitur_keys] used to (wrongly) borrow a citation through -- - Layer A's alias and the generator's OLD citation-sourcing bug were - two separate uses of the same underlying fact, only one of which - was ever wrong), so only the citation itself is new. *) - diffs = [ First_f; Gospel_f ] && String.equal c.slug holy_name_sunday_slug - then Some "C29" - else if - (* 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" (* [Colour_f] is admitted only on the Saturday of this week, and only alongside the citation difference: that day is ALSO an unoccupied IV-class Saturday, so RG 78's votive Office of the BVM makes colitur @@ -1237,16 +1189,11 @@ let layer_c_reason (l : row) (c : row) diffs = then Some "C31" else if is_bvm_saturday_row c diffs then Some "C17" else if diffs = [ Colour_f ] && List.mem c.slug audit_colour_corrected_slugs then Some "C18" - else if - diffs = [ First_f; Gospel_f ] && String.equal l.first "-" && String.equal l.gospel "-" - && List.mem c.slug lectio_no_reading_slugs - then Some "C20" (* C25 -- CLOSED, BVM Saturday Mass (2026-08-17), predicate removed: 0 rows. Its days are unoccupied IV-class Saturdays, so they carry RG 78's office and now RG 309(a)'s Mass for it, which answers before step 3's walkback is reached. They still differ from lectio, but for C17's cause, and are filed there. See data/ef/expected-divergences.sexp's own closure note. *) - else if List.mem c.slug promoted_feast_slugs && diffs = [ First_f; Gospel_f ] then Some "C38" else None (* ---------------------------------------------------------------------- *) -- cgit v1.3