From bf326ab963f46c42dc1a3b5141f2022bed81756d Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 14 Aug 2026 12:00:24 +0200 Subject: data(ef): sanctoral audit — one genuine gap, 21 wrong colours (RG124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full re-extraction of the primary CALENDARIUM (both photographic scans, missale-romanum-1962.pdf and Missale Romanum 1962_text.pdf, rendered page images read directly rather than trusting either PDF's own OCR text layer) against all 327 base sanctoral entries plus the two prior overlay Adds. Both scans agree throughout; no OCR ambiguity required adjudication this round. Add `barbara` (4 December): both scans carry a Commemoratio nested under Peter Chrysologus's own entry, absent from data/ef/sanctoral.sexp AND from lectio's own tridentine-calendar.ini (confirmed directly) — the same upstream-gap shape as the five entries the ef-rebootstrap task already added (agnes-secundo/boniface-martyr/eusebius-confessor/evaristus/ theodore). Correct 21 sanctoral colours against RG 124 ("De coloribus paramentorum"), scan-verified word for word: 124(b) red for an Apostle/Evangelist's own feast day except John's (27 December, already correct); 124(e) red for a Martyr's own martyrdom; RG 117's five-colour residual otherwise white. Every one of the 21 is a confirmed lectio/missalemeum bootstrap defect — checked individually against lectio's own ini, several of whose Polish name fields already contradict that same record's own colour tag (e.g. `martha`: "Dziewicy", Virgin, no "Męczennicy", yet `colour = red`) — the identical root cause and mechanism the `eusebius-confessor` fix already established. Colour is confirmed read nowhere in Precedence_ef's resolution logic (grep), so these are output-correctness fixes with zero observed-office blast radius; three (apollinaris/josaphat/chair-of-st- peter) additionally disagree with missalemeum's own oracle, not only with lectio, so they are adjudicated from RG 124's text directly rather than by which engine happens to agree. Both corrections applied via data/ef/adjustments.sexp's established Overlay mechanism (data/ef/sanctoral.sexp stays generated, untouched). Pinned: test_rite_ef.ml (two new tests, verified to fail against the pre-fix data); test_differential.ml's new C18 predicate (526 rows, 2005-2050) and test_oracle.ml's new M21/M22 predicates (20 + 2 rows, 2026-2027), each with data/ef/expected-divergences{,-missalemeum}.sexp entries citing RG124 or the matching upstream-gap precedent; test_golden.ml's 1902-02-22 pin corrected (chair-of-st-peter was white in the stale pin, RG124(b) makes it red). All 329 tests green, including the full 1583-9999 exhaustive sweep. Full method, per-entry adjudication table and corrected bucket counts: docs/research/rules-register.md (gitignored) and .superpowers/sdd/2026-08-12-colitur-rg16a/sanctoral-audit-report.md (gitignored). --- test/test_oracle.ml | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'test/test_oracle.ml') diff --git a/test/test_oracle.ml b/test/test_oracle.ml index 3a9e499..cd980aa 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -910,6 +910,52 @@ let m19_commemoration_matches (c : colitur_row) = | [ (slug, _, _, _) ] -> String.equal slug "commemoration-of-st-peter" | _ -> false +(* M21 -- ef-sanctoral-audit task (2026-08-14): the SAME closed 14-slug list + test_differential.ml's own [audit_colour_corrected_slugs] uses (RG 124, + data/ef/adjustments.sexp's own audit-block comment has the full + citation), now checked against THIS window's own oracle. Two of the + fourteen (`apollinaris`, 23 July; `josaphat`, 14 November) and one + further entry not on the Feast-status list at all (`chair-of-st-peter`, + 22 February, a Feast in its own right, RG124(b)) disagree with + missalemeum's own colour TOO, not merely lectio's -- a SECOND, + independent data source repeating the same defect (Apollinaris and + Josaphat are each martyr-bishops, RG 124(e); Peter's Chair is an + Apostle's own feast day, RG 124(b) -- both scan-verified word for word, + data/ef/adjustments.sexp's own comment), so this is not a case of + "missalemeum corroborates colitur, only lectio disagrees": the primary + TEXT is what decides it, and missalemeum is simply wrong on these three + the same way lectio is on all fourteen. [Comm_identity_unresolved] is + allowed alongside on 22 February specifically: that date's OTHER + commemoration (the ordinary Lenten feria RG 110 rides in alongside Paul) + is TEMPORAL-origin and already unresolved for identity, the same + pre-existing gap [M15]/[M18] elsewhere in this file document -- a + different axis, not something this entry's own citation explains, so it + is admitted by the subset check rather than folded into the citation. *) +let m21_colour_slugs = + [ "conversion-of-st-paul"; "chair-of-st-peter"; "john-of-san-fecundo"; "ephrem-of-syria"; + "julia-of-falconieri"; "john-gualbert"; "camillus-de-lellis"; "jerome-emiliani"; "apollinaris"; + "martha"; "alphonsus-liguori"; "augustine"; "rose-of-lima"; "josaphat" ] + +(* M22 -- ef-sanctoral-audit task: `barbara` (4 December, data/ef/ + adjustments.sexp's own new `Add`) is a genuine DATA GAP in missalemeum + too, the identical shape M1/M3/M8/M10/M19 above already document (each + "missalemeum does not implement X"): both years' own 4 December row + shows only the Advent feria's own temporal commemoration, no Barbara at + all, not even displaced -- missalemeum never constructed a candidate for + her either, the same absence lectio's own tridentine-calendar.ini has + (data/ef/adjustments.sexp's own `Add barbara` comment). Identity-gated + the same way [M19] is (coordinator finding F2): the predicate requires + colitur's own admitted set to be EXACTLY the temporal feria plus + `barbara`, not merely that SOME count diff exists on this date, so a + future unrelated regression on 4 December cannot silently hide behind + this citation. *) +let m22_dates = [ "2026-12-04"; "2027-12-04" ] + +let m22_commemoration_matches (c : colitur_row) = + match List.map (fun (slug, _, _, _) -> slug) c.c_commemorations with + | [ a; b ] -> (String.equal a "barbara") <> (String.equal b "barbara") + | _ -> false + (* [_o] (the oracle's own row) is unused now that M2 -- its one reader, via [o.o_title] -- is closed/removed (see the comment above [m1_dates]): every remaining predicate below reads only [c]/[diffs]. Kept as a named, @@ -964,6 +1010,11 @@ let layer_m_reason (c : colitur_row) (_o : oracle_row) diffs = else if diffs = [ Observed_identity_unresolved ] then Some "M18" else if List.mem c.c_date m19_dates && diffs = [ Comm_presence ] && m19_commemoration_matches c then Some "M19" + else if + List.mem c.c_observed_slug m21_colour_slugs && subset diffs [ Colour_f; Comm_identity_unresolved ] + then Some "M21" + else if List.mem c.c_date m22_dates && diffs = [ Comm_count ] && m22_commemoration_matches c then + Some "M22" else if List.mem c.c_date m20_dates && subset diffs [ Comm_identity_mismatch; Observed_identity_unresolved ] -- cgit v1.3 From d0468f53820585e7b4e4bfeb9a4a18f672b821a5 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Fri, 14 Aug 2026 12:41:10 +0200 Subject: test,docs: tighten M21, and record what the bucket summary does not say M21 accepted `subset diffs [Colour_f; Comm_identity_unresolved]`, so a row with no colour diff at all could be absorbed under a colour citation. The unresolved allowance existed only for the 22 February rows the previous commit reverted; with those gone the predicate tightens to exact equality on Colour_f, matching C18's shape, and stays green. Records two things the audit's bucket summary did not carry. The effective dataset is 329, not 328: base 327 plus three overlay Adds minus one Suppress, so commemoration-of-st-peter and major-litanies fall outside both buckets despite being in the stated scope, and a suppressed entry is counted as verified. And the summary says colour was "independently checked against RG 124" for every entry where much of it is inferred from the saint's category rather than read -- the per-entry basis column makes that distinction and the summary line erases it. Also records that "zero blast radius" holds only for the observed office: 49766 commemoration-colour changes on 8 slugs are real data changes, invisible because the CLI omits commemoration colour. --- test/test_oracle.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/test_oracle.ml') diff --git a/test/test_oracle.ml b/test/test_oracle.ml index cd980aa..c1d0e6a 100644 --- a/test/test_oracle.ml +++ b/test/test_oracle.ml @@ -1011,7 +1011,7 @@ let layer_m_reason (c : colitur_row) (_o : oracle_row) diffs = else if List.mem c.c_date m19_dates && diffs = [ Comm_presence ] && m19_commemoration_matches c then Some "M19" else if - List.mem c.c_observed_slug m21_colour_slugs && subset diffs [ Colour_f; Comm_identity_unresolved ] + List.mem c.c_observed_slug m21_colour_slugs && diffs = [ Colour_f ] then Some "M21" else if List.mem c.c_date m22_dates && diffs = [ Comm_count ] && m22_commemoration_matches c then Some "M22" -- cgit v1.3