From cb200a3f95e24f67c1d08b2ceb09404bf57a1636 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 12 Aug 2026 04:36:36 +0200 Subject: test: oracle vs missalemeum 2026-2027; audit the sanctoral Validation layer 4: an oracle harness against missalemeum (Divinum Officium data), independent of the lectio bootstrap chain colitur's own sanctoral data comes from -- the only layer that can catch an error inherited from that bootstrap, and the only one that can validate commemorations at all (the lectio differential explicitly excludes them, per its own header comment). tools/extract_missalemeum_oracle.py shapes the fixture from lectio's sources/snapshot.tar.gz outside the test (no JSON library in this project's frozen deps, same reasoning test_differential.ml's own fixture already documents). test/fixtures/missalemeum-ef-2026-2027 .txt (730 days, SHA-256 pinned and asserted) + its own .provenance note record exactly how to regenerate it. test_oracle.ml compares three axes the oracle actually supports: rank, colour (SET MEMBERSHIP -- 14 of 730 days carry two colours, e.g. rose+violet on Gaudete/Laetare, which independently vindicates this project's own rose reading against lectio's violet-only one, recorded in the register), and commemoration presence/count. Slug identity is deliberately out of scope (needs a title->slug mapping, the data audit's own business, not the automated comparator's). Of 730 days, 688 matched cleanly outright. The remaining 42 are all named in data/ef/expected-divergences-missalemeum.sexp (14 cited entries, M1-M14): most are genuine primary-source-confirmed findings this task adjudicated and fixed in the two preceding commits (RG 33, RG 109/111, Holy Thursday's colour); the rest are real, cited, deferred feature/data gaps (RG 91 entry 27's BVM-Saturday office, RG 110's inseparable Peter/Paul commemoration, four sanctoral entries missing from lectio's own source) or genuine oracle-side artifacts -- honestly verdicted against whichever side this task's own primary-source research actually backs, never defaulted to colitur. One entry (M13, St Joseph vs the Friday of Passion Week 2027) is verdict open: adjudicated as unresolved after real search effort, not guessed past. The data audit: every sanctoral entry the comparison flagged was hand-checked against the 1962 calendarium, plus a 20-entry deterministic random control sample (seed 20260812) drawn independently of the flagged set. The control sample caught two entries (benedict, frances-rome) marked Commemoration_only in the bootstrapped data when the primary calendarium lists them as plain III-class feasts with their own Office -- traced to lectio's own source, not fixable here, and reported as a signal (10% of a random sample) rather than a blanket claim. Coverage recorded honestly in docs/research/rules-register.md's own three buckets: confirmed by oracle (200/322), confirmed by hand (23/322, 2 of them wrong), unverified (115/322) -- the unverified bucket stated explicitly rather than left implicit. Harness teeth demonstrated and reverted (not committed): a fixture rank/colour edit on a previously-clean day fails both the checksum pin and the no-unexplained-differences assertion independently; an expected_rows drift on the allow-list fails the citation-count assertion. Both captured with their exact failure messages, both reverted before this commit. --- data/ef/expected-divergences-missalemeum.sexp | 102 ++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 data/ef/expected-divergences-missalemeum.sexp (limited to 'data') diff --git a/data/ef/expected-divergences-missalemeum.sexp b/data/ef/expected-divergences-missalemeum.sexp new file mode 100644 index 0000000..f4cfbce --- /dev/null +++ b/data/ef/expected-divergences-missalemeum.sexp @@ -0,0 +1,102 @@ +; data/ef/expected-divergences-missalemeum.sexp -- Task 16's cited allow-list +; for colitur's oracle harness against missalemeum (test/test_oracle.ml), +; 2026-2027. A SEPARATE file from data/ef/expected-divergences.sexp (the +; lectio allow-list, Task 15): the two oracles disagree with colitur in +; different places and for different reasons, so the two lists are kept +; apart rather than merged into one with two provenances tangled together. +; +; [verdict] names which side this task's own primary-source research backs +; -- NOT always "colitur", unlike the lectio file's own convention (that +; file's header: "every entry here is colitur"). Some of these entries are +; genuine DATA GAPS this task found and could not fix here (the sanctoral +; data is bootstrapped from lectio, which is itself missing several of +; these entries -- CLAUDE.md's binding decision 3, and this task does not +; touch ~/git/projects/lectio) or genuine CODE gaps (RG 91 entry 27's BVM- +; Saturday office, RG 110's inseparable Peter/Paul commemoration) this task +; did not build. Those are honestly verdicted [missalemeum] -- colitur is +; short a feature or a row, not correct -- and each is cross-referenced +; into docs/research/rules-register.md §6 as an open item, not silently +; absorbed as if colitur were right. One entry (M13) is [verdict open]: +; adjudicated as UNRESOLVED after real primary-source effort, not defaulted +; past -- see that entry's own note and the task report for the full +; search. +; +; [expected_rows] is the exact row count this entry accounts for over the +; fixture's 2026-2027 span: a REGRESSION PIN, not documentation -- +; test_oracle.ml asserts actual counts equal these exactly, so an unnoticed +; behaviour change here fails loudly instead of silently changing what the +; harness accepts. +; +; 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). +((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) + (note "missalemeum does not implement RG 33's Sunday-omission for II/III-class vigils. 28 June 2026 (Vigil of Sts Peter & Paul, II class): still shown as a commemoration on the V Sunday after Pentecost. 9 August 2026 (Vigil of St Lawrence, III class): shown as the day's FULL OBSERVED OFFICE, displacing the XI Sunday after Pentecost entirely, not merely surviving as a commemoration.") + (expected_rows 2)) + ((id M2) + (citation "RG 91 entry 27 (\"Officium sanctae Mariae in sabbato\") -- register §4") + (verdict missalemeum) + (note "Every otherwise-unoccupied IV-class Saturday should carry the votive Office of the BVM (white; missalemeum's own titles cycle \"I\"..\"V Mass of the B. V. M. -- Salve, Sancta Parens\"). temporal_ef.ml's [band] already has an entry-27 comment acknowledging this row exists, but [Temporal_ef.temporal] never actually CONSTRUCTS this office -- an unimpeded Time-after-Epiphany/-Pentecost Saturday gets a bare ferial slug and season green instead. A genuine feature gap, not a citation dispute; tracked in register §6, not built in this task.") + (expected_rows 17)) + ((id M3) + (citation "RG 87 (Minor Litanies/Rogations, Mon/Tue before Ascension) -- the SAME citation as the lectio allow-list's own C8 (data/ef/expected-divergences.sexp)") + (verdict colitur) + (note "missalemeum, like lectio, computes no Rogation day at all and shows the plain paschaltide-week feria instead. Only 3 May 2027 (Rogation Monday) shows it in this window -- every other Rogation day here is won outright by a saint on both sides, so only the underlying temporal identity differs, which this comparator's axes do not expose.") + (expected_rows 1)) + ((id M4) + (citation "1962 calendarium (missale-romanum-1962.pdf), 28 January row: \"S. Petri Nolasci Conf., III classis. / Com. S. Agnetis Virg. et Mart., secundo.\" -- primary-source-verified 2026-08-12") + (verdict missalemeum) + (note "A second commemoration of St Agnes (secundo, distinct from her main 21 January feast) is missing from data/ef/sanctoral.sexp. Traced upstream: lectio's own tridentine-calendar.ini has no 01-28 entry beyond [peter-nolasco] either -- a bootstrap-source gap, not a bootstrap-tool bug. Cannot be fixed without touching lectio (out of this task's reach); register §6 open item.") + (expected_rows 2)) + ((id M5) + (citation "RG 80 (Major Litanies, 25 April) -- register §6's own pre-existing open item, \"Major Litanies (25 April, RG 80) are not computed\"") + (verdict missalemeum) + (note "Independently confirmed by the oracle, not a new finding: missalemeum's \"Pro rogationibus\" commemoration on St Mark's day (25 April, the Major Litanies' fixed date) is exactly the missing office register §6 already tracks. Only 2026 shows as a comparator MISMATCH: 25 April 2026 is a Saturday with Mark winning outright, so colitur's commemoration list is empty where the oracle's carries \"Pro rogationibus\" -- a real presence gap. 25 April 2027 is a Sunday: the Sunday wins on BOTH sides, and each side's own single commemoration slot goes to a DIFFERENT candidate (colitur: St Mark himself, an ordinary II-class sanctoral loser admitted under RG111(b)'s \"de festo II classis\" slot; missalemeum: the Major Litanies) -- both non-empty, same count, so this comparator's count-only axis (deliberately not slug-identity, see test_oracle.ml's own header) cannot see that mismatch; the underlying gap is the same, just invisible to this year's row.") + (expected_rows 1)) + ((id M6) + (citation "1962 calendarium, 14 August row: \"Vigilia, II classis.\" -- nothing else listed -- primary-source-verified 2026-08-12") + (verdict colitur) + (note "The reverse of M4/M7/M9: no commemoration is listed for 14 August anywhere in the primary source this project treats as authoritative. data/ef/sanctoral.sexp agrees (a single entry, vigil-of-the-assumption). missalemeum's \"St. Eusebius\" for this date has no support found here -- a DIFFERENT St Eusebius (bishop and martyr) is genuinely commemorated 16 December, matching lectio's own [eusebius] entry at THAT date, not this one.") + (expected_rows 2)) + ((id M7) + (citation "1962 calendarium, 26 October row: \"Com. S. Evaristi Papæ et Mart.\" -- primary-source-verified 2026-08-12") + (verdict missalemeum) + (note "A genuine data gap, the same shape as M4: absent from data/ef/sanctoral.sexp and from lectio's own tridentine-calendar.ini (no 10-26 entry at all). Register §6 open item.") + (expected_rows 2)) + ((id M8) + (citation "RG 109(a) (\"of a Sunday\" is always privileged) + RG 111(a) (\"I class: none save one privileged\")") + (verdict colitur) + (note "When a fixed I-class feast (All Saints 1 Nov; the Assumption 15 Aug) lands on an ordinary Sunday, the impeded Sunday IS the one privileged commemoration RG 111(a) admits -- already an established, independently-tested rule (test_precedence_ef.ml's RG95/RG109(a) row). missalemeum shows no commemoration at all on either occurrence in this window.") + (expected_rows 2)) + ((id M9) + (citation "1962 calendarium, 9 November row: \"IN DEDICATIONE ARCHIBASILICÆ SANCTISSIMI SALVATORIS, II classis. / Com. S. Theodori Mart.\" -- primary-source-verified 2026-08-12") + (verdict missalemeum) + (note "A genuine data gap, the same shape as M4/M7: absent from data/ef/sanctoral.sexp and from lectio's own 11-09 entry (dedication-of-the-archbasilica-of-our-holy-savior alone). Register §6 open item.") + (expected_rows 2)) + ((id M10) + (citation "RG 109(e), unqualified text: \"de feriis Adventus, Quadragesimae et Passionis\" -- of the FERIAS of Advent (not \"the Advent ferias 17-23 December only\", which is RG 91 entry 18's separate OCCURRENCE-table dignity, not a RG 109 privilege restriction)") + (verdict colitur) + (note "colitur commemorates the losing early-Advent feria (Monday after Advent I, 30 Nov; Tuesday/Wednesday after Advent II, 8 Dec) when a saint wins. missalemeum shows nothing on these 4 rows specifically, even though it DOES show equivalent later-Advent-feria commemorations elsewhere in the SAME window (2-21 December, matching colitur exactly there) -- read as a missalemeum-side inconsistency on these particular rows, not a textually narrower rule.") + (expected_rows 4)) + ((id M11) + (citation "No RG paragraph found to support this (see the note) -- not a citation, a documented absence of one") + (verdict colitur) + (note "missalemeum's own \"For Octave of the Nativity\" commemoration/displaced entry on 26, 27(2027)/28 December carries info.rank 4 in the raw JSON (checked directly) -- a generic, low-dignity placeholder its own data model seems to attach to every day within the Nativity Octave, distinct from RG 91 entry 17's real \"days within the Octave\" office (which colitur already models correctly, but only for 29-31 December -- 26-28 are the NAMED feasts Stephen/John/the Innocents themselves, sanctoral, temporal_ef.ml's own comment on [named]). Read as missalemeum's own bookkeeping artifact; the primary-source search for this specific point was not exhaustive, so flagged as an open item rather than confidently dismissed.") + (expected_rows 4)) + ((id M12) + (citation "RG 110: \"In Officio et Missa S. Petri semper fit commemoratio S. Pauli, et vicissim\" -- in the Office and Mass of either Peter or Paul, a commemoration of the other is ALWAYS made (\"the inseparable commemoration\"), uncapped by RG 111's ordinary admission count") + (verdict missalemeum) + (note "Unimplemented in this codebase. 22 February 2027 (Chair of St Peter): colitur commemorates only the privileged Lent feria; missalemeum shows that AND \"St. Paul\". A genuine, primary-cited feature gap -- register §6 open item. Narrow: the only row in this window where it becomes visible against this comparator's axes (see the task report for the other Peter/Paul offices checked and found clean).") + (expected_rows 1)) + ((id M14) + (citation "1962 calendarium, 14 May row: \"Com. S. Bonifatii Mart.\" -- primary-source-verified 2026-08-12") + (verdict missalemeum) + (note "A genuine data gap, the same shape as M4/M7/M9: a commemoration-only St Boniface, Martyr (DIFFERENT from the II-class St Boniface, Bishop and Martyr, of 5 June, which data/ef/sanctoral.sexp already carries correctly) is absent from data/ef/sanctoral.sexp and from lectio's own tridentine-calendar.ini for 05-14 (no entry at all). Only visible in 2027 -- in 2026, 14 May is Ascension Thursday (I class), which correctly admits no ordinary commemoration on either side (RG 111(a)), so Boniface is (correctly) absent from BOTH streams that year. Register §6 open item.") + (expected_rows 1)) + ((id M13) + (citation "OPEN -- not adjudicated. 1962 calendarium's March table: \"Feria VI post dominicam I Passionis: Commemoratio septem Dolorum B. Mariæ Virg.\" (confirmed real, every year) -- but RG 91's plain table (entry 11-13, Joseph, I class, vs entry 22, an ordinary III-class Passiontide feria) gives Joseph the day outright, with no RG 96 collision requiring a transfer, so the primary text found here does not by itself explain missalemeum's result") + (verdict open) + (note "19 March 2027: St Joseph (I class) falls on the Friday of Passion Week. missalemeum shows Joseph entirely displaced, with the Friday's own III-class violet office observed and the Seven Sorrows commemorated instead. Three possibilities, none confirmed: (a) colitur's plain RG 91 reading is right and missalemeum is wrong; (b) a more specific rubric attached to St Joseph's own Proprium Sanctorum entry (the same shape as the Annunciation's own Attamen clause) overrides the general table for this exact collision, and this task did not find its text; (c) the Seven Sorrows commemoration itself outranks an ordinary I-class feast on this one Friday, unsupported by anything found here either. Extensive but non-exhaustive primary-source search did not settle it -- register §6 open item, explicitly unresolved rather than defaulted to either side. Separately, but confirmed regardless: colitur does not implement the Seven-Sorrows-of-Passion-Friday commemoration at all, in any year -- a real, primary-attested gap on its own.") + (expected_rows 1)) -- cgit v1.3