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_rite_ef.ml | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) (limited to 'test/test_rite_ef.ml') diff --git a/test/test_rite_ef.ml b/test/test_rite_ef.ml index 6cd8709..9b0cb4f 100644 --- a/test/test_rite_ef.ml +++ b/test/test_rite_ef.ml @@ -166,6 +166,88 @@ let test_eusebius_confessor_colour_corrected () = true (e.Layer.cel.Cel.colour = Colour.White) +(* ef-sanctoral-audit task (2026-08-14): a full extraction of the primary + CALENDARIUM (both photographic scans, page images read directly, not + their OCR text layers) against all 327 base entries plus the two prior + overlay Adds -- data/ef/adjustments.sexp's own audit-block comment has + the full method and RG 124 citation; docs/research/rules-register.md's + audit rewrite and .superpowers/sdd/2026-08-12-colitur-rg16a/sanctoral- + audit-report.md have the full findings. Same discipline as + [test_eusebius_confessor_colour_corrected] above (its own predecessor, + same root cause): a typo'd slug or a reverted directive fails THIS test, + not only silently changes unread data. One table, all fourteen [Feast] + colour corrections plus the eight [Commemoration_only] ones (inert to + [Precedence_ef.band]/[admit] today -- colour is read nowhere in either, + confirmed by grep -- but real for `colitur day`'s own printed output the + moment either entry is ever observed/commemorated). *) +let test_audit_colours_corrected () = + let layer = real_layer () in + let check_colour slug expected reason = + match Layer.find layer (Slug.of_string_exn slug) with + | None -> Alcotest.failf "slug %s not found in the overlaid layer" slug + | Some e -> + Alcotest.(check bool) (Printf.sprintf "%s: %s" slug reason) true (e.Layer.cel.Cel.colour = expected) + in + (* RG 124(e): a Martyr's own martyrdom is red -- these seven were White. *) + List.iter + (fun (slug, reason) -> check_colour slug Colour.Red reason) + [ ("prisca", "Virg. et Mart., 18 Jan -- RG124(e)"); + ("conversion-of-st-paul", "an Apostle's own feast day, 25 Jan -- RG124(b)"); + ("peter", "Apostle commemoration, 25 Jan -- by consistency, see adjustments.sexp"); + ("chair-of-st-peter", "an Apostle's own feast day, 22 Feb -- RG124(b)"); + ("vitus", "Ss. ... Mm., 15 Jun -- RG124(e)"); + ("margaret", "Virg. et Mart., 20 Jul (comm) -- RG124(e)"); + ("apollinaris", "Ep. et Mart., 23 Jul -- RG124(e)"); + ("agapitus", "Mart., 18 Aug -- RG124(e)"); + ("josaphat", "Ep. et Mart., 14 Nov -- RG124(e)") ]; + (* RG 117's five-colour residual: a plain Confessor/Bishop/Virgin (no + "Mart."/"Mm." in the calendarium's own line, not an Apostle) is white + -- these were Red. *) + List.iter + (fun (slug, reason) -> check_colour slug Colour.White reason) + [ ("john-of-san-fecundo", "Conf. only, 12 Jun"); + ("ephrem-of-syria", "Conf. et Eccl. Doct. only, 18 Jun"); + ("julia-of-falconieri", "Virg. only, 19 Jun"); + ("john-gualbert", "Abb. (Conf.) only, 12 Jul"); + ("camillus-de-lellis", "Conf. only, 18 Jul"); + ("jerome-emiliani", "Conf. only, 20 Jul"); + ("liborii", "Ep. et Conf. only, 23 Jul (comm)"); + ("martha", "Virg. only, 29 Jul"); + ("alphonsus-liguori", "Ep., Conf. et Eccl. Doct. only, 2 Aug"); + ("augustine", "Ep., Conf. et Eccl. Doct. only, 28 Aug"); + ("rose-of-lima", "Virg. only, 30 Aug"); + ("mark-i", "Papae et Conf. only (Pope Mark I, not the Evangelist), 7 Oct (comm)") ] + +(* `barbara` (4 December): a genuine DATA GAP, not a colour correction -- + present in both photographic scans as a Commemoratio nested under + Peter Chrysologus's own entry, absent from data/ef/sanctoral.sexp AND + from lectio's own tridentine-calendar.ini (same upstream-gap shape as + the ef-rebootstrap task's five: agnes-secundo/boniface-martyr/ + eusebius-confessor/evaristus/theodore). Added via data/ef/ + adjustments.sexp's own new `Add` directive. *) +let test_barbara_added () = + let layer = real_layer () in + match Layer.find layer (Slug.of_string_exn "barbara") with + | None -> Alcotest.fail "slug barbara not found in the overlaid layer (ef-sanctoral-audit Add missing?)" + | Some e -> + Alcotest.(check bool) "barbara: 4 December" true + (match e.Layer.date with Date_spec.Fixed { month = 12; day = 4 } -> true | Date_spec.Fixed _ -> false); + Alcotest.(check bool) "barbara: Commemoration_only (no separate feast row in the calendarium, a bare \ + \"Commemoratio\" nested under Peter Chrysologus)" + true (e.Layer.cel.Cel.status = Cel.Commemoration_only); + Alcotest.(check bool) "barbara: Class3 (the same bootstrap-inference convention every OTHER \ + Commemoration_only entry in this file uses -- the calendarium gives no numeral \ + for any commemoration, hers included)" + true (e.Layer.cel.Cel.rank = V.Class3); + Alcotest.(check bool) "barbara: Red (RG124(e), \"Virg. et Mart.\")" true + (e.Layer.cel.Cel.colour = Colour.Red); + Alcotest.(check bool) "barbara: appears as a commemoration on 4 December in real output" true + (let days = Cal.year Rite_ef.context layer 2026 in + Array.to_list days + |> List.exists (fun d -> + Date.compare d.LD.date (mk 2026 12 4) = 0 + && List.exists (fun (c, _) -> slug_of c = "barbara") d.LD.commemorations)) + (* Coordinator review, finding 2, reproduced through the project's OWN extension path (an overlay), the same way the reviewer found it: adding an I-class feast on 25 December (competing against, and losing to, the @@ -422,6 +504,10 @@ let suite = `Quick test_rg16a_subject_retag_in_effect; Alcotest.test_case "ef-rebootstrap fix round 1 (F3): eusebius-confessor is White, not lectio's Red" `Quick test_eusebius_confessor_colour_corrected; + Alcotest.test_case "ef-sanctoral-audit: 21 audit colour corrections are in effect (RG124)" `Quick + test_audit_colours_corrected; + Alcotest.test_case "ef-sanctoral-audit: barbara (4 Dec) added, a genuine data gap" `Quick + test_barbara_added; Alcotest.test_case "RG96 search does not raise at the domain ceiling (real data)" `Quick test_transfer_search_does_not_raise_at_domain_ceiling; Alcotest.test_case "no transfer ever lands inside [Easter, Easter+7], 2005-2050" `Quick -- cgit v1.3